home *** CD-ROM | disk | FTP | other *** search
/ Reverse Code Engineering RCE CD +sandman 2000 / ReverseCodeEngineeringRceCdsandman2000.iso / RCE / LordLucifer / win32asm / files / win32asm.exe / Win32ASM / Win32Proto / W32PMProcs.asm < prev    next >
Encoding:
Assembly Source File  |  1997-11-10  |  19.3 KB  |  676 lines

  1.    Page 60,190
  2.     TITLE W32MProcs - Windows 95 prototype - Message Procedures.
  3.                .586
  4.                 .MODEL FLAT,STDCALL
  5.  
  6.                 .NOLISTMACRO
  7.                 .NOLIST
  8.  
  9. UniCode         = 0
  10.  
  11.                 INCLUDE INSTR32.MAC
  12.                 INCLUDE WIN32INC.EQU
  13.  
  14.                 INCLUDE WIN32.MAC
  15.  
  16.                 INCLUDE COMDLG32.EQU
  17.                 INCLUDE GDI32.EQU
  18.                 INCLUDE KERNEL32.EQU
  19.                 INCLUDE USER32.EQU
  20.  
  21.                 INCLUDE WINMM.EQU
  22.  
  23.                 INCLUDE W32PROTO.EQU
  24.                 .LIST
  25.  
  26.                 EXTERN hInst:DWORD
  27.  
  28.                 .CODE
  29.  
  30.  
  31.  
  32. CvDec                   PROTO                   ;Binary to decimal conversion routine.
  33. DisplayLastError        PROTO                   ;GetLastError & Display it.
  34. ErrorBox                PROTO lpszErrorMsg:DWORD
  35. SBCreate                PROTO hWnd:DWORD        ;Status bar create routine.
  36. SBDisplay               PROTO uSBPart:DWORD,lpszMsg:DWORD
  37. SBResize                PROTO lParam:DWORD      ;Status bar resize routine.
  38. TBCreate                PROTO hWnd:DWORD        ;Toolbar create routine.
  39. TBResize                PROTO                   ;Toolbar resize routine.
  40. TMCreate                PROTO hWnd:DWORD        ;Timer create routine.
  41. TMKill                  PROTO hWnd:DWORD        ;Timer kill routine.
  42.  
  43.                 PAGE
  44. ; ==================================================================
  45. ; Global Data section.
  46. ; ==================================================================
  47.  
  48.                 .DATA
  49.  
  50.  
  51.                 PAGE
  52.                 .CODE
  53. ; ==========================================================================
  54. ; Main WinProc Message processing procedures.
  55. ; Must return with EAX = Error code.
  56. ; ==========================================================================
  57.  
  58.  
  59. ; ==========================================================================
  60. ; We received a WM_Create message.
  61. ; Play some sound.
  62. ; ==========================================================================
  63.  
  64.                 .CONST
  65.  
  66. szMeow       BYTE 'IDR_MEOW',0
  67.  
  68.                 .CODE
  69.  
  70. WinProc_WM_CREATE PROC PUBLIC,
  71.                     hWnd:DWORD,
  72.                     wMsg:DWORD,
  73.                     wParam:DWORD,
  74.                     lParam:DWORD
  75.  
  76. ; Make some noise.
  77.  
  78.     INVOKE PlaySound,
  79.              IDR_MEOW,
  80.              hInst,
  81.              SND_RESOURCE or SND_ASYNC
  82.  
  83.     MOV ECX,hWnd                        ;Get our Win handle
  84.     MOV EDX,hInst                       ;and our instance handle,
  85.     INVOKE TBCreate,                    ;Create toolbar,
  86.              hWnd                       ;main window handle.
  87.                                         ;(EAX == 0 if failed,
  88.                                         ; TB handle otherwise)
  89.     INVOKE SBCreate,                    ;Create status bar.
  90.              hWnd                       ;main window handle.
  91.                                         ;(EAX == 0 if failed,
  92.                                         ; SB handle otherwise)
  93.     INVOKE TMCreate,                    ;Create and fire timer.
  94.              hWnd
  95.                                         ;(EAX == 0 if failed,
  96.                                         ; timer handle otherwise)
  97.  
  98.     XOR EAX,EAX
  99.     RET
  100.  
  101.     UnusedParm wMsg
  102.     UnusedParm wParam
  103.     UnusedParm lParam
  104.  
  105. WinProc_WM_CREATE ENDP
  106.  
  107.  
  108.  
  109. ; ==========================================================================
  110. ; Received a paint message.
  111. ; Repaint the main window.
  112. ; ==========================================================================
  113.  
  114.     .CONST
  115.  
  116. szHello BYTE 'Hi, Windows95!',0
  117.  
  118.     .DATA
  119.  
  120. Rect RECT <?>
  121. PS   PAINTSTRUCT <?>
  122.  
  123.  
  124.     .CODE
  125.  
  126. WinProc_WM_PAINT PROC PUBLIC,
  127.                    hWnd:DWORD,
  128.                    wMsg:DWORD,
  129.                    wParam:DWORD,
  130.                    lParam:DWORD
  131.  
  132.     LOCAL TheDC:DWORD
  133.  
  134.     INVOKE BeginPaint,
  135.              hWnd,
  136.              OFFSET PS
  137.     MOV TheDC,EAX                       ;Remember Device Context.
  138.  
  139.     INVOKE GetWindowRect,               ;get size of window
  140.              hWnd,                      ;Our window handle,
  141.              OFFSET Rect                ;rectangle structure.
  142.  
  143.     INVOKE DrawText,
  144.              TheDC,
  145.              OFFSET szHello,
  146.              -1,
  147.              OFFSET Rect,
  148.              DT_SINGLELINE or DT_CENTER or DT_VCENTER
  149.  
  150.     INVOKE EndPaint,
  151.              hWnd,
  152.              OFFSET PS
  153.  
  154.     XOR EAX,EAX
  155.     RET
  156.  
  157.     UnusedParm wMsg
  158.     UnusedParm wParam
  159.     UnusedParm lParam
  160.  
  161. WinProc_WM_PAINT ENDP
  162.  
  163.  
  164.  
  165. ; ==========================================================================
  166. ; Received a WM_SIZE message.
  167. ; Resize the window.
  168. ; ==========================================================================
  169.  
  170.  
  171. WinProc_WM_SIZE PROC PUBLIC,
  172.                   hWnd:DWORD,
  173.                   wMsg:DWORD,
  174.                   wParam:DWORD,
  175.                   lParam:DWORD
  176.  
  177.  
  178.     INVOKE TBResize                     ;Resize the toolbar,
  179.     INVOKE SBResize,                    ;resize the status bar.
  180.              lParam
  181.  
  182.     XOR EAX,EAX
  183.     RET
  184.  
  185.     UnusedParm hWnd
  186.     UnusedParm wMsg
  187.     UnusedParm wParam
  188.     UnusedParm lParam
  189.  
  190. WinProc_WM_SIZE ENDP
  191.  
  192.  
  193. ; ==========================================================================
  194. ; Received a mouse click.
  195. ; Make some pseudo-random noise.
  196. ; ==========================================================================
  197.  
  198.  
  199. WinProc_WM_LBUTTONDOWN PROC PUBLIC,
  200.                          hWnd:DWORD,
  201.                          wMsg:DWORD,
  202.                          wParam:DWORD,
  203.                          lParam:DWORD
  204.  
  205.     MOV EAX,OFFSET RightClick           ;Select table origin for RClick,
  206.     CALL MakeSomeNoise                  ;Go make noise below.
  207.     RET
  208.  
  209.     UnusedParm hWnd
  210.     UnusedParm wMsg
  211.     UnusedParm wParam
  212.     UnusedParm lParam
  213.  
  214. WinProc_WM_LBUTTONDOWN ENDP
  215.  
  216.  
  217. WinProc_WM_RBUTTONDOWN PROC PUBLIC,
  218.                          hWnd:DWORD,
  219.                          wMsg:DWORD,
  220.                          wParam:DWORD,
  221.                          lParam:DWORD
  222.  
  223.     MOV EAX,OFFSET LeftClick            ;Select table origin for LClick.
  224.     CALL MakeSomeNoise                  ;Go make noise below.
  225.     RET
  226.  
  227.     UnusedParm hWnd
  228.     UnusedParm wMsg
  229.     UnusedParm wParam
  230.     UnusedParm lParam
  231.  
  232. WinProc_WM_RBUTTONDOWN ENDP
  233.  
  234.     .CONST
  235.  
  236. RightClick      DWORD MB_ICONASTERISK      ;SystemAsterisk
  237. LeftClick       DWORD MB_ICONEXCLAMATION   ;SystemExclamation
  238.                 DWORD MB_ICONHAND          ;SystemHand
  239.                 DWORD MB_ICONQUESTION      ;SystemQuestion
  240.                 DWORD MB_OK                ;SystemDefault
  241.  
  242.     .CODE
  243.  
  244. MakeSomeNoise PROC
  245.     SAVE EAX                            ;Save table origin.
  246.     INVOKE GetTickCount                 ;Get current tick count,
  247.     RESTORE EDX                         ;EDX = noise table origin,
  248.     AND EAX,011b                        ;turn ticks into 0-3 index,
  249.     ADD EAX,EDX                         ;use as random index into table,
  250.     MOV EAX,[EAX]                       ;get noise,
  251.     INVOKE MessageBeep,                 ;make noise.
  252.              EAX
  253.     RET
  254. MakeSomeNoise ENDP
  255.  
  256.  
  257.  
  258.  
  259. ; ==========================================================================
  260. ; Received a MENUSELECT message.
  261. ; The user pointer moved to a menu item.
  262. ; ==========================================================================
  263.  
  264.     .DATA
  265.  
  266. szBuffer BYTE 80 DUP(0)
  267.  
  268.     .CODE
  269.  
  270. WinProc_WM_MENUSELECT PROC PUBLIC,
  271.                         hWnd:DWORD,
  272.                         wMsg:DWORD,
  273.                         wParam:DWORD,
  274.                         lParam:DWORD
  275.  
  276.  
  277.       .IF (WORD PTR wParam+2 == 0FFFFh) && (lParam == 0)
  278.                                         ;If the user closed a menu,
  279.       MOV BYTE PTR szBuffer,0           ;we didn't process this message.
  280.       MOV EAX,1                         ;so we must return NZ.
  281.       .ELSE
  282.       XOR EAX,EAX
  283.       MOV AX,WORD PTR wParam
  284.       INVOKE LoadString,                ;load the tip from stringtable
  285.                hInst,                   ;instance,
  286.                EAX,                     ;menu item message,
  287.                OFFSET szBuffer,         ;buffer to load string into,
  288.                (SIZEOF szBuffer)-1      ;size of our buffer.
  289.       .ENDIF
  290.  
  291.       .IF EAX != 0                      ;If LoadString worked,
  292.       INVOKE SBDisplay,                 ;display menu help.
  293.                SBPART_MESSAGE,
  294.                OFFSET szBuffer
  295.       XOR EAX,EAX
  296.       .ENDIF
  297.  
  298.     RET
  299.  
  300.     UnusedParm hWnd
  301.     UnusedParm wMsg
  302.  
  303. WinProc_WM_MENUSELECT ENDP
  304.  
  305.  
  306.  
  307. ; ==========================================================================
  308. ; Received a Destroy message.
  309. ; Kill the timer, post a Quit message.
  310. ; ==========================================================================
  311.  
  312.  
  313.  
  314. WinProc_WM_DESTROY PROC PUBLIC,
  315.                      hWnd:DWORD,
  316.                      wMsg:DWORD,
  317.                      wParam:DWORD,
  318.                      lParam:DWORD
  319.  
  320.     INVOKE TMKill,                      ;Kill our timer,
  321.              hWnd
  322.  
  323.     INVOKE PostQuitMessage,             ;Quit
  324.              0
  325.     XOR EAX,EAX
  326.     RET
  327.  
  328.     UnusedParm hWnd
  329.     UnusedParm wMsg
  330.     UnusedParm wParam
  331.     UnusedParm lParam
  332.  
  333. WinProc_WM_DESTROY ENDP
  334.  
  335.  
  336. ; ==========================================================================
  337. ; Main WinProc Command Message processing procedures.
  338. ; Must return with EAX = Error code.
  339. ; ==========================================================================
  340.  
  341.  
  342. ; ==========================================================================
  343. ; Received an ID_FILE_EXIT menu command.
  344. ; Same code as WM_DESTROY.
  345. ; ==========================================================================
  346.  
  347.  
  348. WinProcCMD_ID_FILE_EXIT PROC PUBLIC,
  349.                           hWnd:DWORD,
  350.                           wMsg:DWORD,
  351.                           wParam:DWORD,
  352.                           lParam:DWORD
  353.  
  354.     INVOKE PostQuitMessage,             ;quit
  355.              0
  356.     XOR EAX,EAX
  357.     RET
  358.  
  359.     UnusedParm hWnd
  360.     UnusedParm wMsg
  361.     UnusedParm wParam
  362.     UnusedParm lParam
  363.  
  364. WinProcCMD_ID_FILE_EXIT ENDP
  365.  
  366.  
  367.  
  368. ; ==========================================================================
  369. ; Received an ID_HELP_CONTENT menu command.
  370. ; Invoke external help system.
  371. ; ==========================================================================
  372.  
  373.     .CONST
  374.  
  375. szHelp BYTE 'W32Proto.hlp',0
  376.  
  377.     .CODE
  378.  
  379. WinProcCMD_ID_HELP_CONTENT PROC PUBLIC,
  380.                              hWnd:DWORD,
  381.                              wMsg:DWORD,
  382.                              wParam:DWORD,
  383.                              lParam:DWORD
  384.  
  385.     INVOKE WinHelp,
  386.               hWnd,                     ;handle of window requiring help,
  387.               OFFSET szHelp,            ;addess of dir/path string,
  388.               HELP_CONTENTS,            ;type of help,
  389.               0                         ;additional data.
  390.     XOR EAX,EAX
  391.     RET
  392.  
  393.     UnusedParm wMsg
  394.     UnusedParm wParam
  395.     UnusedParm lParam
  396.  
  397. WinProcCMD_ID_HELP_CONTENT ENDP
  398.  
  399.  
  400.  
  401. ; ==========================================================================
  402. ; Received an ID_FILE_OPEN menu command.
  403. ; Invoke FileOpen dialog.
  404. ; Call the getopenfilename common dialog to retrieve the path in szfile
  405. ; ==========================================================================
  406.  
  407.     .CONST
  408.  
  409. szOFTitle  BYTE 'Open File',
  410.                  0
  411. szOFFilter BYTE 'Text Files (*.txt)',0,'*.txt',0,
  412.                  0
  413. szOFExt    BYTE '*.txt',
  414.                  0
  415.  
  416.     .DATA
  417.  
  418.     ALIGN DWORD
  419.  
  420. OFNx        OPENFILENAME <?>
  421. OFSx        OFSTRUCT <?>
  422. hOFFile     DWORD 0
  423.  
  424. szOFFile    BYTE MAX_PATH DUP(0)
  425. OFBytesRead DWORD 0
  426. OFMsgBuff   BYTE 'Test Win32 Assembler Program',
  427.                0,
  428.                64 DUP(?)
  429.  
  430.     .CODE
  431.  
  432.  
  433. WinProcCMD_ID_FILE_OPEN PROC PUBLIC,
  434.                           hWnd:DWORD,
  435.                           wMsg:DWORD,
  436.                           wParam:DWORD,
  437.                           lParam:DWORD
  438.  
  439.     MOV ECX,SIZEOF OFNx
  440.     MOV EDI,OFFSET OFNx                 ;Fill in the OFN structure.
  441.     XOR EAX,EAX
  442.     REP STOSB
  443.     MOV OFNx.lStructSize,SIZEOF OFNx
  444.     MOV EAX,hWnd                        ;Window handle
  445.     MOV OFNx.hwndOwner,EAX
  446.     MOV EAX,hInst                       ;Process instance
  447.     MOV OFNx.hInstance,EAX
  448.     MOV OFNx.lpstrFilter,OFFSET szOFFilter
  449.     MOV OFNx.lpstrFile,OFFSET szOFFile
  450.     MOV OFNx.nMaxFile,LENGTH szOFFile
  451.     MOV OFNx.lpstrInitialDir,0
  452.     MOV OFNx.lpstrTitle,OFFSET szOFTitle
  453.     MOV OFNx.lpstrDefExt,OFFSET szOFExt
  454.     MOV OFNx.Flags,OFN_PATHMUSTEXIST or OFN_FILEMUSTEXIST
  455.     INVOKE GetOpenFileName,
  456.              OFFSET OFNx                ;OpenFileName structure.
  457.  
  458.       .IF EAX != 0                      ;If no error, no cancel:
  459.                                         ; Open the file and read in a some data.
  460.                                         ; OpenFile is 16 bits compat, should use
  461.                                         ; CreateFile, nowadays...
  462.       INVOKE OpenFile,
  463.                OFFSET szOFFile,         ;Pointer to where filename now is.
  464.                OFFSET OFSx,             ;Receive OFSTRUCT open info there.
  465.                OF_READ                  ;Open file as Read Only.
  466.         .IF EAX != -1                   ;If Open happened properly,
  467.         MOV [hOFFile],EAX               ;remember file handle.
  468.         INVOKE ReadFile,
  469.                  EAX,                   ;File handle,
  470.                  OFFSET OFMsgBuff,      ;buffer to receive data,
  471.                  (SIZEOF OFMsgBuff)-1,  ;number of bytes to read,
  472.                  OFFSET OFBytesRead,    ;Bytes actually read
  473.                  0                      ;No overlapped structure.
  474.           .IF EAX != 0                  ;If good read,
  475.           MOV EDI,OFBytesRead           ;force a terminating 0.
  476.           MOV BYTE PTR OFMsgBuff[EDI],0
  477.           INVOKE CloseHandle,           ;Now close file.
  478.                    hOFFile
  479.           MOV AL,CR                     ;Look for first carriage return.
  480.           MOV ECX,OFBytesRead
  481.           LEA EDI,OFMsgBuff
  482.           CLD
  483.           REPNZ SCASB
  484.             .IF !ZERO?                  ;If found a CR, overwrite with
  485.             MOV BYTE PTR [EDI-1],0      ;terminating zero
  486.             .ENDIF                      ;Endif "found a CR"
  487.           .ENDIF                        ;Endif "if good read"
  488.         .ELSE                           ;Open didn't work properly.
  489.         INVOKE DisplayLastError         ;See and say why.
  490.         .ENDIF                          ;Endif "if OpenFile happened properly"
  491.       .ENDIF                            ;If "no Cancel from OpenDialog"
  492.     XOR EAX,EAX
  493.     RET
  494.  
  495.     UnusedParm wMsg
  496.     UnusedParm wParam
  497.     UnusedParm lParam
  498.  
  499. WinProcCMD_ID_FILE_OPEN ENDP
  500.  
  501.  
  502. ; ==========================================================================
  503. ; Invoke FileSave dialog.
  504. ; Call the getopenfilename common dialog to retrieve the path in szfile
  505. ; ==========================================================================
  506.  
  507.     .CONST
  508.  
  509. szOFSvTitle  BYTE 'Save File',0
  510. szOFSvFilter BYTE 'Text Files (*.txt)',0,'*.txt',0,
  511.                 0
  512. szOFSvExt    BYTE '*.txt',0
  513.  
  514.  
  515.     .DATA
  516.  
  517. szOFSvFile      BYTE MAX_PATH DUP(0)
  518.  
  519.     ALIGN DWORD
  520.  
  521. OFNSave         OPENFILENAME <?>
  522.  
  523.  
  524.     .CODE
  525.  
  526. WinProcCMD_ID_FILE_SAVE PROC PUBLIC,
  527.                           hWnd:DWORD,
  528.                           wMsg:DWORD,
  529.                           wParam:DWORD,
  530.                           lParam:DWORD
  531.  
  532.  
  533.                                         ;First, setup OFN struct.
  534.     MOV ECX,SIZEOF OFNSave              ;Zero whole structure first.
  535.     MOV EDI,OFFSET OFNSave
  536.     XOR EAX,EAX
  537.     REP STOSB
  538.     MOV OFNSave.lStructSize,SIZEOF OFNSave
  539.     MOV EAX,hWnd
  540.     MOV OFNSave.hwndOwner,EAX
  541.     MOV EAX,hInst                       ;Process instance
  542.     MOV OFNSave.hInstance,EAX
  543.     MOV OFNSave.lpstrFilter,OFFSET szOFSvFilter
  544.     MOV OFNSave.lpstrFile,OFFSET szOFSvFile
  545.     MOV OFNSave.nMaxFile,LENGTH szOFSvFile
  546.     MOV OFNSave.lpstrInitialDir,0
  547.     MOV OFNSave.lpstrTitle,OFFSET szOFSvTitle
  548.     MOV OFNSave.lpstrDefExt,OFFSET szOFSvExt
  549.     MOV OFNSave.Flags,OFN_PATHMUSTEXIST
  550.  
  551.     INVOKE GetSaveFileName,
  552.              OFFSET OFNSave
  553.  
  554.     XOR EAX,EAX
  555.     RET
  556.  
  557.     UnusedParm wMsg
  558.     UnusedParm wParam
  559.     UnusedParm lParam
  560.  
  561. WinProcCMD_ID_FILE_SAVE ENDP
  562.  
  563.  
  564.  
  565. WinProcCMD_ID_FILE_SAVEAS PROC PUBLIC,
  566.                             hWnd:DWORD,
  567.                             wMsg:DWORD,
  568.                             wParam:DWORD,
  569.                             lParam:DWORD
  570.  
  571.     INVOKE WinProcCMD_ID_FILE_SAVE,
  572.              hWnd,
  573.              wMsg,
  574.              wParam,
  575.              lParam
  576.     RET
  577.  
  578.     UnusedParm hWnd
  579.     UnusedParm wMsg
  580.     UnusedParm wParam
  581.     UnusedParm lParam
  582.  
  583. WinProcCMD_ID_FILE_SAVEAS ENDP
  584.  
  585.  
  586. ; ==========================================================================
  587. ; Call the printdlg common dialog function and print some garbage.
  588. ; ==========================================================================
  589.  
  590.     .CONST
  591.  
  592. PrintTitle BYTE 'W32Proto Assembly Language Generic Program',
  593.                     0
  594. PrintMsg   BYTE 'This is a silly dummy message.'
  595.  
  596.     .DATA
  597.  
  598.     ALIGN DWORD
  599.  
  600. PD   PRINTDLG <?>
  601. DocI DOCINFO  <?>
  602.  
  603.     .CODE
  604.  
  605. WinProcCMD_ID_FILE_PRINT PROC PUBLIC,
  606.                            hWnd:DWORD,
  607.                            wMsg:DWORD,
  608.                            wParam:DWORD,
  609.                            lParam:DWORD
  610.  
  611.  
  612.     LOCAL Y:DWORD
  613.  
  614.     MOV ECX,SIZEOF PD                   ;Setup print dialog structure.
  615.     MOV EDI,OFFSET PD                   ;First, zero it.
  616.     XOR EAX,EAX
  617.     REP STOSB
  618.  
  619.     MOV PD.lStructSize,SIZEOF PD        ;Then init its fields.
  620.     MOV EAX,hWnd
  621.     MOV PD.hwndOwner,EAX
  622.     MOV EAX,hInst                       ;Process instance
  623.     MOV PD.hInstance,EAX
  624.     MOV PD.Flags,PD_RETURNDC or PD_USEDEVMODECOPIES or PD_COLLATE\
  625.                    or PD_NOSELECTION or PD_PRINTSETUP
  626.     INVOKE PrintDlg,
  627.              OFFSET PD                  ;Popup Print dialog.
  628.  
  629.       .IF EAX == TRUE                   ;If no error,
  630.       MOV DocI.cbSize,SIZEOF DocI
  631.       MOV DocI.lpszDocName,OFFSET PrintTitle
  632.       MOV DocI.lpszOutput,0
  633.       MOV DocI.fwType,0
  634.       INVOKE StartDoc,                  ;Start print job.
  635.                PD.hDC,
  636.                OFFSET DocI
  637.         .IF EAX > 0                     ;If succesful,
  638.         INVOKE StartPage,               ;Prepare printer driver.
  639.                  PD.hDC
  640.           .IF EAX > 0                   ;If OK,
  641.  
  642.           MOV Y,50                      ;Init loop count / y position.
  643.  
  644.             .REPEAT
  645.             INVOKE TextOut,             ;Print a line of text
  646.                      PD.hDC,            ;DC handle,
  647.                      40,                ;x,
  648.                      Y,                 ;y of starting position.
  649.                      OFFSET PrintMsg,   ;String to print,
  650.                      SIZEOF PrintMsg    ;length of string.
  651.             ADD Y,50                    ;Next "line".
  652.             .UNTIL Y > 50 * 50
  653.  
  654.           INVOKE EndPage,
  655.                    PD.hDC
  656.           .ENDIF
  657.  
  658.         INVOKE EndDoc,
  659.                  PD.hDC
  660.         .ENDIF
  661.  
  662.       INVOKE DeleteDC,
  663.                PD.hDC
  664.       .ENDIF
  665.  
  666.     XOR EAX,EAX
  667.     RET
  668.  
  669.     UnusedParm wMsg
  670.     UnusedParm wParam
  671.     UnusedParm lParam
  672.  
  673. WinProcCMD_ID_FILE_PRINT ENDP
  674.  
  675.     END
  676.