format PE GUI 4.0
entry start

include '%fasminc%\win32a.inc'
include 'constant.txt'

; -------------------------------------
section '.data' data readable writeable
; -------------------------------------
hmodule		dd ?
wtitle		db 'Sleepsleep Patch',0
wclsname	db 'SLEEPSLEEP',0
wcls		WNDCLASS
wmsg		MSG
wh		dd ?

d1		db '------ WM_CREATE called',0
d2		db '------ UM_FINDTARGETWINDOW called',0

targetTitle	db 'Untitled - Notepad',0
targetClsName	db 'Notepad',0
targetWndH	dd 0


; --------------------------------------
section '.text' code readable executable
; --------------------------------------
start:
	invoke	GetModuleHandle,NULL
		mov	[hmodule],eax
		mov	[wcls.hInstance],eax
		mov	[wcls.style],CS_HREDRAW + CS_VREDRAW
		mov	[wcls.lpfnWndProc],window_procedure
		mov	[wcls.lpszClassName],wclsname
		mov	[wcls.hbrBackground],COLOR_WINDOW + 1
	invoke	LoadIcon,NULL,IDI_APPLICATION
		mov	[wcls.hIcon],eax
	invoke	LoadCursor,NULL,IDC_ARROW
		mov	[wcls.hCursor],eax
	invoke	RegisterClass,wcls

	invoke	CreateWindowEx,0,wclsname,wtitle,WS_OVERLAPPEDWINDOW,\
		CW_USEDEFAULT,CW_USEDEFAULT,800,200,\
		NULL,NULL,[hmodule],NULL
		mov	[wh],eax

	invoke	ShowWindow,eax,SW_SHOW

	a1:
	invoke	GetMessage,wmsg,NULL,0,0
		or	eax,eax
		je	a2
	invoke	TranslateMessage,wmsg
	invoke	DispatchMessage,wmsg
		jmp	a1
	a2:

	invoke	ExitProcess,0



; ----------------------------------------------------------------
proc window_procedure uses ebx esi edi, hwnd, umsg, wparam, lparam
; ----------------------------------------------------------------
		cmp	[umsg],WM_DESTROY
		je	.wmdestroy
		cmp	[umsg],WM_CREATE
		je	.wmcreate
		cmp	[umsg],UM_FINDTARGETWINDOW
		je	.umfindtargetwindow

	.wmdefault:
	; ---------
		invoke	DefWindowProc,[hwnd],[umsg],[wparam],[lparam]
			jmp	.wmbye

	.wmcreate:
	; --------
		invoke	RegisterPatchHandle,[hwnd]
			jmp	.wmbye

	.umfindtargetwindow:
	; ------------------
		invoke	SetTimer,[hwnd],1000,3000,timer_findwindow
		invoke	OutputDebugString,d2
			jmp	.wmbye

	.wmdestroy:
	; ---------
		invoke	TargetQuits
		invoke	PostQuitMessage,0

	.wmbye:
	; -----
			ret
endp



; -----------------------------------------------
proc timer_findwindow hwnd, umsg, idevent, dwtime
; -----------------------------------------------
	invoke	FindWindow,targetClsName,targetTitle
		cmp	eax,NULL
		jne	.foundwanted
		ret

	.foundwanted:
	; -----------
		push	eax
		pop	[targetWndH]
	invoke	RegisterTargetHandle,eax
	invoke	KillTimer,[hwnd],1000
	invoke	TargetSubclass
		ret
endp



section '.idata' import data readable
; -----------------------------------
library	kernel32,	'kernel32.dll',\
	user32,		'user32.dll',\
	auto,		'auto.dll'

include '%fasminc%\api\kernel32.inc'
include '%fasminc%\api\user32.inc'
import	auto,\
		TargetQuits,			'TargetQuits',\
		RegisterPatchHandle,		'RegisterPatchHandle',\
		RegisterTargetHandle,		'RegisterTargetHandle',\
		TargetSubclass,			'TargetSubclass'