Browse Source

windows bindings test

Thomas la Cour 1 year ago
parent
commit
32dcb3caef

+ 22 - 0
tests/core/sys/windows/test_kernel32.odin

@@ -0,0 +1,22 @@
+//+build windows
+package test_core_sys_windows
+
+import "base:intrinsics"
+import win32 "core:sys/windows"
+import "core:testing"
+
+@(test)
+lcid_to_local :: proc(t: ^testing.T) {
+	lcid: win32.LCID = win32.MAKELANGID(0x09, 0x02)
+	wname: [512]win32.WCHAR
+	cc := win32.LCIDToLocaleName(lcid, &wname[0], len(wname) - 1, 0)
+	testing.expectf(t, cc == 6, "%#x (should be: %#x)", u32(cc), 6)
+	if cc == 0 {return}
+	str, err := win32.wstring_to_utf8(win32.wstring(&wname), int(cc))
+	testing.expectf(t, err == .None, "%v (should be: %x)", err, 0)
+	exp :: "en-GB"
+	testing.expectf(t, str == exp, "%v (should be: %v)", str, exp)
+
+	cc2 := win32.LocaleNameToLCID(L("en-GB"), 0)
+	testing.expectf(t, cc2 == 0x809, "%#x (should be: %#x)", u32(cc2), 0x809)
+}

+ 67 - 0
tests/core/sys/windows/test_ole32.odin

@@ -0,0 +1,67 @@
+//+build windows
+package test_core_sys_windows
+
+import "base:intrinsics"
+import win32 "core:sys/windows"
+import "core:testing"
+
+@(test)
+string_from_clsid :: proc(t: ^testing.T) {
+	p: win32.LPOLESTR
+	hr := win32.StringFromCLSID(win32.CLSID_FileOpenDialog, &p)
+	defer if p != nil {win32.CoTaskMemFree(p)}
+
+	testing.expectf(t, win32.SUCCEEDED(hr), "%x (should be: %x)", u32(hr), 0)
+	testing.expectf(t, p != nil, "%v is nil", p)
+
+	str, err := win32.wstring_to_utf8(p, 38)
+	testing.expectf(t, err == .None, "%v (should be: %x)", err, 0)
+	exp :: "{DC1C5A9C-E88A-4DDE-A5A1-60F82A20AEF7}"
+	testing.expectf(t, str == exp, "%v (should be: %v)", str, exp)
+}
+
+@(test)
+clsid_from_string :: proc(t: ^testing.T) {
+	iid: win32.IID
+	hr := win32.CLSIDFromString(L("{D20BEEC4-5CA8-4905-AE3B-BF251EA09B53}"), &iid)
+	testing.expectf(t, win32.SUCCEEDED(hr), "%x (should be: %x)", u32(hr), 0)
+	exp := win32.FOLDERID_NetworkFolder
+	testing.expectf(t, iid == exp, "%v (should be: %v)", iid, exp)
+}
+
+@(test)
+string_from_iid :: proc(t: ^testing.T) {
+	p: win32.LPOLESTR
+	hr := win32.StringFromIID(win32.IID_IFileDialog, &p)
+	defer if p != nil {win32.CoTaskMemFree(p)}
+
+	testing.expectf(t, win32.SUCCEEDED(hr), "%x (should be: %x)", u32(hr), 0)
+	testing.expectf(t, p != nil, "%v is nil", p)
+
+	str, err := win32.wstring_to_utf8(p, 40)
+	testing.expectf(t, err == .None, "%v (should be: %x)", err, 0)
+	exp :: "{42F85136-DB7E-439C-85F1-E4075D135FC8}"
+	testing.expectf(t, str == exp, "%v (should be: %v)", str, exp)
+}
+
+@(test)
+iid_from_string :: proc(t: ^testing.T) {
+	iid: win32.IID
+	hr := win32.IIDFromString(L("{D20BEEC4-5CA8-4905-AE3B-BF251EA09B53}"), &iid)
+	testing.expectf(t, win32.SUCCEEDED(hr), "%x (should be: %x)", u32(hr), 0)
+	exp := win32.FOLDERID_NetworkFolder
+	testing.expectf(t, iid == exp, "%v (should be: %v)", iid, exp)
+}
+
+@(test)
+verify_coinit :: proc(t: ^testing.T) {
+	expect_value(t, win32.COINIT.MULTITHREADED, 0x00000000)
+	expect_value(t, win32.COINIT.APARTMENTTHREADED, 0x00000002)
+	expect_value(t, win32.COINIT.DISABLE_OLE1DDE, 0x00000004)
+	expect_value(t, win32.COINIT.SPEED_OVER_MEMORY, 0x00000008)
+}
+
+// hr := CoInitializeEx(nil, .MULTITHREADED);
+// testing.expectf(t, hr == 0, "%x (should be: %v)", u32(hr), 0)
+// assert(SUCCEEDED(hr))
+// defer CoUninitialize()

+ 112 - 0
tests/core/sys/windows/test_windows.odin

@@ -0,0 +1,112 @@
+//+build windows
+package test_core_sys_windows
+
+import "core:fmt"
+import "base:intrinsics"
+import "core:os"
+import "base:runtime"
+import win32 "core:sys/windows"
+import "core:testing"
+
+L :: intrinsics.constant_utf16_cstring
+
+TEST_count := 0
+TEST_fail  := 0
+
+t := &testing.T{}
+
+when ODIN_TEST {
+	expect  :: testing.expect
+	expectf :: testing.expectf
+	log     :: testing.log
+	fmt     :: fmt
+} else {
+	expect :: proc(t: ^testing.T, condition: bool, message: string, loc := #caller_location) {
+		TEST_count += 1
+		if !condition {
+			TEST_fail += 1
+			fmt.printf("[%v] %v\n", loc, message)
+			return
+		}
+	}
+	expectf :: proc(
+		t: ^testing.T, condition: bool, format: string, args: ..any, loc := #caller_location) {
+		TEST_count += 1
+		if !condition {
+			TEST_fail += 1
+			fmt.printf(format, ..args)
+			return
+		}
+	}
+	log :: proc(t: ^testing.T, v: any, loc := #caller_location) {
+		fmt.printf("[%v] ", loc)
+		fmt.printf("log: %v\n", v)
+	}
+}
+
+@(private)
+expect_size :: proc(t: ^testing.T, $act: typeid, exp: int, loc := #caller_location) {
+	expectf(t, size_of(act) == exp, "size_of(%v) should be %d was %d", typeid_of(act), exp, size_of(act), loc = loc)
+}
+
+@(private)
+expect_value :: proc(t: ^testing.T, #any_int act: u32, #any_int exp: u32, loc := #caller_location) {
+	expectf(t, act == exp, "0x%8X (should be: 0x%8X)", act, exp, loc = loc)
+}
+
+@(private)
+expect_value_64 :: proc(t: ^testing.T, #any_int act: u64, #any_int exp: u64, loc := #caller_location) {
+	expectf(t, act == exp, "0x%8X (should be: 0x%8X)", act, exp, loc = loc)
+}
+
+@(private)
+expect_value_int :: proc(t: ^testing.T, act, exp: int, loc := #caller_location) {
+	expectf(t, act == exp, "0x%8X (should be: 0x%8X)", act, exp, loc = loc)
+}
+
+@(private)
+expect_value_uintptr :: proc(t: ^testing.T, act: uintptr, exp: int, loc := #caller_location) {
+	expectf(t, act == uintptr(exp), "0x%8X (should be: 0x%8X)", act, uintptr(exp), loc = loc)
+}
+
+@(private)
+expect_value_str :: proc(t: ^testing.T, wact, wexp: win32.wstring, loc := #caller_location) {
+	act, exp: string
+	err: runtime.Allocator_Error
+	act, err = win32.wstring_to_utf8(wact, 16)
+	expectf(t, err == .None, "0x%8X (should be: 0x%8X)", err, 0, loc = loc)
+	exp, err = win32.wstring_to_utf8(wexp, 16)
+	expectf(t, err == .None, "0x%8X (should be: 0x%8X)", err, 0, loc = loc)
+	expectf(t, act == exp, "0x%8X (should be: 0x%8X)", act, exp, loc = loc)
+}
+
+main :: proc() {
+	verify_win32_type_sizes(t)
+	verify_macros(t)
+	verify_winnt(t)
+	verify_winuser(t)
+	verify_gdi32(t)
+	verify_winmm(t)
+	verify_advapi32(t)
+	verify_winnls(t)
+	verify_winreg(t)
+	verify_verrsrc(t)
+	verify_error_codes(t)
+	verify_error_helpers(t)
+
+	lcid_to_local(t)
+
+	string_from_clsid(t)
+	clsid_from_string(t)
+	string_from_iid(t)
+	iid_from_string(t)
+	verify_coinit(t)
+
+	make_hresult(t)
+	decode_hresult(t)
+
+	fmt.printf("%v/%v tests successful.\n", TEST_count - TEST_fail, TEST_count)
+	if TEST_fail > 0 {
+		os.exit(1)
+	}
+}

