Hutch's
get a full set of prototypes for ASM in a fast and automated way
4 October 1998
Courtesy of fravia's pages of reverse engineering
(http://www.fravia.org)
fravia+,
I hope you are well, I am starting to see the small changes you are
making and it is a good idea...
I have pasted in at the bottom, the code for a MASM application skeleton
as I know you have an eye for assembler and I thought you may like the
use of the MASM pseudo/high level syntax. it compiles at 5.5k with a
menu & icon and I have some GDI graphics written into the test piece.
I found that there are no header files from M$ for MASM so instead of
writing them manually which would take years, I have written a special
purpose utility that raeds the function name out of the Platformsdk
libraries and converts them into PROTOTYPES.
It reads them in the form "_FunctionName@12" and converts them to the
form,
BeginUpdateResourceA PROTO :DWORD,:DWORD
BeginUpdateResource equ
BuildCommDCBA PROTO :DWORD,:DWORD
BuildCommDCB equ
BuildCommDCBAndTimeoutsA PROTO :DWORD,:DWORD,:DWORD
BuildCommDCBAndTimeouts equ
CallNamedPipeA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
CallNamedPipe equ
CancelIo PROTO :DWORD etc...
The idea is to be able to get a full set of prototypes for ASM in a fast
and automated way. The template pasted in below uses them. I have
attached the EXE which I hope gets to you. If not, give me a yell and I
will post it on my page for you.
Regards,
--
Steve Hutchesson
Sydney
Australia
;
#########################################################################
include w2.inc
include ..\include\winusr32.inc
include ..\include\wingdi32.inc
include ..\include\winknl32.inc
includelib j:\sdktools\lib\user32.lib
includelib j:\sdktools\lib\kernel32.lib
includelib j:\sdktools\lib\gdi32.lib
;
#########################################################################
; Equates
; ~~~~~~~
; COLORREF format colors. = 00-BB-GG-RR
; ~~~~~~~~~~~~~~~~~~~~~~
crRed equ 000000FFh
crGreen equ 0000FF00h
crBlue equ 00FF0000h
crWhite equ 00FFFFFFh
crBlack equ 00000000h
crGray equ 00808080h
crDgray equ 00404040h
crLgray equ 00B0B0B0h
; Local prototypes
; ~~~~~~~~~~~~~~~~
TopXY proto :DWORD, :DWORD
Paint_Proc proto :DWORD, :DWORD
FrameWin proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD
WinMain proto stdcall :DWORD, :DWORD, :DWORD, :DWORD
; Local macros
; ~~~~~~~~~~~~
szText MACRO Name, Text ; embedd zero terminated string
LOCAL lbl
jmp lbl
Name db Text,0
lbl:
ENDM
m2m MACRO M1, M2 ; memory to memory copy
push M2
pop M1
ENDM
return MACRO arg:VARARG ; return in eax & call ret
mov eax, arg
ret
ENDM
;
#########################################################################
.data
szDisplayName db "fravia, Cracking the 21st Century",0
hInstance dd 0 ; Useful as global variable
hWnd dd 0 ; Useful as global variable
CommandLine dd 0
.code
start:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke GetCommandLine
mov CommandLine, eax
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invoke ExitProcess,eax
;
#########################################################################
WinMain proc hInst :DWORD,
hPrevInst :DWORD,
CmdLine :DWORD,
CmdShow :DWORD
LOCAL wc :WNDCLASSEX
LOCAL msg :MSG
LOCAL Wwd :DWORD
LOCAL Wht :DWORD
LOCAL Wtx :DWORD
LOCAL Wty :DWORD
mov wc.cbSize, sizeof WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW \
or CS_BYTEALIGNWINDOW
mov wc.lpfnWndProc, offset WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, NULL
m2m wc.hInstance, hInst ; my macro, looks nicer !
mov wc.hbrBackground, COLOR_3DFACE+1
mov wc.lpszMenuName, NULL
mov wc.lpszClassName, offset szClassName
invoke LoadIcon,hInst,500 ; icon ID
mov wc.hIcon, eax
mov wc.hIconSm, 0
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor, eax
invoke RegisterClassEx, addr wc
mov Wwd, 500
mov Wht, 350
invoke GetSystemMetrics,SM_CXSCREEN
invoke TopXY,Wwd,eax
mov Wtx, eax
invoke GetSystemMetrics,SM_CYSCREEN
invoke TopXY,Wht,eax
mov Wty, eax
szText szClassName,"Template_Class"
invoke CreateWindowEx,WS_EX_OVERLAPPEDWINDOW,
ADDR szClassName,
ADDR szDisplayName,
WS_OVERLAPPEDWINDOW,
Wtx,Wty,Wwd,Wht,
NULL,NULL,
hInst,NULL
mov hWnd,eax
invoke LoadMenu,hInst,600 ; menu ID
invoke SetMenu,hWnd,eax
invoke ShowWindow,hWnd,SW_SHOWNORMAL
invoke UpdateWindow,hWnd
StartLoop:
invoke GetMessage,ADDR msg,NULL,0,0
cmp eax, 0
je ExitLoop
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
jmp StartLoop
ExitLoop:
return msg.wParam
WinMain endp
;
#########################################################################
WndProc proc hWin :DWORD,
uMsg :DWORD,
wParam :DWORD,
lParam :DWORD
LOCAL hDC :DWORD
LOCAL Rct :RECT
LOCAL Ps :PAINTSTRUCT
.if uMsg == WM_COMMAND
;======== menu commands ========
.if wParam == 1000
invoke SendMessage,hWin,WM_SYSCOMMAND,SC_CLOSE,NULL
.elseif wParam == 1900
szText TheMsg,"fravia, Cracking the 21st Century"
invoke MessageBox,hWin,ADDR TheMsg,ADDR szDisplayName,MB_OK
.endif
;====== end menu commands ======
.elseif uMsg == WM_PAINT
invoke BeginPaint,hWin,ADDR Ps
mov hDC, eax
invoke Paint_Proc,hWin,hDC
invoke EndPaint,hWin,ADDR Ps
return 0
.elseif uMsg == WM_CLOSE
szText TheText,"Please Confirm Exit"
invoke MessageBox,hWin,ADDR TheText,ADDR szDisplayName,MB_YESNO
.if eax == IDNO
return 0
.endif
.elseif uMsg == WM_DESTROY
invoke PostQuitMessage,NULL
return 0
.endif
invoke DefWindowProc,hWin,uMsg,wParam,lParam
ret
WndProc endp
;
########################################################################
TopXY proc wDim:DWORD, sDim:DWORD
shr sDim, 1 ; divide screen dimension by 2
shr wDim, 1 ; divide window dimension by 2
mov eax, wDim ; copy window dimension into eax
sub sDim, eax ; sub half win dimension from half screen dimension
return sDim
TopXY endp
;
########################################################################
Paint_Proc proc hWin:DWORD, hDC:DWORD
LOCAL btn_hi :DWORD
LOCAL btn_lo :DWORD
invoke GetSysColor,20
mov btn_hi, eax
invoke GetSysColor,21
mov btn_lo, eax
invoke FrameWin,hWin, hDC, btn_hi, btn_lo, 2
invoke FrameWin,hWin, hDC, btn_lo, btn_hi, 4
invoke FrameWin,hWin, hDC, btn_hi, btn_lo, 7
return 0
Paint_Proc endp
;
########################################################################
FrameWin proc hWin:DWORD,hDC:DWORD,
btn_hi:DWORD,btn_lo:DWORD,step:DWORD
LOCAL Rct :RECT
LOCAL rv :DWORD
LOCAL var :DWORD
LOCAL hPen :DWORD
LOCAL hPen2 :DWORD
LOCAL hpenOld :DWORD
invoke GetClientRect,hWin,ADDR Rct
m2m var, step
mov eax, var
sub Rct.right, eax
mov eax, var
sub Rct.bottom, eax
invoke CreatePen,0,1,btn_hi
mov hPen, eax
invoke SelectObject,hDC,hPen
mov hpenOld, eax
invoke MoveToEx,hDC,var,var,NULL
invoke LineTo,hDC,Rct.right,var
invoke MoveToEx,hDC,var,var,NULL
invoke LineTo,hDC,var,Rct.bottom
invoke CreatePen,0,1,btn_lo
mov hPen2, eax
invoke SelectObject,hDC,hPen2
mov hPen, eax
invoke DeleteObject,hPen
invoke MoveToEx,hDC,var,Rct.bottom,NULL
invoke LineTo,hDC,Rct.right,Rct.bottom
invoke MoveToEx,hDC,Rct.right,var,NULL
inc Rct.bottom
invoke LineTo,hDC,Rct.right,Rct.bottom
invoke SelectObject,hDC,hpenOld
invoke DeleteObject,hPen2
return 0
FrameWin endp
;
#########################################################################
end start
hutch(at)pbq(point)com(point)au