CodeData equ include thkframe.inc include thkrp.inc include cbcheck.inc include public.inc include cbcid.inc include dlgcbid.inc externDef FreeCallback:far16 externDef AllocCallback:far16 externDef ConvertDevModeHandleSL:far16 externDef ConvertDevNamesHandleSL:far16 externDef ConvertDevModeHandleLS:far16 externDef ConvertDevNamesHandleLS:far16 fLocalFlag equ fDlgLog16 ; note: following size should be the same as in thunkcom\pack.h OPENFILENAME16_SIZE EQU 72 OPENFILENAME32_SIZE EQU 76 ;4Ch CHOOSECOLOR16_SIZE EQU 32 CHOOSECOLOR32_SIZE EQU 36 ;24h CHOOSEFONT16_SIZE EQU 46 CHOOSEFONT32_SIZE EQU 60 ;3Ch PRINTDLG16_SIZE EQU 52 PRINTDLG32_SIZE EQU 66 ;42h LOGFONT16_SIZE EQU 50 OFN16_Flags_OFFSET EQU 48 ;30h CC16_rgbResult_OFFSET EQU 8 ;08h CF16_iPointSize_OFFSET EQU 12 ;0Ch CF16_Flags_OFFSET EQU 14 ;0Dh CF16_rgbColors_OFFSET EQU 18 ;12h CF16_nFontType_OFFSET EQU 40 ;28h PD16_hDevMode_OFFSET EQU 6 ;06h PD16_hDevNames_OFFSET EQU 8 ;08h OFN32_Flags_OFFSET EQU 52 ;34h OFN32_lpfnHook_OFFSET EQU 68 ;44h CC32_rgbResult_OFFSET EQU 12 ;0Ch CC32_Flags_OFFSET EQU 20 ;14h CC32_lpfnHook_OFFSET EQU 28 ;1Ch FR32_Flags_OFFSET EQU 12 ;0CH FR32_lpfnHook_OFFSET EQU 32 ;20h CF32_lpLogFont_OFFSET EQU 12 ;0Ch CF32_iPointSize_OFFSET EQU 16 ;10h CF32_Flags_OFFSET EQU 20 ;14h CF32_rgbColors_OFFSET EQU 24 ;18h CF32_lpfnHook_OFFSET EQU 32 ;20h CF32_nFontType_OFFSET EQU 48 ;30h PD32_Flags_OFFSET EQU 20 ;1Ch PD32_hDevMode_OFFSET EQU 8 ;08h PD32_hDevNames_OFFSET EQU 12 ;0Ch PD32_lpfnPrintHook_OFFSET EQU 42 ;2Ah PD32_lpfnSetupHook_OFFSET EQU 46 ;2Eh ;--------------------------------------------------------------------------- ; This macro does the work for GetOpenFilename() and GetSaveFilename(). ; The argument "Flags" is a dword ptr expression denoting a thunk-compiler ; temporary that holds the Flags field of the OPENFILENAME struct. ; ; Assumption: If the hInst field is a global handle, the Win32 wrapper ; guaratees it's a (zero-extended) Win16 handle. ;--------------------------------------------------------------------------- RAWPACK__THKGETOPENORSAVEFILENAME_lpOfn macro iOffset,iTempOffset,Flags local skip_it local nohook,hook_done local notemplate,template_done sub sp,OPENFILENAME16_SIZE ; alloc space for MapLS sels sub sp,OPENFILENAME16_SIZE ; alloc space on stack mov eax,[bp+iOffset] ; base address or eax,eax ; check structure pointer jz skip_it ; skip if null mov [bp-iTempOffset],sp ; save offset to buffer mov [bp-iTempOffset+2],ss ; save selector to buffer mov di,ss mov es,di movzx edi,sp ; es:edi == destination address mov esi,eax mov ds,cs:CodeData ; need access to FlatData mov ds,FlatData ; ds:esi == source address mov eax,ds:[esi + OFN32_Flags_OFFSET] mov Flags,eax cld lodsd ds:[esi] ;BUGBUG lStructSize should be checked here mov eax,OPENFILENAME16_SIZE ;sizeof(OPENFILENAME16) stosd es:[edi] ;lStructSize same size ; comments refer to action going 16->32 ;hwndOwner copyt mov ecx,Flags and ecx,OFN_ENABLETEMPLATE lodsd ds:[esi] ;hInst MAP_CD_NULL_HINST eax,ecx stosw es:[edi] MAP_POINTER es:[di+OPENFILENAME16_SIZE] ;PLUGGED lpstrFilter MAP_POINTER es:[di+OPENFILENAME16_SIZE] ;PLUGGED lpstrCustomFilter ncopyd 2 ;nMaxCustFilter,nFilterIndex MAP_POINTER es:[di+OPENFILENAME16_SIZE] ;PLUGGED lpstrFile copyd ;nMaxFile MAP_POINTER es:[di+OPENFILENAME16_SIZE] ;PLUGGED lpstrFileTitle copyd ;nMaxFileTitle MAP_POINTER es:[di+OPENFILENAME16_SIZE] ;PLUGGED lpstrInitialDir MAP_POINTER es:[di+OPENFILENAME16_SIZE] ;PLUGGED lpstrTitle copyd ;Flags ncopyw 2 ;nFileOffset,nFileExtension MAP_POINTER es:[di+OPENFILENAME16_SIZE];PLUGGED lpstrDefExt copyd ;lCustData test Flags,OFN_ENABLEHOOK jz nohook MAP_CALLBACK CBID_OPENFILENAME ;PLUGGED lpfnHook jmp short hook_done nohook: copyd hook_done: ;lpTemplate must be mapped only if OFN_ENABLETEMPLATE is set xor eax,eax mov es:[di+OPENFILENAME16_SIZE],eax ;in case we skip mapping test Flags, OFN_ENABLETEMPLATE ; if OFN_ENABLETEMPLATE is set jz notemplate MAP_POINTER es:[di+OPENFILENAME16_SIZE] ;PLUGGED lpTemplateName jmp short template_done notemplate: copyd ;lpTemplate template_done: skip_it: endm RAWUNPACK__THKGETOPENORSAVEFILENAME_lpOfn macro iOffset,iTempOffset,Flags local skip_it local nohook,hook_done local notemplate,template_done mov eax,[bp+iOffset] ; base address or eax,eax ; check structure pointer jz skip_it ; skip if null mov es,cs:CodeData mov es,es:FlatData mov edi,eax ; source in es:edi push ds lds si,[bp-iTempOffset] movzx esi,si ;in case code uses esi by accident cld lods dword ptr ds:[si] ;BUGBUG lStructSize should be checked here mov eax,OPENFILENAME32_SIZE ;sizeof(OPENFILENAME32) stos dword ptr es:[edi] ;lStructSize same size ; comments refer to action going 16->32 copyzx mov ecx,Flags and ecx,OFN_ENABLETEMPLATE lodsw ds:[si] ;hInst UMAP_CD_NULL_HINST ax,ecx stosd es:[edi] UMAP_POINTER ds:[si+OPENFILENAME16_SIZE] ;lpstrFilter must be mapped UMAP_POINTER ds:[si+OPENFILENAME16_SIZE] ;lpstrCustomFilter must be mapped ncopyd 2 UMAP_POINTER ds:[si+OPENFILENAME16_SIZE] ;lpstrFile must be mapped copyd UMAP_POINTER ds:[si+OPENFILENAME16_SIZE] ;lpstrFileTitle must be mapped copyd UMAP_POINTER ds:[si+OPENFILENAME16_SIZE] ;lpstrInitialDir must be mapped UMAP_POINTER ds:[si+OPENFILENAME16_SIZE] ;lpstrTitle must be mapped copyd ncopyw 2 UMAP_POINTER ds:[si+OPENFILENAME16_SIZE] ;lpstrDefExt must be mapped copyd test Flags,OFN_ENABLEHOOK jz nohook lodsd ds:[si] FREE_CALLBACK CBID_OPENFILENAME stos dword ptr es:[edi] jmp short hook_done nohook: copyd hook_done: test Flags,OFN_ENABLETEMPLATE jz notemplate UMAP_POINTER ds:[si+OPENFILENAME16_SIZE] ;lpTemplateName must be mapped jmp short template_done notemplate: copyd template_done: pop ds skip_it: endm ;----------------------------------------------------------------------------- ; Pack/unpack OPENFILENAME struct for GetOpenFilename(). ;----------------------------------------------------------------------------- RAWPACK__THKGETOPENFILENAME_lpOfn macro iOffset,iTempOffset RAWPACK__THKGETOPENORSAVEFILENAME_lpOfn iOffset,iTempOffset,dword ptr LOCAL__THKGETOPENFILENAME_Flags endm RAWUNPACK__THKGETOPENFILENAME_lpOfn macro iOffset,iTempOffset RAWUNPACK__THKGETOPENORSAVEFILENAME_lpOfn iOffset,iTempOffset,dword ptr LOCAL__THKGETOPENFILENAME_Flags endm ;----------------------------------------------------------------------------- ; Pack/unpack OPENFILENAME struct for GetSaveFilename(). ;----------------------------------------------------------------------------- RAWPACK__THKGETSAVEFILENAME_lpOfn macro iOffset,iTempOffset RAWPACK__THKGETOPENORSAVEFILENAME_lpOfn iOffset,iTempOffset,dword ptr LOCAL__THKGETSAVEFILENAME_Flags endm RAWUNPACK__THKGETSAVEFILENAME_lpOfn macro iOffset,iTempOffset RAWUNPACK__THKGETOPENORSAVEFILENAME_lpOfn iOffset,iTempOffset,dword ptr LOCAL__THKGETSAVEFILENAME_Flags endm ;----------------------------------------------------------------------------- ; Pack CHOOSECOLOR struct for ChooseColor(). ; ; Assumption: If the hInst field is a global handle, the Win32 wrapper ; guaratees it's a (zero-extended) Win16 handle. ;----------------------------------------------------------------------------- RAWPACK__THKCHOOSECOLOR_lpcc macro iOffset,iTempOffset local nohook,hook_done local notemplate,template_done local skip_it sub sp,CHOOSECOLOR16_SIZE ;Alloc space on stack mov eax,[bp+iOffset] or eax,eax jz skip_it mov [bp-iTempOffset],sp ;Save offset to buffer mov [bp-iTempOffset+2],ss ;Save selector to buffer mov di,ss mov es,di movzx edi,sp mov esi,eax mov ds,cs:CodeData mov ds,FlatData mov eax,ds:[esi + CC32_Flags_OFFSET] mov LOCAL__THKCHOOSECOLOR_Flags,eax lodsd ds:[esi] mov eax,CHOOSECOLOR16_SIZE stosd es:[di] ;lStructSize ;hwndOwner copyt ;hInstance mov ecx,LOCAL__THKCHOOSECOLOR_Flags and ecx,CC_ENABLETEMPLATE lodsd ds:[esi] ;hInst MAP_CD_NULL_HINST eax,ecx stosw es:[di] ;rgbResult copyd MAP_POINTER LOCAL__THKCHOOSECOLOR_lpCustColorsSeg ;PLUGGED lpCustColors ;Flags, lCustData ncopyd 2 ; Map hook function (only do the mapping if CC_ENABLEHOOK flag set). mov eax,LOCAL__THKCHOOSECOLOR_Flags test eax,CC_ENABLEHOOK jz nohook MAP_CALLBACK CBID_CHOOSECOLOR ;PLUGGED lpfnHook jmp short hook_done nohook: copyd hook_done: ; Map template name (only if CC_ENABLETEMPLATE flag set). mov eax,LOCAL__THKCHOOSECOLOR_Flags test eax,CC_ENABLETEMPLATE jz notemplate MAP_POINTER LOCAL__THKCHOOSECOLOR_lpTemplateNameSeg ;PLUGGED jmp short template_done ;lpTemplate notemplate: copyd template_done: ; Finished skip_it: endm ;----------------------------------------------------------------------------- ; Unpack CHOOSECOLOR struct for ChooseColor(). ;----------------------------------------------------------------------------- RAWUNPACK__THKCHOOSECOLOR_lpcc macro iOffset,iTempOffset local skip_it local nohook mov eax,[bp+iOffset] ; base address or eax,eax ; check structure pointer jz skip_it ; skip if null mov es,cs:CodeData mov es,es:FlatData mov edi,eax ; source in es:edi ; Free callback (if CC_ENABLEHOOK flag set). mov eax,LOCAL__THKCHOOSECOLOR_Flags test eax,CC_ENABLEHOOK jz nohook mov eax,es:[edi+CC32_lpfnHook_OFFSET] FREE_CALLBACK CBID_CHOOSECOLOR nohook: ; Propagate copy-outs field back to caller's struct. mov si, [bp-iTempOffset] mov eax,ss:[si+CC16_rgbResult_OFFSET] mov es:[edi+CC32_rgbResult_OFFSET], eax ; Free up selectors (if no mapping happened, UnmapLS safely ignores ; NULL segments). pushd LOCAL__THKCHOOSECOLOR_lpCustColorsSeg call UnmapLS pushd LOCAL__THKCHOOSECOLOR_lpTemplateNameSeg call UnmapLS skip_it: endm ;----------------------------------------------------------------------------- ; Pack/unpack CHOOSEFONT struct for ChooseFont(). ; ; Assumption: If the hInst field is a global handle, the Win32 wrapper ; guaratees it's a (zero-extended) Win16 handle. ;----------------------------------------------------------------------------- RAWPACK__THKCHOOSEFONT_lpcf macro iOffset,iTempOffset local skip_it local nohook,hook_done local notemplate,template_done local no_log_font sub sp,CHOOSEFONT16_SIZE+LOGFONT16_SIZE ; alloc space on stack mov eax,[bp+iOffset] ; base address or eax,eax ; check structure pointer jz skip_it ; skip if null mov [bp-iTempOffset],sp ; save offset to buffer mov [bp-iTempOffset+2],ss ; save selector to buffer mov di,ss mov es,di movzx edi,sp ; es:edi == destination address mov esi,eax mov ds,cs:CodeData ; need access to FlatData mov ds,FlatData ; ds:esi == source address mov eax,ds:[esi + CF32_Flags_OFFSET] mov LOCAL__THKCHOOSEFONT_Flags,eax cld ; comments refer to action going 16->32 lodsd ds:[esi] ;BUGBUG lStructSize should be checked here mov eax,CHOOSEFONT16_SIZE ;sizeof(CHOOSEFONT16) stosd es:[di] ;lStructSize same size ;hwndOwner, hDC ncopyt 2 lodsd ds:[esi] or eax,eax jz no_log_font mov ax,ss ror eax,16 mov ax,di add ax,CHOOSEFONT16_SIZE-8 ;already moved DI by 8 no_log_font: stosd es:[di] ;lpLogFont widened (need to pack it) ;iPointSize copyt ;Flags, rgbColors, lCustData ncopyd 3 test dword ptr LOCAL__THKCHOOSEFONT_Flags,CF_ENABLEHOOK jz nohook MAP_CALLBACK CBID_CHOOSEFONT ;PLUGGED lpfnHook jmp short hook_done nohook: copyd hook_done: test dword ptr LOCAL__THKCHOOSEFONT_Flags,CF_ENABLETEMPLATE jz notemplate MAP_POINTER LOCAL__THKCHOOSEFONT_lpTemplateNameTemp ;PLUGGED jmp short template_done notemplate: copyd template_done: mov ecx,LOCAL__THKCHOOSEFONT_Flags and ecx,CF_ENABLETEMPLATE lodsd ds:[esi] ;hInst MAP_CD_NULL_HINST eax,ecx stosw es:[di] ;lpszStyle must be mapped MAP_POINTER LOCAL__THKCHOOSEFONT_lpszStyleTemp ;PLUGGED ;nFontType, nSizeMin, nSizeMax ncopyt 3 mov esi,[bp+iOffset] ; base address mov esi,[esi].CF32_lpLogFont_OFFSET ; ds:esi == source address or esi,esi ; check structure pointer jz skip_it ; skip if null cld ; comments refer to action going 16->32 ;lfHeight, lfWidth, lfEscapement, lfOrientation, lfWeight ncopyt 5 ;lfItalic, ..., lfFaceName ncopyd (40/4) skip_it: endm RAWUNPACK__THKCHOOSEFONT_lpcf macro iOffset,iTempOffset local skip_it local nohook ;!!! We're only unpacking the log font structure! Does the rest of ; the CHOOSEFONT structure need to be unpacked as well? mov eax,[bp+iOffset] ; base address or eax,eax ; check structure pointer jz skip_it ; skip if null mov es,cs:CodeData mov es,es:FlatData mov edi,eax ; dest in es:edi test dword ptr LOCAL__THKCHOOSEFONT_Flags,CF_ENABLEHOOK jz nohook mov eax,es:[edi+CF32_lpfnHook_OFFSET] FREE_CALLBACK CBID_CHOOSEFONT nohook: ;; The iPointSize, rgbColors, Flags & nFontType fields need to be copied back ;; to the caller's buffer. lds si,dword ptr [bp-iTempOffset] movzx esi,si mov eax,[si+CF16_rgbColors_OFFSET] ; rgbColors mov es:[edi+CF32_rgbColors_OFFSET],eax mov ax,[si+CF16_iPointSize_OFFSET] ; iPointSize movsx eax,ax mov es:[edi+CF32_iPointSize_OFFSET],eax mov eax,[si+CF16_Flags_OFFSET] ; Flags mov es:[edi+CF32_Flags_OFFSET],eax mov ax,[si+CF16_nFontType_OFFSET] ; nFontType movzx eax,ax mov es:[edi+CF32_nFontType_OFFSET],eax mov edi,es:[edi+CF32_lpLogFont_OFFSET] or edi,edi jz skip_it add si,CHOOSEFONT16_SIZE ; comments refer to action going 16->32 cld ncopysx 5 ncopyd (40/4) skip_it: pushd LOCAL__THKCHOOSEFONT_lpszStyleTemp call UnmapLS pushd LOCAL__THKCHOOSEFONT_lpTemplateNameTemp call UnmapLS endm