+ 698 - 0
tests/core/sys/windows/test_windows_generated.odin

@@ -0,0 +1,698 @@
+//+build windows
+package test_core_sys_windows // generated by win32gen
+
+import "core:testing"
+import win32 "core:sys/windows"
+
+@(test)
+verify_win32_type_sizes :: proc(t: ^testing.T) {
+	// minwindef.h
+	expect_size(t, win32.ULONG, 4)
+	expect_size(t, win32.PULONG, 8)
+	expect_size(t, win32.USHORT, 2)
+	expect_size(t, win32.PUSHORT, 8)
+	expect_size(t, win32.UCHAR, 1)
+	expect_size(t, win32.DWORD, 4)
+	expect_size(t, win32.BOOL, 4)
+	expect_size(t, win32.BYTE, 1)
+	expect_size(t, win32.WORD, 2)
+	expect_size(t, win32.PBOOL, 8)
+	expect_size(t, win32.LPBOOL, 8)
+	expect_size(t, win32.PBYTE, 8)
+	expect_size(t, win32.LPBYTE, 8)
+	expect_size(t, win32.PINT, 8)
+	expect_size(t, win32.LPINT, 8)
+	expect_size(t, win32.LPWORD, 8)
+	expect_size(t, win32.PDWORD, 8)
+	expect_size(t, win32.LPDWORD, 8)
+	expect_size(t, win32.LPVOID, 8)
+	expect_size(t, win32.LPCVOID, 8)
+	expect_size(t, win32.INT, 4)
+	expect_size(t, win32.UINT, 4)
+	expect_size(t, win32.PUINT, 8)
+	expect_size(t, win32.UINT_PTR, 8)
+	expect_size(t, win32.LONG_PTR, 8)
+	expect_size(t, win32.HANDLE, 8)
+	expect_size(t, win32.WPARAM, 8)
+	expect_size(t, win32.LPARAM, 8)
+	expect_size(t, win32.LRESULT, 8)
+	expect_size(t, win32.LPHANDLE, 8)
+	expect_size(t, win32.HGLOBAL, 8)
+	expect_size(t, win32.ATOM, 2)
+	expect_size(t, win32.HKEY, 8)
+	expect_size(t, win32.PHKEY, 8)
+	expect_size(t, win32.HINSTANCE, 8)
+	expect_size(t, win32.HMODULE, 8)
+	expect_size(t, win32.HRGN, 8)
+	expect_size(t, win32.HRSRC, 8)
+	// windef.h
+	expect_size(t, win32.HWND, 8)
+	expect_size(t, win32.HHOOK, 8)
+	expect_size(t, win32.HGDIOBJ, 8)
+	expect_size(t, win32.HBITMAP, 8)
+	expect_size(t, win32.HPALETTE, 8)
+	expect_size(t, win32.HBRUSH, 8)
+	expect_size(t, win32.HPEN, 8)
+	expect_size(t, win32.HFONT, 8)
+	expect_size(t, win32.HICON, 8)
+	expect_size(t, win32.HMENU, 8)
+	expect_size(t, win32.HCURSOR, 8)
+	expect_size(t, win32.COLORREF, 4)
+	expect_size(t, win32.RECT, 16)
+	expect_size(t, win32.POINT, 8)
+	expect_size(t, win32.SIZE, 8)
+	// wtypes.h
+	expect_size(t, win32.DECIMAL, 16)
+	// fileapi.h
+	expect_size(t, win32.WIN32_FILE_ATTRIBUTE_DATA, 36)
+	// libloaderapi.h
+	expect_size(t, win32.ENUMRESNAMEPROCW, 8)
+	expect_size(t, win32.ENUMRESTYPEPROCW, 8)
+	// minwinbase.h
+	expect_size(t, win32.SYSTEMTIME, 16)
+	expect_size(t, win32.WIN32_FIND_DATAW, 592)
+	expect_size(t, win32.CRITICAL_SECTION, 40)
+	expect_size(t, win32.REASON_CONTEXT, 32)
+	// guiddef.h
+	expect_size(t, win32.GUID, 16)
+	expect_size(t, win32.IID, 16)
+	expect_size(t, win32.CLSID, 16)
+	// combaseapi.h
+	expect_size(t, win32.SCODE, 4)
+	// commdlg.h
+	expect_size(t, win32.OPENFILENAMEW, 152)
+	// wtypesbase.h
+	expect_size(t, win32.OLECHAR, 2)
+}
+
+@(test)
+verify_macros :: proc(t: ^testing.T) {
+	// minwindef.h
+	expect_value(t, win32.MAKEWORD(1, 2), 0x00000201)
+	expect_value(t, win32.MAKEWORD(0x1111, 0x2222), 0x00002211)
+	expect_value(t, win32.MAKELONG(1, 2), 0x00020001)
+	expect_value(t, win32.MAKELONG(0x1111, 0x2222), 0x22221111)
+	expect_value(t, win32.LOWORD(0x12345678), 0x00005678)
+	expect_value(t, win32.HIWORD(0x12345678), 0x00001234)
+	expect_value(t, u32(win32.LOBYTE(0x1234)), 0x00000034)
+	expect_value(t, u32(win32.HIBYTE(0x1234)), 0x00000012)
+	// winuser.h
+	expect_value(t, win32.MAKEWPARAM(1, 2), 0x00020001)
+	expect_value(t, win32.MAKEWPARAM(0x1111, 0x2222), 0x22221111)
+	expect_value(t, win32.MAKELPARAM(1, 2), 0x00020001)
+	expect_value(t, win32.MAKELPARAM(0x1111, 0x2222), 0x22221111)
+	expect_value(t, win32.MAKELRESULT(1, 2), 0x00020001)
+	expect_value(t, win32.MAKELRESULT(0x1111, 0x2222), 0x22221111)
+	// winnt.h
+	expect_value(t, win32.MAKELCID(1, 2), 0x00020001)
+	expect_value(t, win32.MAKELCID(0x1111, 0x2222), 0x22221111)
+	expect_value(t, win32.MAKELANGID(1, 2), 0x00000801)
+	expect_value(t, win32.MAKELANGID(0x1111, 0x2222), 0x00889911)
+	expect_value(t, win32.LANGIDFROMLCID(0x12345678), 0x00005678)
+}
+
+@(test)
+verify_winnt :: proc(t: ^testing.T) {
+	// winnt.h
+	expect_size(t, win32.CHAR, 1)
+	expect_size(t, win32.SHORT, 2)
+	expect_size(t, win32.LONG, 4)
+	expect_size(t, win32.INT, 4)
+	expect_size(t, win32.WCHAR, 2)
+	expect_size(t, win32.ULONGLONG, 8)
+	expect_size(t, win32.LARGE_INTEGER, 8)
+	expect_size(t, win32.PLARGE_INTEGER, 8)
+	expect_size(t, win32.ULARGE_INTEGER, 8)
+	expect_size(t, win32.PULARGE_INTEGER, 8)
+	expect_size(t, win32.BOOLEAN, 1)
+	expect_size(t, win32.HANDLE, 8)
+	expect_size(t, win32.PHANDLE, 8)
+	expect_size(t, win32.HRESULT, 4)
+	expect_size(t, win32.LCID, 4)
+	expect_size(t, win32.LANGID, 2)
+	expect_size(t, win32.LUID, 8)
+	expect_size(t, win32.SECURITY_INFORMATION, 4)
+	expect_size(t, win32.ACCESS_MASK, 4)
+	expect_size(t, win32.REGSAM, 4)
+	expect_value(t, win32.LANG_NEUTRAL, 0x00000000)
+	expect_value(t, win32.LANG_INVARIANT, 0x0000007F)
+	expect_value(t, win32.SUBLANG_NEUTRAL, 0x00000000)
+	expect_value(t, win32.SUBLANG_DEFAULT, 0x00000001)
+}
+
+@(test)
+verify_winuser :: proc(t: ^testing.T) {
+	// winuser.h
+	expect_size(t, win32.USEROBJECTFLAGS, 12)
+	expect_size(t, win32.MSG, 48)
+	expect_size(t, win32.WINDOWPOS, 40)
+	expect_size(t, win32.ACCEL, 6)
+	expect_size(t, win32.MENUITEMINFOW, 80)
+	expect_size(t, win32.PAINTSTRUCT, 72)
+	expect_size(t, win32.CREATESTRUCTW, 80)
+	expect_size(t, win32.WINDOWPLACEMENT, 44)
+	expect_size(t, win32.MOUSEINPUT, 32)
+	expect_size(t, win32.KEYBDINPUT, 24)
+	expect_size(t, win32.HARDWAREINPUT, 8)
+	expect_size(t, win32.INPUT, 40)
+	expect_size(t, win32.ICONINFOEXW, 1080)
+	expect_size(t, win32.RAWINPUTHEADER, 24)
+	expect_size(t, win32.RAWHID, 12)
+	expect_size(t, win32.RAWMOUSE, 24)
+	expect_size(t, win32.RAWKEYBOARD, 16)
+	expect_size(t, win32.RAWINPUT, 48)
+	expect_size(t, win32.RAWINPUTDEVICE, 16)
+	expect_size(t, win32.RAWINPUTDEVICELIST, 16)
+	expect_size(t, win32.RID_DEVICE_INFO_HID, 16)
+	expect_size(t, win32.RID_DEVICE_INFO_KEYBOARD, 24)
+	expect_size(t, win32.RID_DEVICE_INFO_MOUSE, 16)
+	expect_size(t, win32.RID_DEVICE_INFO, 32)
+	expect_size(t, win32.WINDOWINFO, 60)
+	expect_size(t, win32.DRAWTEXTPARAMS, 20)
+	expect_size(t, win32.BSMINFO, 32)
+	expect_value(t, win32.BROADCAST_QUERY_DENY, 0x424D5144)
+	expect_value_64(t, u64(win32.HWND_BROADCAST), 0x0000FFFF)
+	expect_value_64(t, u64(win32.HWND_MESSAGE), 0xFFFFFFFFFFFFFFFD)
+	expect_value_64(t, uintptr(win32.MAKEINTRESOURCEW(1)), 0x00000001)
+	expect_value_64(t, uintptr(win32.MAKEINTRESOURCEW(0x12345678)), 0x00005678)
+	expect_value_64(t, uintptr(win32.RT_CURSOR), 0x00000001)
+	expect_value_64(t, uintptr(win32.RT_BITMAP), 0x00000002)
+	expect_value_64(t, uintptr(win32.RT_ICON), 0x00000003)
+	expect_value_64(t, uintptr(win32.RT_MENU), 0x00000004)
+	expect_value_64(t, uintptr(win32.RT_DIALOG), 0x00000005)
+	expect_value_64(t, uintptr(win32.RT_STRING), 0x00000006)
+	expect_value_64(t, uintptr(win32.RT_FONTDIR), 0x00000007)
+	expect_value_64(t, uintptr(win32.RT_FONT), 0x00000008)
+	expect_value_64(t, uintptr(win32.RT_ACCELERATOR), 0x00000009)
+	expect_value_64(t, uintptr(win32.RT_RCDATA), 0x0000000A)
+	expect_value_64(t, uintptr(win32.RT_MESSAGETABLE), 0x0000000B)
+	expect_value_64(t, uintptr(win32.RT_GROUP_CURSOR), 0x0000000C)
+	expect_value_64(t, uintptr(win32.RT_GROUP_ICON), 0x0000000E)
+	expect_value_64(t, uintptr(win32.RT_VERSION), 0x00000010)
+	expect_value_64(t, uintptr(win32.RT_DLGINCLUDE), 0x00000011)
+	expect_value_64(t, uintptr(win32.RT_PLUGPLAY), 0x00000013)
+	expect_value_64(t, uintptr(win32.RT_VXD), 0x00000014)
+	expect_value_64(t, uintptr(win32.RT_ANICURSOR), 0x00000015)
+	expect_value_64(t, uintptr(win32.RT_ANIICON), 0x00000016)
+	expect_value_64(t, uintptr(win32.RT_MANIFEST), 0x00000018)
+	expect_value_64(t, uintptr(win32.CREATEPROCESS_MANIFEST_RESOURCE_ID), 0x00000001)
+	expect_value_64(t, uintptr(win32.ISOLATIONAWARE_MANIFEST_RESOURCE_ID), 0x00000002)
+	expect_value_64(t, uintptr(win32.ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID), 0x00000003)
+	expect_value_64(t, uintptr(win32.ISOLATIONPOLICY_MANIFEST_RESOURCE_ID), 0x00000004)
+	expect_value_64(t, uintptr(win32.ISOLATIONPOLICY_BROWSER_MANIFEST_RESOURCE_ID), 0x00000005)
+	expect_value_64(t, uintptr(win32.MINIMUM_RESERVED_MANIFEST_RESOURCE_ID), 0x00000001)
+	expect_value_64(t, uintptr(win32.MAXIMUM_RESERVED_MANIFEST_RESOURCE_ID), 0x00000010)
+	expect_value(t, win32.SM_CXICON, 0x0000000B)
+	expect_value(t, win32.SM_CYICON, 0x0000000C)
+	expect_value(t, win32.LR_DEFAULTCOLOR, 0x00000000)
+	expect_value(t, win32.LR_MONOCHROME, 0x00000001)
+	expect_value(t, win32.LR_COLOR, 0x00000002)
+	expect_value(t, win32.LR_COPYRETURNORG, 0x00000004)
+	expect_value(t, win32.LR_COPYDELETEORG, 0x00000008)
+	expect_value(t, win32.LR_LOADFROMFILE, 0x00000010)
+	expect_value(t, win32.LR_LOADTRANSPARENT, 0x00000020)
+	expect_value(t, win32.LR_DEFAULTSIZE, 0x00000040)
+	expect_value(t, win32.LR_VGACOLOR, 0x00000080)
+	expect_value(t, win32.LR_LOADMAP3DCOLORS, 0x00001000)
+	expect_value(t, win32.LR_CREATEDIBSECTION, 0x00002000)
+	expect_value(t, win32.LR_COPYFROMRESOURCE, 0x00004000)
+	expect_value(t, win32.LR_SHARED, 0x00008000)
+	expect_value(t, win32.NIM_ADD, 0x00000000)
+	expect_value(t, win32.NIM_MODIFY, 0x00000001)
+	expect_value(t, win32.NIM_DELETE, 0x00000002)
+	expect_value(t, win32.NIM_SETFOCUS, 0x00000003)
+	expect_value(t, win32.NIM_SETVERSION, 0x00000004)
+	expect_value(t, win32.NIF_MESSAGE, 0x00000001)
+	expect_value(t, win32.NIF_ICON, 0x00000002)
+	expect_value(t, win32.NIF_TIP, 0x00000004)
+	expect_value(t, win32.NIF_STATE, 0x00000008)
+	expect_value(t, win32.NIF_INFO, 0x00000010)
+	expect_value(t, win32.NIF_GUID, 0x00000020)
+	expect_value(t, win32.NIF_REALTIME, 0x00000040)
+	expect_value(t, win32.NIF_SHOWTIP, 0x00000080)
+	expect_value(t, win32.MF_INSERT, 0x00000000)
+	expect_value(t, win32.MF_CHANGE, 0x00000080)
+	expect_value(t, win32.MF_APPEND, 0x00000100)
+	expect_value(t, win32.MF_DELETE, 0x00000200)
+	expect_value(t, win32.MF_REMOVE, 0x00001000)
+	expect_value(t, win32.MF_BYCOMMAND, 0x00000000)
+	expect_value(t, win32.MF_BYPOSITION, 0x00000400)
+	expect_value(t, win32.MF_SEPARATOR, 0x00000800)
+	expect_value(t, win32.MF_ENABLED, 0x00000000)
+	expect_value(t, win32.MF_GRAYED, 0x00000001)
+	expect_value(t, win32.MF_DISABLED, 0x00000002)
+	expect_value(t, win32.MF_UNCHECKED, 0x00000000)
+	expect_value(t, win32.MF_CHECKED, 0x00000008)
+	expect_value(t, win32.MF_USECHECKBITMAPS, 0x00000200)
+	expect_value(t, win32.MF_STRING, 0x00000000)
+	expect_value(t, win32.MF_BITMAP, 0x00000004)
+	expect_value(t, win32.MF_OWNERDRAW, 0x00000100)
+	expect_value(t, win32.MF_POPUP, 0x00000010)
+	expect_value(t, win32.MF_MENUBARBREAK, 0x00000020)
+	expect_value(t, win32.MF_MENUBREAK, 0x00000040)
+	expect_value(t, win32.MF_UNHILITE, 0x00000000)
+	expect_value(t, win32.MF_HILITE, 0x00000080)
+	expect_value(t, win32.MF_DEFAULT, 0x00001000)
+	expect_value(t, win32.MF_SYSMENU, 0x00002000)
+	expect_value(t, win32.MF_HELP, 0x00004000)
+	expect_value(t, win32.MF_RIGHTJUSTIFY, 0x00004000)
+	expect_value(t, win32.MF_MOUSESELECT, 0x00008000)
+	expect_value(t, win32.MF_END, 0x00000080)
+	expect_value(t, win32.MFS_GRAYED, 0x00000003)
+	expect_value(t, win32.MFS_DISABLED, 0x00000003)
+	expect_value(t, win32.MFS_CHECKED, 0x00000008)
+	expect_value(t, win32.MFS_HILITE, 0x00000080)
+	expect_value(t, win32.MFS_ENABLED, 0x00000000)
+	expect_value(t, win32.MFS_UNCHECKED, 0x00000000)
+	expect_value(t, win32.MFS_UNHILITE, 0x00000000)
+	expect_value(t, win32.MFS_DEFAULT, 0x00001000)
+	expect_value(t, win32.TPM_LEFTBUTTON, 0x00000000)
+	expect_value(t, win32.TPM_RIGHTBUTTON, 0x00000002)
+	expect_value(t, win32.TPM_LEFTALIGN, 0x00000000)
+	expect_value(t, win32.TPM_CENTERALIGN, 0x00000004)
+	expect_value(t, win32.TPM_RIGHTALIGN, 0x00000008)
+	expect_value(t, win32.TPM_TOPALIGN, 0x00000000)
+	expect_value(t, win32.TPM_VCENTERALIGN, 0x00000010)
+	expect_value(t, win32.TPM_BOTTOMALIGN, 0x00000020)
+	expect_value(t, win32.TPM_HORIZONTAL, 0x00000000)
+	expect_value(t, win32.TPM_VERTICAL, 0x00000040)
+	expect_value(t, win32.TPM_NONOTIFY, 0x00000080)
+	expect_value(t, win32.TPM_RETURNCMD, 0x00000100)
+	expect_value(t, win32.TPM_RECURSE, 0x00000001)
+	expect_value(t, win32.TPM_HORPOSANIMATION, 0x00000400)
+	expect_value(t, win32.TPM_HORNEGANIMATION, 0x00000800)
+	expect_value(t, win32.TPM_VERPOSANIMATION, 0x00001000)
+	expect_value(t, win32.TPM_VERNEGANIMATION, 0x00002000)
+	expect_value(t, win32.TPM_NOANIMATION, 0x00004000)
+	expect_value(t, win32.TPM_LAYOUTRTL, 0x00008000)
+	expect_value(t, win32.TPM_WORKAREA, 0x00010000)
+	expect_value(t, win32.MIIM_STATE, 0x00000001)
+	expect_value(t, win32.MIIM_ID, 0x00000002)
+	expect_value(t, win32.MIIM_SUBMENU, 0x00000004)
+	expect_value(t, win32.MIIM_CHECKMARKS, 0x00000008)
+	expect_value(t, win32.MIIM_TYPE, 0x00000010)
+	expect_value(t, win32.MIIM_DATA, 0x00000020)
+	expect_value(t, win32.MIIM_STRING, 0x00000040)
+	expect_value(t, win32.MIIM_BITMAP, 0x00000080)
+	expect_value(t, win32.MIIM_FTYPE, 0x00000100)
+	expect_value(t, win32.ANSI_CHARSET, 0x00000000)
+	expect_value(t, win32.DEFAULT_CHARSET, 0x00000001)
+	expect_value(t, win32.SYMBOL_CHARSET, 0x00000002)
+	expect_value(t, win32.SHIFTJIS_CHARSET, 0x00000080)
+	expect_value(t, win32.HANGEUL_CHARSET, 0x00000081)
+	expect_value(t, win32.HANGUL_CHARSET, 0x00000081)
+	expect_value(t, win32.GB2312_CHARSET, 0x00000086)
+	expect_value(t, win32.CHINESEBIG5_CHARSET, 0x00000088)
+	expect_value(t, win32.OEM_CHARSET, 0x000000FF)
+	expect_value(t, win32.JOHAB_CHARSET, 0x00000082)
+	expect_value(t, win32.HEBREW_CHARSET, 0x000000B1)
+	expect_value(t, win32.ARABIC_CHARSET, 0x000000B2)
+	expect_value(t, win32.GREEK_CHARSET, 0x000000A1)
+	expect_value(t, win32.TURKISH_CHARSET, 0x000000A2)
+	expect_value(t, win32.VIETNAMESE_CHARSET, 0x000000A3)
+	expect_value(t, win32.THAI_CHARSET, 0x000000DE)
+	expect_value(t, win32.EASTEUROPE_CHARSET, 0x000000EE)
+	expect_value(t, win32.RUSSIAN_CHARSET, 0x000000CC)
+	expect_value(t, win32.MAC_CHARSET, 0x0000004D)
+	expect_value(t, win32.BALTIC_CHARSET, 0x000000BA)
+	expect_value(t, win32.FS_LATIN1, 0x00000001)
+	expect_value(t, win32.FS_LATIN2, 0x00000002)
+	expect_value(t, win32.FS_CYRILLIC, 0x00000004)
+	expect_value(t, win32.FS_GREEK, 0x00000008)
+	expect_value(t, win32.FS_TURKISH, 0x00000010)
+	expect_value(t, win32.FS_HEBREW, 0x00000020)
+	expect_value(t, win32.FS_ARABIC, 0x00000040)
+	expect_value(t, win32.FS_BALTIC, 0x00000080)
+	expect_value(t, win32.FS_VIETNAMESE, 0x00000100)
+	expect_value(t, win32.FS_THAI, 0x00010000)
+	expect_value(t, win32.FS_JISJAPAN, 0x00020000)
+	expect_value(t, win32.FS_CHINESESIMP, 0x00040000)
+	expect_value(t, win32.FS_WANSUNG, 0x00080000)
+	expect_value(t, win32.FS_CHINESETRAD, 0x00100000)
+	expect_value(t, win32.FS_JOHAB, 0x00200000)
+	expect_value(t, win32.FS_SYMBOL, 0x80000000)
+	expect_value(t, win32.OUT_DEFAULT_PRECIS, 0x00000000)
+	expect_value(t, win32.OUT_STRING_PRECIS, 0x00000001)
+	expect_value(t, win32.OUT_CHARACTER_PRECIS, 0x00000002)
+	expect_value(t, win32.OUT_STROKE_PRECIS, 0x00000003)
+	expect_value(t, win32.OUT_TT_PRECIS, 0x00000004)
+	expect_value(t, win32.OUT_DEVICE_PRECIS, 0x00000005)
+	expect_value(t, win32.OUT_RASTER_PRECIS, 0x00000006)
+	expect_value(t, win32.OUT_TT_ONLY_PRECIS, 0x00000007)
+	expect_value(t, win32.OUT_OUTLINE_PRECIS, 0x00000008)
+	expect_value(t, win32.OUT_SCREEN_OUTLINE_PRECIS, 0x00000009)
+	expect_value(t, win32.OUT_PS_ONLY_PRECIS, 0x0000000A)
+	expect_value(t, win32.CLIP_DEFAULT_PRECIS, 0x00000000)
+	expect_value(t, win32.CLIP_CHARACTER_PRECIS, 0x00000001)
+	expect_value(t, win32.CLIP_STROKE_PRECIS, 0x00000002)
+	expect_value(t, win32.CLIP_MASK, 0x0000000F)
+	expect_value(t, win32.CLIP_LH_ANGLES, 0x00000010)
+	expect_value(t, win32.CLIP_TT_ALWAYS, 0x00000020)
+	expect_value(t, win32.CLIP_DFA_DISABLE, 0x00000040)
+	expect_value(t, win32.CLIP_EMBEDDED, 0x00000080)
+	expect_value(t, win32.DEFAULT_QUALITY, 0x00000000)
+	expect_value(t, win32.DRAFT_QUALITY, 0x00000001)
+	expect_value(t, win32.PROOF_QUALITY, 0x00000002)
+	expect_value(t, win32.NONANTIALIASED_QUALITY, 0x00000003)
+	expect_value(t, win32.ANTIALIASED_QUALITY, 0x00000004)
+	expect_value(t, win32.CLEARTYPE_QUALITY, 0x00000005)
+	expect_value(t, win32.CLEARTYPE_NATURAL_QUALITY, 0x00000006)
+	expect_value(t, win32.DEFAULT_PITCH, 0x00000000)
+	expect_value(t, win32.FIXED_PITCH, 0x00000001)
+	expect_value(t, win32.VARIABLE_PITCH, 0x00000002)
+	expect_value(t, win32.MONO_FONT, 0x00000008)
+	expect_value(t, win32.FF_DONTCARE, 0x00000000)
+	expect_value(t, win32.FF_ROMAN, 0x00000010)
+	expect_value(t, win32.FF_SWISS, 0x00000020)
+	expect_value(t, win32.FF_MODERN, 0x00000030)
+	expect_value(t, win32.FF_SCRIPT, 0x00000040)
+	expect_value(t, win32.FF_DECORATIVE, 0x00000050)
+}
+
+@(test)
+verify_gdi32 :: proc(t: ^testing.T) {
+	// wingdi.h
+	expect_size(t, win32.DEVMODEW, 220)
+	expect_size(t, win32.RGBQUAD, 4)
+	expect_size(t, win32.PIXELFORMATDESCRIPTOR, 40)
+	expect_size(t, win32.BITMAPINFOHEADER, 40)
+	expect_size(t, win32.BITMAP, 32)
+	expect_size(t, win32.BITMAPV5HEADER, 124)
+	expect_size(t, win32.CIEXYZTRIPLE, 36)
+	expect_size(t, win32.CIEXYZ, 12)
+	expect_size(t, win32.FXPT2DOT30, 4)
+	expect_size(t, win32.TEXTMETRICW, 60)
+	expect_size(t, win32.POINTFLOAT, 8)
+	expect_size(t, win32.GLYPHMETRICSFLOAT, 24)
+	expect_size(t, win32.PALETTEENTRY, 4)
+	expect_size(t, win32.DESIGNVECTOR, 72)
+	expect_value(t, win32.LF_FACESIZE, 0x00000020)
+	expect_value(t, win32.LF_FULLFACESIZE, 0x00000040)
+	expect_size(t, win32.LOGFONTW, 92)
+	expect_size(t, win32.ENUMLOGFONTW, 284)
+	expect_size(t, win32.ENUMLOGFONTEXW, 348)
+	expect_size(t, win32.ENUMLOGFONTEXDVW, 420)
+	expect_size(t, win32.NEWTEXTMETRICW, 76)
+	expect_size(t, win32.LAYERPLANEDESCRIPTOR, 32)
+	expect_size(t, win32.COLOR16, 2)
+	expect_size(t, win32.TRIVERTEX, 16)
+	expect_size(t, win32.GRADIENT_TRIANGLE, 12)
+	expect_size(t, win32.GRADIENT_RECT, 8)
+	expect_size(t, win32.BLENDFUNCTION, 4)
+	expect_size(t, win32.DISPLAY_DEVICEW, 840)
+	expect_value(t, win32.AC_SRC_OVER, 0x00000000)
+	expect_value(t, win32.AC_SRC_ALPHA, 0x00000001)
+	expect_value(t, win32.RGB(12, 34, 56), 0x0038220C)
+	expect_value(t, win32.PALETTERGB(12, 34, 56), 0x0238220C)
+	expect_value(t, win32.PALETTEINDEX(123), 0x0100007B)
+	expect_value(t, win32.GRADIENT_FILL_RECT_H, 0x00000000)
+	expect_value(t, win32.GRADIENT_FILL_RECT_V, 0x00000001)
+	expect_value(t, win32.GRADIENT_FILL_TRIANGLE, 0x00000002)
+	expect_value(t, win32.BS_SOLID, 0x00000000)
+	expect_value(t, win32.BS_NULL, 0x00000001)
+	expect_value(t, win32.BS_HOLLOW, 0x00000001)
+	expect_value(t, win32.BS_HATCHED, 0x00000002)
+	expect_value(t, win32.BS_PATTERN, 0x00000003)
+	expect_value(t, win32.BS_INDEXED, 0x00000004)
+	expect_value(t, win32.BS_DIBPATTERN, 0x00000005)
+	expect_value(t, win32.BS_DIBPATTERNPT, 0x00000006)
+	expect_value(t, win32.BS_PATTERN8X8, 0x00000007)
+	expect_value(t, win32.BS_DIBPATTERN8X8, 0x00000008)
+	expect_value(t, win32.BS_MONOPATTERN, 0x00000009)
+	expect_value(t, win32.HS_HORIZONTAL, 0x00000000)
+	expect_value(t, win32.HS_VERTICAL, 0x00000001)
+	expect_value(t, win32.HS_FDIAGONAL, 0x00000002)
+	expect_value(t, win32.HS_BDIAGONAL, 0x00000003)
+	expect_value(t, win32.HS_CROSS, 0x00000004)
+	expect_value(t, win32.HS_DIAGCROSS, 0x00000005)
+	expect_value(t, win32.HS_API_MAX, 0x0000000C)
+	expect_value(t, win32.PS_SOLID, 0x00000000)
+	expect_value(t, win32.PS_DASH, 0x00000001)
+	expect_value(t, win32.PS_DOT, 0x00000002)
+	expect_value(t, win32.PS_DASHDOT, 0x00000003)
+	expect_value(t, win32.PS_DASHDOTDOT, 0x00000004)
+	expect_value(t, win32.PS_NULL, 0x00000005)
+	expect_value(t, win32.PS_INSIDEFRAME, 0x00000006)
+	expect_value(t, win32.PS_USERSTYLE, 0x00000007)
+	expect_value(t, win32.PS_ALTERNATE, 0x00000008)
+	expect_value(t, win32.PS_STYLE_MASK, 0x0000000F)
+	expect_value(t, win32.PS_ENDCAP_ROUND, 0x00000000)
+	expect_value(t, win32.PS_ENDCAP_SQUARE, 0x00000100)
+	expect_value(t, win32.PS_ENDCAP_FLAT, 0x00000200)
+	expect_value(t, win32.PS_ENDCAP_MASK, 0x00000F00)
+	expect_value(t, win32.PS_JOIN_ROUND, 0x00000000)
+	expect_value(t, win32.PS_JOIN_BEVEL, 0x00001000)
+	expect_value(t, win32.PS_JOIN_MITER, 0x00002000)
+	expect_value(t, win32.PS_COSMETIC, 0x00000000)
+	expect_value(t, win32.PS_GEOMETRIC, 0x00010000)
+	expect_value(t, win32.PS_TYPE_MASK, 0x000F0000)
+	// Binary raster ops
+	expect_value(t, win32.R2_BLACK, 0x00000001)
+	expect_value(t, win32.R2_NOTMERGEPEN, 0x00000002)
+	expect_value(t, win32.R2_MASKNOTPEN, 0x00000003)
+	expect_value(t, win32.R2_NOTCOPYPEN, 0x00000004)
+	expect_value(t, win32.R2_MASKPENNOT, 0x00000005)
+	expect_value(t, win32.R2_NOT, 0x00000006)
+	expect_value(t, win32.R2_XORPEN, 0x00000007)
+	expect_value(t, win32.R2_NOTMASKPEN, 0x00000008)
+	expect_value(t, win32.R2_MASKPEN, 0x00000009)
+	expect_value(t, win32.R2_NOTXORPEN, 0x0000000A)
+	expect_value(t, win32.R2_NOP, 0x0000000B)
+	expect_value(t, win32.R2_MERGENOTPEN, 0x0000000C)
+	expect_value(t, win32.R2_COPYPEN, 0x0000000D)
+	expect_value(t, win32.R2_MERGEPENNOT, 0x0000000E)
+	expect_value(t, win32.R2_MERGEPEN, 0x0000000F)
+	expect_value(t, win32.R2_WHITE, 0x00000010)
+	// Ternary raster operations
+	expect_value(t, win32.SRCCOPY, 0x00CC0020)
+	expect_value(t, win32.SRCPAINT, 0x00EE0086)
+	expect_value(t, win32.SRCAND, 0x008800C6)
+	expect_value(t, win32.SRCINVERT, 0x00660046)
+	expect_value(t, win32.SRCERASE, 0x00440328)
+	expect_value(t, win32.NOTSRCCOPY, 0x00330008)
+	expect_value(t, win32.NOTSRCERASE, 0x001100A6)
+	expect_value(t, win32.MERGECOPY, 0x00C000CA)
+	expect_value(t, win32.MERGEPAINT, 0x00BB0226)
+	expect_value(t, win32.PATCOPY, 0x00F00021)
+	expect_value(t, win32.PATPAINT, 0x00FB0A09)
+	expect_value(t, win32.PATINVERT, 0x005A0049)
+	expect_value(t, win32.DSTINVERT, 0x00550009)
+	expect_value(t, win32.BLACKNESS, 0x00000042)
+	expect_value(t, win32.WHITENESS, 0x00FF0062)
+	expect_value(t, win32.NOMIRRORBITMAP, 0x80000000)
+	expect_value(t, win32.CAPTUREBLT, 0x40000000)
+	// Region Flags
+	expect_value(t, win32.ERROR, 0x00000000)
+	expect_value(t, win32.NULLREGION, 0x00000001)
+	expect_value(t, win32.SIMPLEREGION, 0x00000002)
+	expect_value(t, win32.COMPLEXREGION, 0x00000003)
+	expect_value(t, win32.RGN_ERROR, 0x00000000)
+	// CombineRgn() Styles
+	expect_value(t, win32.RGN_AND, 0x00000001)
+	expect_value(t, win32.RGN_OR, 0x00000002)
+	expect_value(t, win32.RGN_XOR, 0x00000003)
+	expect_value(t, win32.RGN_DIFF, 0x00000004)
+	expect_value(t, win32.RGN_COPY, 0x00000005)
+	// StretchBlt() Modes
+	expect_value(t, win32.BLACKONWHITE, 0x00000001)
+	expect_value(t, win32.WHITEONBLACK, 0x00000002)
+	expect_value(t, win32.COLORONCOLOR, 0x00000003)
+	expect_value(t, win32.HALFTONE, 0x00000004)
+	// PolyFill() Modes
+	expect_value(t, win32.ALTERNATE, 0x00000001)
+	expect_value(t, win32.WINDING, 0x00000002)
+	// Layout Orientation Options
+	expect_value(t, win32.LAYOUT_RTL, 0x00000001)
+	expect_value(t, win32.LAYOUT_BTT, 0x00000002)
+	expect_value(t, win32.LAYOUT_VBH, 0x00000004)
+	expect_value(t, win32.LAYOUT_ORIENTATIONMASK, 0x00000007)
+	// Text Alignment Options
+	expect_value(t, win32.TA_NOUPDATECP, 0x00000000)
+	expect_value(t, win32.TA_UPDATECP, 0x00000001)
+	expect_value(t, win32.TA_LEFT, 0x00000000)
+	expect_value(t, win32.TA_RIGHT, 0x00000002)
+	expect_value(t, win32.TA_CENTER, 0x00000006)
+	expect_value(t, win32.TA_TOP, 0x00000000)
+	expect_value(t, win32.TA_BOTTOM, 0x00000008)
+	expect_value(t, win32.TA_BASELINE, 0x00000018)
+	expect_value(t, win32.TA_RTLREADING, 0x00000100)
+	expect_value(t, win32.TA_MASK, 0x0000011F)
+}
+
+@(test)
+verify_winmm :: proc(t: ^testing.T) {
+	// timeapi.h
+	expect_size(t, win32.TIMECAPS, 8)
+	// mmsyscom.h
+	expect_size(t, win32.MMVERSION, 4)
+	expect_size(t, win32.MMTIME, 12)
+	// mmeapi.h
+	expect_size(t, win32.WAVEFORMATEX, 20)
+	expect_size(t, win32.WAVEHDR, 48)
+	expect_size(t, win32.WAVEINCAPSW, 80)
+	expect_size(t, win32.WAVEOUTCAPSW, 84)
+}
+
+@(test)
+verify_advapi32 :: proc(t: ^testing.T) {
+	// wincrypt.h
+	expect_size(t, win32.HCRYPTPROV, 8)
+}
+
+@(test)
+verify_winnls :: proc(t: ^testing.T) {
+	// winnls.h
+	expect_value(t, win32.CP_ACP, 0x00000000)
+	expect_value(t, win32.CP_OEMCP, 0x00000001)
+	expect_value(t, win32.CP_MACCP, 0x00000002)
+	expect_value(t, win32.CP_THREAD_ACP, 0x00000003)
+	expect_value(t, win32.CP_SYMBOL, 0x0000002A)
+	expect_value(t, win32.CP_UTF7, 0x0000FDE8)
+	expect_value(t, win32.CP_UTF8, 0x0000FDE9)
+	expect_value(t, win32.MAX_DEFAULTCHAR, 0x00000002)
+	expect_value(t, win32.MAX_LEADBYTES, 0x0000000C)
+	expect_value(t, win32.LOCALE_NAME_MAX_LENGTH, 0x00000055)
+	expect_value(t, win32.LOCALE_NAME_USER_DEFAULT, 0x00000000)
+	expect_value_str(t, win32.LOCALE_NAME_INVARIANT, L(""))
+	expect_value_str(t, win32.LOCALE_NAME_SYSTEM_DEFAULT, L("!x-sys-default-locale"))
+	expect_size(t, win32.LCTYPE, 4)
+	expect_size(t, win32.CPINFOEXW, 544)
+}
+
+@(test)
+verify_winreg :: proc(t: ^testing.T) {
+	// winreg.h
+	expect_value(t, win32.RRF_RT_REG_NONE, 0x00000001)
+	expect_value(t, win32.RRF_RT_REG_SZ, 0x00000002)
+	expect_value(t, win32.RRF_RT_REG_EXPAND_SZ, 0x00000004)
+	expect_value(t, win32.RRF_RT_REG_BINARY, 0x00000008)
+	expect_value(t, win32.RRF_RT_REG_DWORD, 0x00000010)
+	expect_value(t, win32.RRF_RT_REG_MULTI_SZ, 0x00000020)
+	expect_value(t, win32.RRF_RT_REG_QWORD, 0x00000040)
+	expect_value(t, win32.RRF_RT_DWORD, 0x00000018)
+	expect_value(t, win32.RRF_RT_QWORD, 0x00000048)
+	expect_value(t, win32.RRF_RT_ANY, 0x0000FFFF)
+	expect_value(t, win32.RRF_NOEXPAND, 0x10000000)
+	expect_value(t, win32.RRF_ZEROONFAILURE, 0x20000000)
+	// winnt.h
+	expect_value(t, u32(win32.HKEY_CLASSES_ROOT), 0x80000000)
+	expect_value(t, u32(win32.HKEY_CURRENT_USER), 0x80000001)
+	expect_value(t, u32(win32.HKEY_LOCAL_MACHINE), 0x80000002)
+	expect_value(t, u32(win32.HKEY_USERS), 0x80000003)
+	expect_value(t, u32(win32.HKEY_PERFORMANCE_DATA), 0x80000004)
+	expect_value(t, u32(win32.HKEY_PERFORMANCE_TEXT), 0x80000050)
+	expect_value(t, u32(win32.HKEY_PERFORMANCE_NLSTEXT), 0x80000060)
+	expect_value(t, u32(win32.HKEY_CURRENT_CONFIG), 0x80000005)
+	expect_value(t, u32(win32.HKEY_DYN_DATA), 0x80000006)
+	expect_value(t, u32(win32.HKEY_CURRENT_USER_LOCAL_SETTINGS), 0x80000007)
+	expect_value(t, win32.DELETE, 0x00010000)
+	expect_value(t, win32.READ_CONTROL, 0x00020000)
+	expect_value(t, win32.WRITE_DAC, 0x00040000)
+	expect_value(t, win32.WRITE_OWNER, 0x00080000)
+	expect_value(t, win32.SYNCHRONIZE, 0x00100000)
+	expect_value(t, win32.KEY_QUERY_VALUE, 0x00000001)
+	expect_value(t, win32.KEY_SET_VALUE, 0x00000002)
+	expect_value(t, win32.KEY_CREATE_SUB_KEY, 0x00000004)
+	expect_value(t, win32.KEY_ENUMERATE_SUB_KEYS, 0x00000008)
+	expect_value(t, win32.KEY_NOTIFY, 0x00000010)
+	expect_value(t, win32.KEY_CREATE_LINK, 0x00000020)
+	expect_value(t, win32.KEY_WOW64_32KEY, 0x00000200)
+	expect_value(t, win32.KEY_WOW64_64KEY, 0x00000100)
+	expect_value(t, win32.KEY_WOW64_RES, 0x00000300)
+	expect_value(t, win32.KEY_READ, 0x00020019)
+	expect_value(t, win32.KEY_WRITE, 0x00020006)
+	expect_value(t, win32.KEY_EXECUTE, 0x00020019)
+	expect_value(t, win32.KEY_ALL_ACCESS, 0x000F003F)
+}
+
+@(test)
+verify_verrsrc :: proc(t: ^testing.T) {
+	// verrsrc.h
+	expect_value(t, win32.VS_VERSION_INFO, 0x00000001)
+	expect_value(t, win32.VS_USER_DEFINED, 0x00000064)
+	expect_size(t, win32.VS_FIXEDFILEINFO, 52)
+	expect_value(t, win32.VS_FFI_SIGNATURE, 0xFEEF04BD)
+}
+
+@(test)
+verify_error_codes :: proc(t: ^testing.T) {
+	// winerror.h
+	expect_value(t, win32.ERROR_SUCCESS, 0x00000000)
+	expect_value(t, win32.NO_ERROR, 0x00000000)
+	expect_value(t, win32.SEC_E_OK, 0x00000000)
+
+	expect_value(t, win32.ERROR_INVALID_FUNCTION, 0x00000001)
+	expect_value(t, win32.ERROR_FILE_NOT_FOUND, 0x00000002)
+	expect_value(t, win32.ERROR_PATH_NOT_FOUND, 0x00000003)
+	expect_value(t, win32.ERROR_ACCESS_DENIED, 0x00000005)
+	expect_value(t, win32.ERROR_INVALID_HANDLE, 0x00000006)
+	expect_value(t, win32.ERROR_NOT_ENOUGH_MEMORY, 0x00000008)
+	expect_value(t, win32.ERROR_INVALID_BLOCK, 0x00000009)
+	expect_value(t, win32.ERROR_BAD_ENVIRONMENT, 0x0000000A)
+	expect_value(t, win32.ERROR_BAD_FORMAT, 0x0000000B)
+	expect_value(t, win32.ERROR_INVALID_ACCESS, 0x0000000C)
+	expect_value(t, win32.ERROR_INVALID_DATA, 0x0000000D)
+	expect_value(t, win32.ERROR_OUTOFMEMORY, 0x0000000E)
+	expect_value(t, win32.ERROR_INVALID_DRIVE, 0x0000000F)
+	expect_value(t, win32.ERROR_CURRENT_DIRECTORY, 0x00000010)
+	expect_value(t, win32.ERROR_NO_MORE_FILES, 0x00000012)
+	expect_value(t, win32.ERROR_SHARING_VIOLATION, 0x00000020)
+	expect_value(t, win32.ERROR_LOCK_VIOLATION, 0x00000021)
+	expect_value(t, win32.ERROR_HANDLE_EOF, 0x00000026)
+	expect_value(t, win32.ERROR_NOT_SUPPORTED, 0x00000032)
+	expect_value(t, win32.ERROR_FILE_EXISTS, 0x00000050)
+	expect_value(t, win32.ERROR_INVALID_PARAMETER, 0x00000057)
+	expect_value(t, win32.ERROR_BROKEN_PIPE, 0x0000006D)
+	expect_value(t, win32.ERROR_CALL_NOT_IMPLEMENTED, 0x00000078)
+	expect_value(t, win32.ERROR_INSUFFICIENT_BUFFER, 0x0000007A)
+	expect_value(t, win32.ERROR_INVALID_NAME, 0x0000007B)
+	expect_value(t, win32.ERROR_BAD_ARGUMENTS, 0x000000A0)
+	expect_value(t, win32.ERROR_LOCK_FAILED, 0x000000A7)
+	expect_value(t, win32.ERROR_ALREADY_EXISTS, 0x000000B7)
+	expect_value(t, win32.ERROR_NO_DATA, 0x000000E8)
+	expect_value(t, win32.ERROR_ENVVAR_NOT_FOUND, 0x000000CB)
+	expect_value(t, win32.ERROR_OPERATION_ABORTED, 0x000003E3)
+	expect_value(t, win32.ERROR_IO_PENDING, 0x000003E5)
+	expect_value(t, win32.ERROR_NO_UNICODE_TRANSLATION, 0x00000459)
+	expect_value(t, win32.ERROR_TIMEOUT, 0x000005B4)
+	expect_value(t, win32.ERROR_DATATYPE_MISMATCH, 0x0000065D)
+	expect_value(t, win32.ERROR_UNSUPPORTED_TYPE, 0x0000065E)
+	expect_value(t, win32.ERROR_NOT_SAME_OBJECT, 0x00000678)
+	expect_value(t, win32.ERROR_PIPE_CONNECTED, 0x00000217)
+	expect_value(t, win32.ERROR_PIPE_BUSY, 0x000000E7)
+
+	expect_value(t, win32.S_OK, 0x00000000)
+	expect_value(t, win32.E_NOTIMPL, 0x80004001)
+	expect_value(t, win32.E_NOINTERFACE, 0x80004002)
+	expect_value(t, win32.E_POINTER, 0x80004003)
+	expect_value(t, win32.E_ABORT, 0x80004004)
+	expect_value(t, win32.E_FAIL, 0x80004005)
+	expect_value(t, win32.E_UNEXPECTED, 0x8000FFFF)
+	expect_value(t, win32.E_ACCESSDENIED, 0x80070005)
+	expect_value(t, win32.E_HANDLE, 0x80070006)
+	expect_value(t, win32.E_OUTOFMEMORY, 0x8007000E)
+	expect_value(t, win32.E_INVALIDARG, 0x80070057)
+}
+
+@(test)
+verify_error_helpers :: proc(t: ^testing.T) {
+	// winerror.h
+	expect_value(t, win32.SUCCEEDED(-1), 0x00000000)
+	expect_value(t, win32.SUCCEEDED(0), 0x00000001)
+	expect_value(t, win32.SUCCEEDED(1), 0x00000001)
+
+	expect_value(t, win32.FAILED(-1), 0x00000001)
+	expect_value(t, win32.FAILED(0), 0x00000000)
+	expect_value(t, win32.FAILED(1), 0x00000000)
+
+	expect_value(t, win32.IS_ERROR(-1), 0x00000001)
+	expect_value(t, win32.IS_ERROR(0), 0x00000000)
+	expect_value(t, win32.IS_ERROR(1), 0x00000000)
+
+	expect_value(t, win32.HRESULT_CODE(0xFFFFCCCC), 0x0000CCCC)
+	expect_value(t, win32.HRESULT_FACILITY(0xFFFFCCCC), 0x00001FFF)
+	expect_value(t, win32.HRESULT_SEVERITY(0x12345678), 0x00000000)
+	expect_value(t, win32.HRESULT_SEVERITY(0x87654321), 0x00000001)
+
+	expect_value(t, win32.MAKE_HRESULT(1, 2, 3), 0x80020003)
+}

