mirror of
https://github.com/mirkobrombin/raven.git
synced 2026-10-28 21:25:06 +00:00
71 lines
3.1 KiB
C
71 lines
3.1 KiB
C
#define WIN32_LEAN_AND_MEAN
|
|
#define UNICODE
|
|
#include <windows.h>
|
|
|
|
static unsigned events, failure, mode, depth;
|
|
static HWND current;
|
|
static HINSTANCE instance;
|
|
static const WCHAR name[]=L"RavenWindowContract";
|
|
__declspec(dllexport) volatile unsigned phase;
|
|
|
|
static LRESULT CALLBACK procedure(HWND window,UINT message,WPARAM wparam,LPARAM lparam)
|
|
{
|
|
if (!IsWindow(window) || !IsWindowUnicode(window)) failure=1;
|
|
if (message==WM_NCCREATE || message==WM_CREATE) {
|
|
CREATESTRUCTW *create=(CREATESTRUCTW *)lparam;
|
|
if (create->lpCreateParams!=(void *)0x12345678 || create->hInstance!=instance || create->hMenu || create->hwndParent ||
|
|
create->x!=12 || create->y!=23 || create->cx!=40 || create->cy!=50 || (DWORD)create->style!=WS_POPUP || create->dwExStyle)
|
|
failure=2;
|
|
if (message==WM_NCCREATE) { current=window; events|=1; return mode==1 ? FALSE : TRUE; }
|
|
events|=4;
|
|
return mode==2 ? -1 : 0;
|
|
}
|
|
if (message==WM_NCCALCSIZE) { events|=2; return 0; }
|
|
if (message==WM_DESTROY) { events|=8; return 0; }
|
|
if (message==WM_NCDESTROY) { events|=16; return 0; }
|
|
if (message==WM_USER+1) {
|
|
if (depth++) failure=3;
|
|
LRESULT nested=SendMessageW(window,WM_USER+2,wparam+1,lparam+2);
|
|
--depth;
|
|
return nested+3;
|
|
}
|
|
if (message==WM_USER+2) return (LRESULT)(wparam+(WPARAM)lparam);
|
|
return 0;
|
|
}
|
|
|
|
int raven_entry(void)
|
|
{
|
|
instance=GetModuleHandleW(NULL);
|
|
WNDCLASSEXW definition={0};
|
|
definition.cbSize=sizeof(definition); definition.lpfnWndProc=procedure;
|
|
definition.hInstance=instance; definition.lpszClassName=name;
|
|
ATOM atom=RegisterClassExW(&definition);
|
|
if (!atom) return 1;
|
|
SetLastError(71);
|
|
if (RegisterClassExW(&definition) || GetLastError()!=ERROR_CLASS_ALREADY_EXISTS) return 2;
|
|
HWND window=CreateWindowExW(0,MAKEINTATOM(atom),L"Owned window",WS_POPUP,12,23,40,50,NULL,NULL,instance,(void *)0x12345678);
|
|
if (!window || window!=current || failure || (events & 7)!=7) return 3;
|
|
SetLastError(71);
|
|
if (UnregisterClassW(name,instance) || GetLastError()!=ERROR_CLASS_HAS_WINDOWS) return 4;
|
|
if (SendMessageW(window,WM_USER+1,0x1122334455667700ULL,0x101)!=0x1122334455667807ULL || failure || depth) return 5;
|
|
if (!DestroyWindow(window) || IsWindow(window) || failure || (events & 31)!=31) return 6;
|
|
phase=1;
|
|
mode=1; events=0;
|
|
if (CreateWindowExW(0,name,NULL,WS_POPUP,12,23,40,50,NULL,NULL,instance,(void *)0x12345678) || IsWindow(current)) return 7;
|
|
if (events!=17 || failure) return 8;
|
|
mode=2; events=0;
|
|
if (CreateWindowExW(0,name,NULL,WS_POPUP,12,23,40,50,NULL,NULL,instance,(void *)0x12345678) || IsWindow(current)) return 9;
|
|
if (events!=23 || failure) return 10;
|
|
if (!UnregisterClassW(MAKEINTATOM(atom),instance)) return 11;
|
|
SetLastError(71);
|
|
if (SendMessageW(current,WM_USER+2,1,2) || GetLastError()!=ERROR_INVALID_WINDOW_HANDLE) return 12;
|
|
SetLastError(71);
|
|
if (DestroyWindow(current) || GetLastError()!=ERROR_ACCESS_DENIED) return 13;
|
|
WNDCLASSW basic={0};
|
|
basic.hInstance=instance; basic.lpfnWndProc=procedure; basic.lpszClassName=L"RavenBasicClass";
|
|
ATOM basic_atom=RegisterClassW(&basic);
|
|
if (!basic_atom || !UnregisterClassW(MAKEINTATOM(basic_atom),instance)) return 14;
|
|
phase=2;
|
|
return 0;
|
|
}
|