dlgthk.inc
Upload User: xhy777
Upload Date: 2007-02-14
Package Size: 24088k
Code Size: 17k
Category:

Windows Kernel

Development Platform:

Visual C++

  1. CodeData equ <THUNK16BCodeData>
  2. include     thkframe.inc
  3. include     thkrp.inc
  4. include     cbcheck.inc
  5. include     public.inc
  6. include     cbcid.inc
  7. include     dlgcbid.inc
  8. externDef FreeCallback:far16
  9. externDef AllocCallback:far16
  10. externDef ConvertDevModeHandleSL:far16
  11. externDef ConvertDevNamesHandleSL:far16
  12. externDef ConvertDevModeHandleLS:far16
  13. externDef ConvertDevNamesHandleLS:far16
  14. fLocalFlag      equ     fDlgLog16
  15. ; note: following size should be the same as in thunkcompack.h
  16. OPENFILENAME16_SIZE         EQU  72
  17. OPENFILENAME32_SIZE         EQU  76     ;4Ch
  18. CHOOSECOLOR16_SIZE          EQU  32
  19. CHOOSECOLOR32_SIZE          EQU  36     ;24h
  20. CHOOSEFONT16_SIZE           EQU  46
  21. CHOOSEFONT32_SIZE           EQU  60     ;3Ch
  22. PRINTDLG16_SIZE             EQU  52
  23. PRINTDLG32_SIZE             EQU  66     ;42h
  24. LOGFONT16_SIZE              EQU  50
  25. OFN16_Flags_OFFSET          EQU  48     ;30h 
  26. CC16_rgbResult_OFFSET       EQU   8     ;08h
  27. CF16_iPointSize_OFFSET      EQU  12     ;0Ch
  28. CF16_Flags_OFFSET           EQU  14     ;0Dh
  29. CF16_rgbColors_OFFSET       EQU  18     ;12h
  30. CF16_nFontType_OFFSET       EQU  40     ;28h
  31. PD16_hDevMode_OFFSET        EQU   6     ;06h
  32. PD16_hDevNames_OFFSET       EQU   8     ;08h
  33. OFN32_Flags_OFFSET          EQU  52     ;34h
  34. OFN32_lpfnHook_OFFSET       EQU  68     ;44h
  35. CC32_rgbResult_OFFSET       EQU  12     ;0Ch
  36. CC32_Flags_OFFSET           EQU  20     ;14h
  37. CC32_lpfnHook_OFFSET        EQU  28     ;1Ch
  38. FR32_Flags_OFFSET           EQU  12     ;0CH
  39. FR32_lpfnHook_OFFSET        EQU  32     ;20h
  40. CF32_lpLogFont_OFFSET       EQU  12     ;0Ch
  41. CF32_iPointSize_OFFSET      EQU  16     ;10h
  42. CF32_Flags_OFFSET           EQU  20     ;14h
  43. CF32_rgbColors_OFFSET       EQU  24     ;18h
  44. CF32_lpfnHook_OFFSET        EQU  32     ;20h
  45. CF32_nFontType_OFFSET       EQU  48     ;30h
  46. PD32_Flags_OFFSET           EQU  20     ;1Ch
  47. PD32_hDevMode_OFFSET        EQU   8     ;08h
  48. PD32_hDevNames_OFFSET       EQU  12     ;0Ch
  49. PD32_lpfnPrintHook_OFFSET   EQU  42     ;2Ah
  50. PD32_lpfnSetupHook_OFFSET   EQU  46     ;2Eh
  51. ;---------------------------------------------------------------------------
  52. ; This macro does the work for GetOpenFilename() and GetSaveFilename().
  53. ; The argument "Flags" is a dword ptr expression denoting a thunk-compiler
  54. ; temporary that holds the Flags field of the OPENFILENAME struct.
  55. ;
  56. ; Assumption: If the hInst field is a global handle, the Win32 wrapper
  57. ; guaratees it's a (zero-extended) Win16 handle.
  58. ;---------------------------------------------------------------------------
  59. RAWPACK__THKGETOPENORSAVEFILENAME_lpOfn    macro    iOffset,iTempOffset,Flags
  60.     local   skip_it
  61.     local    nohook,hook_done
  62.     local    notemplate,template_done
  63.     sub     sp,OPENFILENAME16_SIZE        ; alloc space for MapLS sels
  64.     sub     sp,OPENFILENAME16_SIZE          ; alloc space on stack
  65.     mov     eax,[bp+iOffset]             ; base address
  66.     or      eax,eax                         ; check structure pointer
  67.     jz      skip_it                         ; skip if null
  68.     mov     [bp-iTempOffset],sp          ; save offset to buffer
  69.     mov     [bp-iTempOffset+2],ss        ; save selector to buffer
  70.     mov     di,ss
  71.     mov     es,di
  72.     movzx   edi,sp                          ; es:edi == destination address
  73.     mov     esi,eax
  74.     mov     ds,cs:CodeData                  ; need access to FlatData
  75.     mov     ds,FlatData                     ; ds:esi == source address
  76.     mov    eax,ds:[esi + OFN32_Flags_OFFSET]
  77.     mov    Flags,eax
  78.     cld
  79.     lodsd   ds:[esi]              ;BUGBUG lStructSize should be checked here
  80.     mov     eax,OPENFILENAME16_SIZE         ;sizeof(OPENFILENAME16)
  81.     stosd   es:[edi]              ;lStructSize same size
  82. ; comments refer to action going 16->32
  83.     ;hwndOwner
  84.     copyt
  85.     mov     ecx,Flags
  86.     and     ecx,OFN_ENABLETEMPLATE
  87.     lodsd   ds:[esi]        ;hInst
  88.     MAP_CD_NULL_HINST    eax,ecx
  89.     stosw   es:[edi]
  90.     MAP_POINTER es:[di+OPENFILENAME16_SIZE] ;PLUGGED lpstrFilter
  91.     MAP_POINTER es:[di+OPENFILENAME16_SIZE] ;PLUGGED lpstrCustomFilter
  92.     ncopyd  2                               ;nMaxCustFilter,nFilterIndex
  93.     MAP_POINTER es:[di+OPENFILENAME16_SIZE] ;PLUGGED lpstrFile
  94.     copyd                                   ;nMaxFile
  95.     MAP_POINTER es:[di+OPENFILENAME16_SIZE] ;PLUGGED lpstrFileTitle
  96.     copyd                                   ;nMaxFileTitle
  97.     MAP_POINTER es:[di+OPENFILENAME16_SIZE] ;PLUGGED lpstrInitialDir
  98.     MAP_POINTER es:[di+OPENFILENAME16_SIZE] ;PLUGGED lpstrTitle
  99.     copyd                                   ;Flags
  100.     ncopyw  2                               ;nFileOffset,nFileExtension
  101.     MAP_POINTER  es:[di+OPENFILENAME16_SIZE];PLUGGED lpstrDefExt
  102.     copyd                                   ;lCustData
  103.     test    Flags,OFN_ENABLEHOOK
  104.     jz      nohook
  105.     MAP_CALLBACK CBID_OPENFILENAME           ;PLUGGED lpfnHook
  106.     jmp     short hook_done
  107. nohook:
  108.     copyd
  109. hook_done:
  110.     ;lpTemplate must be mapped only if OFN_ENABLETEMPLATE is set
  111.     xor     eax,eax
  112.     mov     es:[di+OPENFILENAME16_SIZE],eax  ;in case we skip mapping
  113.     test    Flags, OFN_ENABLETEMPLATE         ; if OFN_ENABLETEMPLATE is set
  114.     jz      notemplate
  115.     MAP_POINTER  es:[di+OPENFILENAME16_SIZE] ;PLUGGED lpTemplateName
  116.     jmp     short template_done
  117. notemplate:
  118.     copyd                       ;lpTemplate
  119. template_done:
  120. skip_it:
  121. endm
  122. RAWUNPACK__THKGETOPENORSAVEFILENAME_lpOfn macro    iOffset,iTempOffset,Flags
  123.     local   skip_it
  124.     local    nohook,hook_done
  125.     local    notemplate,template_done
  126.     mov     eax,[bp+iOffset]              ; base address
  127.     or      eax,eax                          ; check structure pointer
  128.     jz      skip_it                          ; skip if null
  129.     mov     es,cs:CodeData
  130.     mov     es,es:FlatData
  131.     mov     edi,eax                          ; source in es:edi
  132.     push    ds
  133.     lds     si,[bp-iTempOffset]
  134.     movzx   esi,si            ;in case code uses esi by accident
  135.     cld
  136.     lods    dword ptr ds:[si]               ;BUGBUG lStructSize should be checked here
  137.     mov     eax,OPENFILENAME32_SIZE         ;sizeof(OPENFILENAME32)
  138.     stos    dword ptr es:[edi]              ;lStructSize same size
  139. ; comments refer to action going 16->32
  140.     copyzx
  141.     mov     ecx,Flags
  142.     and     ecx,OFN_ENABLETEMPLATE
  143.     lodsw   ds:[si]         ;hInst
  144.     UMAP_CD_NULL_HINST    ax,ecx
  145.     stosd   es:[edi]
  146.     UMAP_POINTER ds:[si+OPENFILENAME16_SIZE] ;lpstrFilter must be mapped
  147.     UMAP_POINTER ds:[si+OPENFILENAME16_SIZE] ;lpstrCustomFilter must be mapped
  148.     ncopyd  2
  149.     UMAP_POINTER ds:[si+OPENFILENAME16_SIZE] ;lpstrFile must be mapped
  150.     copyd
  151.     UMAP_POINTER ds:[si+OPENFILENAME16_SIZE] ;lpstrFileTitle must be mapped
  152.     copyd
  153.     UMAP_POINTER ds:[si+OPENFILENAME16_SIZE] ;lpstrInitialDir must be mapped
  154.     UMAP_POINTER ds:[si+OPENFILENAME16_SIZE] ;lpstrTitle must be mapped
  155.     copyd
  156.     ncopyw  2
  157.     UMAP_POINTER ds:[si+OPENFILENAME16_SIZE] ;lpstrDefExt must be mapped
  158.     copyd
  159.     test    Flags,OFN_ENABLEHOOK
  160.     jz      nohook
  161.     lodsd   ds:[si]
  162.     FREE_CALLBACK  CBID_OPENFILENAME
  163.     stos    dword ptr es:[edi]
  164.     jmp     short hook_done
  165. nohook:
  166.     copyd
  167. hook_done:
  168.     test    Flags,OFN_ENABLETEMPLATE
  169.     jz      notemplate
  170.     UMAP_POINTER ds:[si+OPENFILENAME16_SIZE] ;lpTemplateName must be mapped
  171.     jmp     short template_done
  172. notemplate:
  173.     copyd
  174. template_done:
  175.     pop     ds
  176. skip_it:
  177. endm
  178. ;-----------------------------------------------------------------------------
  179. ; Pack/unpack OPENFILENAME struct for GetOpenFilename().
  180. ;-----------------------------------------------------------------------------
  181. RAWPACK__THKGETOPENFILENAME_lpOfn    macro    iOffset,iTempOffset
  182.     RAWPACK__THKGETOPENORSAVEFILENAME_lpOfn    iOffset,iTempOffset,dword ptr LOCAL__THKGETOPENFILENAME_Flags
  183. endm
  184. RAWUNPACK__THKGETOPENFILENAME_lpOfn    macro    iOffset,iTempOffset
  185.     RAWUNPACK__THKGETOPENORSAVEFILENAME_lpOfn iOffset,iTempOffset,dword ptr LOCAL__THKGETOPENFILENAME_Flags
  186. endm
  187. ;-----------------------------------------------------------------------------
  188. ; Pack/unpack OPENFILENAME struct for GetSaveFilename().
  189. ;-----------------------------------------------------------------------------
  190. RAWPACK__THKGETSAVEFILENAME_lpOfn    macro    iOffset,iTempOffset
  191.     RAWPACK__THKGETOPENORSAVEFILENAME_lpOfn    iOffset,iTempOffset,dword ptr LOCAL__THKGETSAVEFILENAME_Flags
  192. endm
  193. RAWUNPACK__THKGETSAVEFILENAME_lpOfn    macro    iOffset,iTempOffset
  194.     RAWUNPACK__THKGETOPENORSAVEFILENAME_lpOfn iOffset,iTempOffset,dword ptr LOCAL__THKGETSAVEFILENAME_Flags
  195. endm
  196. ;-----------------------------------------------------------------------------
  197. ; Pack CHOOSECOLOR struct for ChooseColor().
  198. ;
  199. ; Assumption: If the hInst field is a global handle, the Win32 wrapper
  200. ; guaratees it's a (zero-extended) Win16 handle.
  201. ;-----------------------------------------------------------------------------
  202. RAWPACK__THKCHOOSECOLOR_lpcc        macro    iOffset,iTempOffset
  203.     local        nohook,hook_done
  204.     local        notemplate,template_done
  205.     local        skip_it
  206.     
  207.     sub     sp,CHOOSECOLOR16_SIZE    ;Alloc space on stack
  208.     mov     eax,[bp+iOffset]
  209.     or      eax,eax
  210.     jz      skip_it
  211.     
  212.     mov     [bp-iTempOffset],sp    ;Save offset to buffer
  213.     mov     [bp-iTempOffset+2],ss    ;Save selector to buffer
  214.     mov     di,ss
  215.     mov     es,di
  216.     movzx   edi,sp
  217.     mov     esi,eax
  218.     mov     ds,cs:CodeData
  219.     mov     ds,FlatData
  220.     mov     eax,ds:[esi + CC32_Flags_OFFSET]
  221.     mov     LOCAL__THKCHOOSECOLOR_Flags,eax
  222.     lodsd   ds:[esi]
  223.     mov     eax,CHOOSECOLOR16_SIZE
  224.     stosd   es:[di]    ;lStructSize
  225.     ;hwndOwner
  226.     copyt
  227.     ;hInstance
  228.     mov     ecx,LOCAL__THKCHOOSECOLOR_Flags
  229.     and     ecx,CC_ENABLETEMPLATE
  230.     lodsd   ds:[esi]    ;hInst
  231.     MAP_CD_NULL_HINST    eax,ecx
  232.     stosw   es:[di]
  233.     ;rgbResult
  234.     copyd
  235.     MAP_POINTER    LOCAL__THKCHOOSECOLOR_lpCustColorsSeg  ;PLUGGED lpCustColors
  236.     ;Flags, lCustData
  237.     ncopyd  2
  238. ; Map hook function (only do the mapping if CC_ENABLEHOOK flag set).
  239.     mov     eax,LOCAL__THKCHOOSECOLOR_Flags
  240.     test    eax,CC_ENABLEHOOK
  241.     jz      nohook
  242.     MAP_CALLBACK    CBID_CHOOSECOLOR  ;PLUGGED lpfnHook
  243.     jmp     short hook_done
  244. nohook:
  245.     copyd
  246. hook_done:
  247. ; Map template name (only if CC_ENABLETEMPLATE flag set).
  248.     mov     eax,LOCAL__THKCHOOSECOLOR_Flags
  249.     test    eax,CC_ENABLETEMPLATE
  250.     jz      notemplate
  251.     MAP_POINTER    LOCAL__THKCHOOSECOLOR_lpTemplateNameSeg ;PLUGGED
  252.     jmp     short template_done    ;lpTemplate
  253. notemplate:
  254.     copyd
  255. template_done:
  256. ;  Finished
  257. skip_it:
  258. endm
  259. ;-----------------------------------------------------------------------------
  260. ; Unpack CHOOSECOLOR struct for ChooseColor().
  261. ;-----------------------------------------------------------------------------
  262. RAWUNPACK__THKCHOOSECOLOR_lpcc    macro    iOffset,iTempOffset
  263.     local   skip_it
  264.     local    nohook
  265.     mov     eax,[bp+iOffset]              ; base address
  266.     or      eax,eax                          ; check structure pointer
  267.     jz      skip_it                          ; skip if null
  268.     mov     es,cs:CodeData
  269.     mov     es,es:FlatData
  270.     mov     edi,eax                          ; source in es:edi
  271. ; Free callback (if CC_ENABLEHOOK flag set).
  272.     mov    eax,LOCAL__THKCHOOSECOLOR_Flags
  273.     test    eax,CC_ENABLEHOOK
  274.     jz    nohook
  275.     mov     eax,es:[edi+CC32_lpfnHook_OFFSET]
  276.     FREE_CALLBACK   CBID_CHOOSECOLOR
  277. nohook:
  278. ; Propagate copy-outs field back to caller's struct.
  279.     mov     si, [bp-iTempOffset]
  280.     mov     eax,ss:[si+CC16_rgbResult_OFFSET]
  281.     mov     es:[edi+CC32_rgbResult_OFFSET], eax
  282. ; Free up selectors (if no mapping happened, UnmapLS safely ignores
  283. ; NULL segments).
  284.     pushd    LOCAL__THKCHOOSECOLOR_lpCustColorsSeg
  285.     call    UnmapLS
  286.     pushd    LOCAL__THKCHOOSECOLOR_lpTemplateNameSeg
  287.     call    UnmapLS
  288. skip_it:
  289. endm
  290. ;-----------------------------------------------------------------------------
  291. ; Pack/unpack CHOOSEFONT struct for ChooseFont().
  292. ;
  293. ; Assumption: If the hInst field is a global handle, the Win32 wrapper
  294. ; guaratees it's a (zero-extended) Win16 handle.
  295. ;-----------------------------------------------------------------------------
  296. RAWPACK__THKCHOOSEFONT_lpcf        macro    iOffset,iTempOffset
  297.     local   skip_it
  298.     local    nohook,hook_done
  299.     local    notemplate,template_done
  300.     local   no_log_font
  301.     sub     sp,CHOOSEFONT16_SIZE+LOGFONT16_SIZE  ; alloc space on stack
  302.     mov     eax,[bp+iOffset]             ; base address
  303.     or      eax,eax                         ; check structure pointer
  304.     jz      skip_it                         ; skip if null
  305.     mov     [bp-iTempOffset],sp          ; save offset to buffer
  306.     mov     [bp-iTempOffset+2],ss        ; save selector to buffer
  307.     mov     di,ss
  308.     mov     es,di
  309.     movzx   edi,sp                          ; es:edi == destination address
  310.     mov     esi,eax
  311.     mov     ds,cs:CodeData                  ; need access to FlatData
  312.     mov     ds,FlatData                     ; ds:esi == source address
  313.     mov     eax,ds:[esi + CF32_Flags_OFFSET]
  314.     mov     LOCAL__THKCHOOSEFONT_Flags,eax
  315.     cld
  316. ; comments refer to action going 16->32
  317.     lodsd   ds:[esi]              ;BUGBUG lStructSize should be checked here
  318.     mov     eax,CHOOSEFONT16_SIZE           ;sizeof(CHOOSEFONT16)
  319.     stosd   es:[di]                         ;lStructSize same size
  320.     ;hwndOwner, hDC
  321.     ncopyt  2
  322.     lodsd   ds:[esi]
  323.     or      eax,eax
  324.     jz      no_log_font
  325.     mov     ax,ss
  326.     ror     eax,16
  327.     mov     ax,di
  328.     add     ax,CHOOSEFONT16_SIZE-8          ;already moved DI by 8
  329. no_log_font:
  330.     stosd   es:[di]                         ;lpLogFont widened (need to pack it)
  331.     ;iPointSize
  332.     copyt
  333.     ;Flags, rgbColors, lCustData
  334.     ncopyd  3
  335.     
  336.     test    dword ptr LOCAL__THKCHOOSEFONT_Flags,CF_ENABLEHOOK
  337.     jz      nohook
  338.     MAP_CALLBACK CBID_CHOOSEFONT            ;PLUGGED lpfnHook
  339.     jmp     short hook_done
  340. nohook:
  341.     copyd
  342. hook_done:
  343.     test    dword ptr LOCAL__THKCHOOSEFONT_Flags,CF_ENABLETEMPLATE
  344.     jz      notemplate
  345.     MAP_POINTER  LOCAL__THKCHOOSEFONT_lpTemplateNameTemp  ;PLUGGED
  346.     jmp     short template_done
  347. notemplate:
  348.     copyd
  349. template_done:
  350.     mov     ecx,LOCAL__THKCHOOSEFONT_Flags
  351.     and     ecx,CF_ENABLETEMPLATE
  352.     lodsd   ds:[esi]    ;hInst
  353.     MAP_CD_NULL_HINST    eax,ecx
  354.     stosw   es:[di]
  355.     ;lpszStyle must be mapped
  356.     MAP_POINTER LOCAL__THKCHOOSEFONT_lpszStyleTemp  ;PLUGGED
  357.     ;nFontType, nSizeMin, nSizeMax
  358.     ncopyt  3
  359.     mov     esi,[bp+iOffset]             ; base address
  360.     mov     esi,[esi].CF32_lpLogFont_OFFSET ; ds:esi == source address
  361.     or      esi,esi                         ; check structure pointer
  362.     jz      skip_it                         ; skip if null
  363.     cld
  364. ; comments refer to action going 16->32
  365.     ;lfHeight, lfWidth, lfEscapement, lfOrientation, lfWeight
  366.     ncopyt  5
  367.     ;lfItalic, ..., lfFaceName 
  368.     ncopyd  (40/4)
  369. skip_it:
  370. endm
  371. RAWUNPACK__THKCHOOSEFONT_lpcf        macro    iOffset,iTempOffset
  372.     local   skip_it
  373.     local    nohook
  374. ;!!! We're only unpacking the log font structure!  Does the rest of
  375. ;    the CHOOSEFONT structure need to be unpacked as well?
  376.     mov     eax,[bp+iOffset]              ; base address
  377.     or      eax,eax                          ; check structure pointer
  378.     jz      skip_it                          ; skip if null
  379.     
  380.     mov     es,cs:CodeData
  381.     mov     es,es:FlatData
  382.     mov     edi,eax                          ; dest in es:edi
  383.     test    dword ptr LOCAL__THKCHOOSEFONT_Flags,CF_ENABLEHOOK
  384.     jz    nohook
  385.     mov     eax,es:[edi+CF32_lpfnHook_OFFSET]
  386.     FREE_CALLBACK   CBID_CHOOSEFONT
  387. nohook:
  388. ;; The iPointSize, rgbColors, Flags & nFontType fields need to be copied back
  389. ;; to the caller's buffer.
  390.     lds     si,dword ptr [bp-iTempOffset]
  391.     movzx   esi,si
  392.     mov     eax,[si+CF16_rgbColors_OFFSET] ; rgbColors
  393.     mov     es:[edi+CF32_rgbColors_OFFSET],eax
  394.     mov     ax,[si+CF16_iPointSize_OFFSET] ; iPointSize
  395.     movsx   eax,ax
  396.     mov     es:[edi+CF32_iPointSize_OFFSET],eax
  397.     mov     eax,[si+CF16_Flags_OFFSET] ; Flags
  398.     mov     es:[edi+CF32_Flags_OFFSET],eax
  399.     mov     ax,[si+CF16_nFontType_OFFSET] ; nFontType
  400.     movzx   eax,ax
  401.     mov     es:[edi+CF32_nFontType_OFFSET],eax
  402.     mov     edi,es:[edi+CF32_lpLogFont_OFFSET]
  403.     or      edi,edi
  404.     jz      skip_it
  405.     add     si,CHOOSEFONT16_SIZE
  406. ; comments refer to action going 16->32
  407.     cld
  408.     ncopysx 5
  409.     ncopyd  (40/4)
  410. skip_it:
  411.     pushd    LOCAL__THKCHOOSEFONT_lpszStyleTemp
  412.     call    UnmapLS
  413.     pushd    LOCAL__THKCHOOSEFONT_lpTemplateNameTemp
  414.     call    UnmapLS
  415. endm