+ 34 - 0
tests/core/sys/windows/test_winerror.odin

@@ -0,0 +1,34 @@
+//+build windows
+package test_core_sys_windows
+
+import "core:testing"
+import win32 "core:sys/windows"
+
+@(test)
+make_hresult :: proc(t: ^testing.T) {
+	expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.SUCCESS, win32.FACILITY.NULL, win32.ERROR_SUCCESS), win32.S_OK)
+	expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.ERROR, win32.FACILITY.NULL, 0x4001), win32.E_NOTIMPL)
+	expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.ERROR, win32.FACILITY.NULL, 0x4002), win32.E_NOINTERFACE)
+	expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.ERROR, win32.FACILITY.NULL, 0x4003), win32.E_POINTER)
+	expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.ERROR, win32.FACILITY.NULL, 0x4004), win32.E_ABORT)
+	expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.ERROR, win32.FACILITY.NULL, 0x4005), win32.E_FAIL)
+	expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.ERROR, win32.FACILITY.NULL, 0xFFFF), win32.E_UNEXPECTED)
+
+	expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.ERROR, win32.FACILITY.WIN32, win32.ERROR_ACCESS_DENIED), win32.E_ACCESSDENIED)
+	expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.ERROR, win32.FACILITY.WIN32, win32.ERROR_INVALID_HANDLE), win32.E_HANDLE)
+	expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.ERROR, win32.FACILITY.WIN32, win32.ERROR_OUTOFMEMORY), win32.E_OUTOFMEMORY)
+	expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.ERROR, win32.FACILITY.WIN32, win32.ERROR_INVALID_PARAMETER), win32.E_INVALIDARG)
+
+	expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.ERROR, win32.FACILITY.WIN32, win32.System_Error.ACCESS_DENIED), win32.E_ACCESSDENIED)
+	expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.ERROR, win32.FACILITY.WIN32, win32.System_Error.INVALID_HANDLE), win32.E_HANDLE)
+	expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.ERROR, win32.FACILITY.WIN32, win32.System_Error.OUTOFMEMORY), win32.E_OUTOFMEMORY)
+	expect_value(t, win32.MAKE_HRESULT(win32.SEVERITY.ERROR, win32.FACILITY.WIN32, win32.System_Error.INVALID_PARAMETER), win32.E_INVALIDARG)
+}
+
+@(test)
+decode_hresult :: proc(t: ^testing.T) {
+	s, f, c := win32.DECODE_HRESULT(win32.E_INVALIDARG)
+	expect_value(t, s, win32.SEVERITY.ERROR)
+	expect_value(t, f, win32.FACILITY.WIN32)
+	expect_value(t, c, win32.System_Error.INVALID_PARAMETER)
+}