|
|
CodeData equ <THUNK16BCodeData>
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
|