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

  1.     Page 60,190
  2.     TITLE W32PUtil - Windows 95 prototype - Utility routines.
  3.  
  4.                 .586
  5.                 .MODEL FLAT,STDCALL
  6.  
  7.                 .NOLISTMACRO
  8.                 .NOLIST
  9.  
  10. UniCode         = 0
  11.  
  12.                 INCLUDE INSTR32.MAC
  13.  
  14.                 INCLUDE WIN32INC.EQU
  15.  
  16.                 INCLUDE KERNEL32.EQU
  17.                 INCLUDE USER32.EQU
  18.  
  19.                 .LIST
  20.  
  21. ; External references.
  22.  
  23.                 PAGE
  24.  
  25. ; ==========================================================================
  26. ; Give error message.
  27. ; On entry,
  28. ;   EAX => ASCIIZ error message,
  29. ; On exit,
  30. ;   EAX undefined, other registers unchanged.
  31. ; ==========================================================================
  32.  
  33.     .CONST
  34.  
  35. ErrorTitle BYTE 'Ka-Boooom!',0
  36.            ALIGN DWORD
  37.  
  38.     .CODE
  39.  
  40. ErrorBox        PROTO lpszErrorMsg:DWORD
  41. ErrorBox        PROC  PUBLIC lpszErrorMsg:DWORD
  42.  
  43.     INVOKE MessageBox,                  ;Complain to the user.
  44.              0,                         ;No owner window,
  45.              lpszErrorMsg,              ;user message,
  46.              OFFSET ErrorTitle,         ;dialog box title,
  47.              MB_OK                      ;wait for OK from user.
  48.  
  49.     RET
  50.  
  51. ErrorBox        ENDP
  52.  
  53. ; ==========================================================================
  54. ; Display system error message and return system error code.
  55. ; This function is reentrant (thread enabled).
  56. ; ==========================================================================
  57.  
  58.     .DATA
  59.  
  60.     .CODE
  61.  
  62. DisplayLastError PROTO
  63. DisplayLastError PROC PUBLIC USES EBX EDI ESI
  64.  
  65.     LOCAL lpszMessage:DWORD
  66.  
  67.  
  68.     INVOKE GetLastError                 ;See why.
  69.     MOV EBX,EAX                         ;Keep a copy of error code in EBX.
  70.                                         ;Get/Format system error message.
  71.                                         ;no lpSource format string,
  72.                                         ;MessageID from GetLastError,
  73.                                         ;no language ID,
  74.                                         ;pointer to message returned by fnc,
  75.                                         ;no use for buffer length,
  76.     INVOKE FormatMessage,               ;no use of arguments array.
  77.              FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM,
  78.              0,EBX,0,ADDR lpszMessage,0,0
  79.     INVOKE ErrorBox,                    ;Display error message.
  80.              lpszMessage
  81.     INVOKE LocalFree,                   ;Free memory allocated by
  82.              lpszMessage                ;FormatMessage.
  83.  
  84.     MOV EAX,EBX                         ;Restore error code.
  85. RET
  86.  
  87. DisplayLastError ENDP
  88.  
  89.  
  90. ; ==========================================================================
  91. ;  Convert bin number in EAX into (ECX) digit ASCII field at [EDI]
  92. ;  Non significant positions on the left appear as zeroes (e.g. 000012).
  93. ;  EAX = source integer,
  94. ;  ECX = number of bytes to output,
  95. ;  EDI = dest address
  96. ;  If output field is too small for input value, high order digits
  97. ;     are truncated and lost.
  98. ;  On exit,
  99. ;   EAX undefined,
  100. ;   all other registers unchanged.
  101. ; ==========================================================================
  102.  
  103. CvDec PROTO
  104. CvDec PROC PUBLIC USES EBX ECX EDX EDI
  105.       .IF ECX != 0                      ;Just exit if null (bad) length.
  106.       LEA EDI,[EDI][ECX]                ;Get EDI => past last digit in field.
  107.       MOV EBX,10                        ;Setup divisor.
  108.         .REPEAT
  109.         DEC EDI                         ;Point to previous ASCII slot,
  110.         XOR EDX,EDX                     ;EDX:EAX = Dividend.
  111.           .IF EAX != 0                  ;Save bunch of cycles if no more to divide.
  112.           DIV EBX                       ;EAX = EAX/10, EDX = remainder.
  113.           .ENDIF
  114.         OR DL,'0'                       ;Turn BCD digit to ASCII,
  115.         MOV [EDI],DL                    ;store ASCII digit,
  116.         DEC ECX                         ;decrement loop count,
  117.         .UNTIL ZERO?                    ;loop again if digit(s) left.
  118.       .ENDIF
  119.       RET
  120. CvDec ENDP
  121.  
  122.  
  123. ; ==========================================================================
  124. ;  Convert bin number in EAX into 2 digit ASCII field at [EDI]
  125. ;  EAX = source integer,
  126. ;  EDI = dest address
  127. ;  If output field is too small to hold input value, high order digits
  128. ;     are truncated and lost.
  129. ;  On exit,
  130. ;   EAX undefined,
  131. ;   all other registers unchanged.
  132. ; ==========================================================================
  133.  
  134. CvDec2 PROTO
  135. CvDec2 PROC PUBLIC USES ECX
  136.     MOV ECX,2
  137.     INVOKE CvDec
  138.     RET
  139. CvDec2 ENDP
  140.  
  141.  
  142.     END
  143.