win32gen.cpp 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935
  1. #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
  2. #include <windows.h>
  3. #include <timeapi.h>
  4. #include <mmreg.h>
  5. #include <mmeapi.h>
  6. #include <windns.h>
  7. #include <commdlg.h>
  8. #include <winver.h>
  9. #include <shobjidl.h>
  10. #include <shellapi.h>
  11. #include <shlobj.h>
  12. #include <shlwapi.h>
  13. #include <wincrypt.h>
  14. #include <iostream>
  15. #include <fstream>
  16. #include <filesystem>
  17. #include <map>
  18. #include <cassert>
  19. #include <codecvt>
  20. #include <cstdint>
  21. #include <iostream>
  22. #include <locale>
  23. #include <string>
  24. using namespace std;
  25. using namespace std::filesystem;
  26. static std::string ConvertLPCWSTRToString(const LPCWSTR lpcwszStr)
  27. {
  28. int strLength = WideCharToMultiByte(CP_UTF8, 0, lpcwszStr, -1, nullptr, 0, nullptr, nullptr) - 1;
  29. string str(strLength, 0);
  30. WideCharToMultiByte(CP_UTF8, 0, lpcwszStr, -1, &str[0], strLength, nullptr, nullptr);
  31. return std::string(str);
  32. }
  33. #define test_proc_begin() out \
  34. << endl \
  35. << "@(test)" << endl \
  36. << __func__ << " :: proc(t: ^testing.T) {" << endl
  37. #define test_proc_end() out \
  38. << "}" << endl
  39. #define test_proc_using(name) out \
  40. << '\t' << "using " << name << endl
  41. #define test_proc_comment(comment) out \
  42. << '\t' << "// " << comment << endl
  43. #define expect_size(s) out \
  44. << '\t' << "expect_size(t, win32." << #s << ", " \
  45. << std::dec << sizeof(s) << ")" << endl
  46. #define expect_value(s) out \
  47. << '\t' << "expect_value(t, win32." << #s << ", " \
  48. << "0x" << std::uppercase << std::setfill('0') << std::setw(8) << std::hex << s << ")" << endl
  49. #define expect_value_32(s) out \
  50. << '\t' << "expect_value(t, u32(win32." << #s << "), " \
  51. << "0x" << std::uppercase << std::setfill('0') << std::setw(8) << std::hex << (ULONG)(ULONG_PTR)(s) << ")" << endl
  52. #define expect_value_64(s) out \
  53. << '\t' << "expect_value_64(t, u64(win32." << #s << "), " \
  54. << "0x" << std::uppercase << std::setfill('0') << std::setw(8) << std::hex << (ULONGLONG)(ULONG_PTR)(s) << ")" << endl
  55. #define expect_value_uintptr(s) out \
  56. << '\t' << "expect_value_64(t, uintptr(win32." << #s << "), " \
  57. << "0x" << std::uppercase << std::setfill('0') << std::setw(8) << std::hex << (ULONG_PTR)(s) << ")" << endl
  58. #define expect_value_str(s) out \
  59. << '\t' << "expect_value_str(t, win32." << #s << ", L(\"" << ConvertLPCWSTRToString(s) << "\"))" << endl
  60. static void verify_win32_type_sizes(ofstream& out) {
  61. test_proc_begin();
  62. test_proc_comment("minwindef.h");
  63. expect_size(ULONG); // unsigned long
  64. expect_size(PULONG); // unsigned long*
  65. expect_size(USHORT); // unsigned short
  66. expect_size(PUSHORT); // unsigned short*
  67. expect_size(UCHAR); // unsigned char
  68. // expect_size(PUCHAR);
  69. // expect_size(PSZ);
  70. expect_size(DWORD); // unsigned long
  71. expect_size(BOOL); // int
  72. expect_size(BYTE); // unsigned char
  73. expect_size(WORD); // unsigned short
  74. #ifdef PROPVARIANT
  75. expect_size(FLOAT); // float
  76. expect_size(DOUBLE); // double
  77. expect_size(DATE); // double
  78. #endif
  79. // expect_size(PFLOAT);
  80. expect_size(PBOOL);
  81. expect_size(LPBOOL);
  82. expect_size(PBYTE);
  83. expect_size(LPBYTE);
  84. expect_size(PINT);
  85. expect_size(LPINT);
  86. // expect_size(PWORD);
  87. expect_size(LPWORD);
  88. // expect_size(LPLONG);
  89. expect_size(PDWORD);
  90. expect_size(LPDWORD);
  91. expect_size(LPVOID);
  92. expect_size(LPCVOID);
  93. expect_size(INT); // int
  94. expect_size(UINT); // unsigned int
  95. expect_size(PUINT); // unsigned int*
  96. expect_size(UINT_PTR); // unsigned __int64
  97. expect_size(LONG_PTR); // __int64
  98. expect_size(HANDLE); // void *
  99. expect_size(WPARAM); // unsigned __int64
  100. expect_size(LPARAM); // __int64
  101. expect_size(LRESULT); // __int64
  102. expect_size(LPHANDLE);
  103. expect_size(HGLOBAL); // void *
  104. // expect_size(HLOCAL);
  105. // expect_size(GLOBALHANDLE);
  106. // expect_size(LOCALHANDLE);
  107. expect_size(ATOM); // unsigned short
  108. expect_size(HKEY);
  109. expect_size(PHKEY);
  110. // expect_size(HMETAFILE);
  111. expect_size(HINSTANCE);
  112. expect_size(HMODULE);
  113. expect_size(HRGN);
  114. expect_size(HRSRC);
  115. // expect_size(HSPRITE);
  116. // expect_size(HLSURF);
  117. // expect_size(HSTR);
  118. // expect_size(HTASK);
  119. // expect_size(HWINSTA);
  120. // expect_size(HKL);
  121. //expect_size(HFILE);
  122. test_proc_comment("windef.h");
  123. expect_size(HWND);
  124. expect_size(HHOOK);
  125. expect_size(HGDIOBJ);
  126. expect_size(HBITMAP);
  127. expect_size(HPALETTE);
  128. expect_size(HBRUSH);
  129. expect_size(HPEN);
  130. expect_size(HFONT);
  131. expect_size(HICON);
  132. expect_size(HMENU);
  133. expect_size(HCURSOR);
  134. expect_size(COLORREF);
  135. expect_size(RECT);
  136. expect_size(POINT);
  137. expect_size(SIZE);
  138. test_proc_comment("wtypes.h");
  139. expect_size(DECIMAL);
  140. #ifdef PROPVARIANT
  141. expect_size(CY);
  142. #endif
  143. test_proc_comment("fileapi.h");
  144. expect_size(WIN32_FILE_ATTRIBUTE_DATA);
  145. test_proc_comment("libloaderapi.h");
  146. expect_size(ENUMRESNAMEPROCW);
  147. expect_size(ENUMRESTYPEPROCW);
  148. test_proc_comment("minwinbase.h");
  149. expect_size(SYSTEMTIME);
  150. expect_size(WIN32_FIND_DATAW);
  151. expect_size(CRITICAL_SECTION);
  152. // expect_size(PROCESS_HEAP_ENTRY);
  153. expect_size(REASON_CONTEXT);
  154. test_proc_comment("guiddef.h");
  155. expect_size(GUID);
  156. expect_size(IID);
  157. expect_size(CLSID);
  158. test_proc_comment("combaseapi.h");
  159. expect_size(SCODE);
  160. #ifdef PROPVARIANT
  161. expect_size(VARTYPE);
  162. expect_size(VARIANT_BOOL);
  163. expect_size(CLIPDATA);
  164. expect_size(SAFEARRAYBOUND);
  165. expect_size(SAFEARRAY);
  166. expect_size(CAPROPVARIANT);
  167. expect_size(PROPVARIANT);
  168. #endif
  169. test_proc_comment("commdlg.h");
  170. expect_size(OPENFILENAMEW);
  171. // test_proc_comment("windns.h");
  172. // expect_size(DNS_RECORDA);
  173. // expect_size(DNS_RECORDW);
  174. // SHCreateLibrary
  175. test_proc_comment("wtypesbase.h");
  176. expect_size(OLECHAR);
  177. //test_proc_comment("objbase.h");
  178. //expect_value(COINIT_MULTITHREADED);
  179. //expect_value(COINIT_APARTMENTTHREADED);
  180. //expect_value(COINIT_DISABLE_OLE1DDE);
  181. //expect_value(COINIT_SPEED_OVER_MEMORY);
  182. test_proc_end();
  183. }
  184. static void verify_macros(ofstream& out) {
  185. test_proc_begin();
  186. test_proc_comment("minwindef.h");
  187. expect_value(MAKEWORD(1, 2));
  188. expect_value(MAKEWORD(0x1111, 0x2222));
  189. expect_value(MAKELONG(1, 2));
  190. expect_value(MAKELONG(0x1111, 0x2222));
  191. expect_value(LOWORD(0x12345678));
  192. expect_value(HIWORD(0x12345678));
  193. expect_value_32(LOBYTE(0x1234));
  194. expect_value_32(HIBYTE(0x1234));
  195. test_proc_comment("winuser.h");
  196. expect_value(MAKEWPARAM(1, 2));
  197. expect_value(MAKEWPARAM(0x1111, 0x2222));
  198. expect_value(MAKELPARAM(1, 2));
  199. expect_value(MAKELPARAM(0x1111, 0x2222));
  200. expect_value(MAKELRESULT(1, 2));
  201. expect_value(MAKELRESULT(0x1111, 0x2222));
  202. test_proc_comment("winnt.h");
  203. expect_value(MAKELCID(1, 2));
  204. expect_value(MAKELCID(0x1111, 0x2222));
  205. expect_value(MAKELANGID(1, 2));
  206. expect_value(MAKELANGID(0x111, 0x222));
  207. expect_value(LANGIDFROMLCID(0x12345678));
  208. test_proc_end();
  209. }
  210. static void verify_winnt(ofstream& out) {
  211. test_proc_begin();
  212. test_proc_comment("winnt.h");
  213. expect_size(CHAR);
  214. expect_size(SHORT);
  215. expect_size(LONG);
  216. expect_size(INT);
  217. expect_size(WCHAR);
  218. // expect_size(LONGLONG);
  219. expect_size(ULONGLONG);
  220. expect_size(LARGE_INTEGER);
  221. expect_size(PLARGE_INTEGER);
  222. expect_size(ULARGE_INTEGER);
  223. expect_size(PULARGE_INTEGER);
  224. expect_size(BOOLEAN);
  225. expect_size(HANDLE);
  226. expect_size(PHANDLE);
  227. expect_size(HRESULT);
  228. // expect_size(CCHAR);
  229. expect_size(LCID);
  230. expect_size(LANGID);
  231. expect_size(LUID);
  232. expect_size(SECURITY_INFORMATION);
  233. expect_size(ACCESS_MASK);
  234. expect_size(REGSAM);
  235. expect_value(LANG_NEUTRAL);
  236. expect_value(LANG_INVARIANT);
  237. expect_value(SUBLANG_NEUTRAL);
  238. expect_value(SUBLANG_DEFAULT);
  239. test_proc_end();
  240. }
  241. static void verify_winuser(ofstream& out) {
  242. test_proc_begin();
  243. test_proc_comment("winuser.h");
  244. //expect_value(UOI_FLAGS);
  245. expect_size(USEROBJECTFLAGS);
  246. expect_size(MSG);
  247. expect_size(WINDOWPOS);
  248. expect_size(ACCEL);
  249. expect_size(MENUITEMINFOW);
  250. expect_size(PAINTSTRUCT);
  251. expect_size(CREATESTRUCTW);
  252. expect_size(WINDOWPLACEMENT);
  253. expect_size(MOUSEINPUT);
  254. expect_size(KEYBDINPUT);
  255. expect_size(HARDWAREINPUT);
  256. expect_size(INPUT);
  257. // expect_size(ICONINFO);
  258. // expect_size(CURSORSHAPE);
  259. expect_size(ICONINFOEXW);
  260. expect_size(CURSORINFO);
  261. //expect_value(CURSOR_SHOWING);
  262. //expect_value(CURSOR_SUPPRESSED);
  263. expect_size(WINDOWINFO);
  264. expect_size(RAWINPUTHEADER);
  265. //expect_size(RAWHID);
  266. expect_size(RAWMOUSE);
  267. expect_size(RAWKEYBOARD);
  268. expect_size(RAWINPUT);
  269. expect_size(RAWINPUTDEVICE);
  270. expect_size(RAWINPUTDEVICELIST);
  271. expect_size(RID_DEVICE_INFO_HID);
  272. expect_size(RID_DEVICE_INFO_KEYBOARD);
  273. expect_size(RID_DEVICE_INFO_MOUSE);
  274. expect_size(RID_DEVICE_INFO);
  275. expect_value(GET_RAWINPUT_CODE_WPARAM(0x12345678));
  276. expect_size(DRAWTEXTPARAMS);
  277. expect_size(BSMINFO);
  278. expect_value(BROADCAST_QUERY_DENY);
  279. expect_value_64(HWND_BROADCAST);
  280. expect_value_64(HWND_MESSAGE);
  281. expect_value_uintptr(MAKEINTRESOURCEW(1));
  282. expect_value_uintptr(MAKEINTRESOURCEW(0x12345678));
  283. expect_value_uintptr(RT_CURSOR);
  284. expect_value_uintptr(RT_BITMAP);
  285. expect_value_uintptr(RT_ICON);
  286. expect_value_uintptr(RT_MENU);
  287. expect_value_uintptr(RT_DIALOG);
  288. expect_value_uintptr(RT_STRING);
  289. expect_value_uintptr(RT_FONTDIR);
  290. expect_value_uintptr(RT_FONT);
  291. expect_value_uintptr(RT_ACCELERATOR);
  292. expect_value_uintptr(RT_RCDATA);
  293. expect_value_uintptr(RT_MESSAGETABLE);
  294. expect_value_uintptr(RT_GROUP_CURSOR);
  295. expect_value_uintptr(RT_GROUP_ICON);
  296. expect_value_uintptr(RT_VERSION);
  297. expect_value_uintptr(RT_DLGINCLUDE);
  298. expect_value_uintptr(RT_PLUGPLAY);
  299. expect_value_uintptr(RT_VXD);
  300. expect_value_uintptr(RT_ANICURSOR);
  301. expect_value_uintptr(RT_ANIICON);
  302. expect_value_uintptr(RT_MANIFEST);
  303. expect_value_uintptr(CREATEPROCESS_MANIFEST_RESOURCE_ID);
  304. expect_value_uintptr(ISOLATIONAWARE_MANIFEST_RESOURCE_ID);
  305. expect_value_uintptr(ISOLATIONAWARE_NOSTATICIMPORT_MANIFEST_RESOURCE_ID);
  306. expect_value_uintptr(ISOLATIONPOLICY_MANIFEST_RESOURCE_ID);
  307. expect_value_uintptr(ISOLATIONPOLICY_BROWSER_MANIFEST_RESOURCE_ID);
  308. expect_value_uintptr(MINIMUM_RESERVED_MANIFEST_RESOURCE_ID);
  309. expect_value_uintptr(MAXIMUM_RESERVED_MANIFEST_RESOURCE_ID);
  310. expect_value(SM_CXICON);
  311. expect_value(SM_CYICON);
  312. expect_value(LR_DEFAULTCOLOR);
  313. expect_value(LR_MONOCHROME);
  314. expect_value(LR_COLOR);
  315. expect_value(LR_COPYRETURNORG);
  316. expect_value(LR_COPYDELETEORG);
  317. expect_value(LR_LOADFROMFILE);
  318. expect_value(LR_LOADTRANSPARENT);
  319. expect_value(LR_DEFAULTSIZE);
  320. expect_value(LR_VGACOLOR);
  321. expect_value(LR_LOADMAP3DCOLORS);
  322. expect_value(LR_CREATEDIBSECTION);
  323. expect_value(LR_COPYFROMRESOURCE);
  324. expect_value(LR_SHARED);
  325. expect_value(NIM_ADD);
  326. expect_value(NIM_MODIFY);
  327. expect_value(NIM_DELETE);
  328. expect_value(NIM_SETFOCUS);
  329. expect_value(NIM_SETVERSION);
  330. expect_value(NIF_MESSAGE);
  331. expect_value(NIF_ICON);
  332. expect_value(NIF_TIP);
  333. expect_value(NIF_STATE);
  334. expect_value(NIF_INFO);
  335. expect_value(NIF_GUID);
  336. expect_value(NIF_REALTIME);
  337. expect_value(NIF_SHOWTIP);
  338. expect_value(MF_INSERT);
  339. expect_value(MF_CHANGE);
  340. expect_value(MF_APPEND);
  341. expect_value(MF_DELETE);
  342. expect_value(MF_REMOVE);
  343. expect_value(MF_BYCOMMAND);
  344. expect_value(MF_BYPOSITION);
  345. expect_value(MF_SEPARATOR);
  346. expect_value(MF_ENABLED);
  347. expect_value(MF_GRAYED);
  348. expect_value(MF_DISABLED);
  349. expect_value(MF_UNCHECKED);
  350. expect_value(MF_CHECKED);
  351. expect_value(MF_USECHECKBITMAPS);
  352. expect_value(MF_STRING);
  353. expect_value(MF_BITMAP);
  354. expect_value(MF_OWNERDRAW);
  355. expect_value(MF_POPUP);
  356. expect_value(MF_MENUBARBREAK);
  357. expect_value(MF_MENUBREAK);
  358. expect_value(MF_UNHILITE);
  359. expect_value(MF_HILITE);
  360. expect_value(MF_DEFAULT);
  361. expect_value(MF_SYSMENU);
  362. expect_value(MF_HELP);
  363. expect_value(MF_RIGHTJUSTIFY);
  364. expect_value(MF_MOUSESELECT);
  365. expect_value(MF_END);
  366. expect_value(MFS_GRAYED);
  367. expect_value(MFS_DISABLED);
  368. expect_value(MFS_CHECKED);
  369. expect_value(MFS_HILITE);
  370. expect_value(MFS_ENABLED);
  371. expect_value(MFS_UNCHECKED);
  372. expect_value(MFS_UNHILITE);
  373. expect_value(MFS_DEFAULT);
  374. expect_value(TPM_LEFTBUTTON);
  375. expect_value(TPM_RIGHTBUTTON);
  376. expect_value(TPM_LEFTALIGN);
  377. expect_value(TPM_CENTERALIGN);
  378. expect_value(TPM_RIGHTALIGN);
  379. expect_value(TPM_TOPALIGN);
  380. expect_value(TPM_VCENTERALIGN);
  381. expect_value(TPM_BOTTOMALIGN);
  382. expect_value(TPM_HORIZONTAL);
  383. expect_value(TPM_VERTICAL);
  384. expect_value(TPM_NONOTIFY);
  385. expect_value(TPM_RETURNCMD);
  386. expect_value(TPM_RECURSE);
  387. expect_value(TPM_HORPOSANIMATION);
  388. expect_value(TPM_HORNEGANIMATION);
  389. expect_value(TPM_VERPOSANIMATION);
  390. expect_value(TPM_VERNEGANIMATION);
  391. expect_value(TPM_NOANIMATION);
  392. expect_value(TPM_LAYOUTRTL);
  393. expect_value(TPM_WORKAREA);
  394. expect_value(MIIM_STATE);
  395. expect_value(MIIM_ID);
  396. expect_value(MIIM_SUBMENU);
  397. expect_value(MIIM_CHECKMARKS);
  398. expect_value(MIIM_TYPE);
  399. expect_value(MIIM_DATA);
  400. expect_value(MIIM_STRING);
  401. expect_value(MIIM_BITMAP);
  402. expect_value(MIIM_FTYPE);
  403. expect_value(ANSI_CHARSET);
  404. expect_value(DEFAULT_CHARSET);
  405. expect_value(SYMBOL_CHARSET);
  406. expect_value(SHIFTJIS_CHARSET);
  407. expect_value(HANGEUL_CHARSET);
  408. expect_value(HANGUL_CHARSET);
  409. expect_value(GB2312_CHARSET);
  410. expect_value(CHINESEBIG5_CHARSET);
  411. expect_value(OEM_CHARSET);
  412. expect_value(JOHAB_CHARSET);
  413. expect_value(HEBREW_CHARSET);
  414. expect_value(ARABIC_CHARSET);
  415. expect_value(GREEK_CHARSET);
  416. expect_value(TURKISH_CHARSET);
  417. expect_value(VIETNAMESE_CHARSET);
  418. expect_value(THAI_CHARSET);
  419. expect_value(EASTEUROPE_CHARSET);
  420. expect_value(RUSSIAN_CHARSET);
  421. expect_value(MAC_CHARSET);
  422. expect_value(BALTIC_CHARSET);
  423. expect_value(FS_LATIN1);
  424. expect_value(FS_LATIN2);
  425. expect_value(FS_CYRILLIC);
  426. expect_value(FS_GREEK);
  427. expect_value(FS_TURKISH);
  428. expect_value(FS_HEBREW);
  429. expect_value(FS_ARABIC);
  430. expect_value(FS_BALTIC);
  431. expect_value(FS_VIETNAMESE);
  432. expect_value(FS_THAI);
  433. expect_value(FS_JISJAPAN);
  434. expect_value(FS_CHINESESIMP);
  435. expect_value(FS_WANSUNG);
  436. expect_value(FS_CHINESETRAD);
  437. expect_value(FS_JOHAB);
  438. expect_value(FS_SYMBOL);
  439. expect_value(OUT_DEFAULT_PRECIS);
  440. expect_value(OUT_STRING_PRECIS);
  441. expect_value(OUT_CHARACTER_PRECIS);
  442. expect_value(OUT_STROKE_PRECIS);
  443. expect_value(OUT_TT_PRECIS);
  444. expect_value(OUT_DEVICE_PRECIS);
  445. expect_value(OUT_RASTER_PRECIS);
  446. expect_value(OUT_TT_ONLY_PRECIS);
  447. expect_value(OUT_OUTLINE_PRECIS);
  448. expect_value(OUT_SCREEN_OUTLINE_PRECIS);
  449. expect_value(OUT_PS_ONLY_PRECIS);
  450. expect_value(CLIP_DEFAULT_PRECIS);
  451. expect_value(CLIP_CHARACTER_PRECIS);
  452. expect_value(CLIP_STROKE_PRECIS);
  453. expect_value(CLIP_MASK);
  454. expect_value(CLIP_LH_ANGLES);
  455. expect_value(CLIP_TT_ALWAYS);
  456. expect_value(CLIP_DFA_DISABLE);
  457. expect_value(CLIP_EMBEDDED);
  458. expect_value(DEFAULT_QUALITY);
  459. expect_value(DRAFT_QUALITY);
  460. expect_value(PROOF_QUALITY);
  461. expect_value(NONANTIALIASED_QUALITY);
  462. expect_value(ANTIALIASED_QUALITY);
  463. expect_value(CLEARTYPE_QUALITY);
  464. expect_value(CLEARTYPE_NATURAL_QUALITY);
  465. expect_value(DEFAULT_PITCH);
  466. expect_value(FIXED_PITCH);
  467. expect_value(VARIABLE_PITCH);
  468. expect_value(MONO_FONT);
  469. expect_value(FF_DONTCARE);
  470. expect_value(FF_ROMAN);
  471. expect_value(FF_SWISS);
  472. expect_value(FF_MODERN);
  473. expect_value(FF_SCRIPT);
  474. expect_value(FF_DECORATIVE);
  475. test_proc_end();
  476. }
  477. static void verify_gdi32(ofstream& out) {
  478. test_proc_begin();
  479. test_proc_comment("wingdi.h");
  480. expect_size(DEVMODEW);
  481. // expect_size(RGBTRIPLE);
  482. expect_size(RGBQUAD);
  483. expect_size(PIXELFORMATDESCRIPTOR);
  484. expect_size(BITMAPINFOHEADER);
  485. expect_size(BITMAP);
  486. expect_size(BITMAPV5HEADER);
  487. expect_size(CIEXYZTRIPLE);
  488. expect_size(CIEXYZ);
  489. expect_size(FXPT2DOT30);
  490. expect_size(TEXTMETRICW);
  491. expect_size(POINTFLOAT);
  492. expect_size(GLYPHMETRICSFLOAT);
  493. // expect_size(LOGPALETTE);
  494. expect_size(PALETTEENTRY);
  495. expect_size(DESIGNVECTOR);
  496. expect_value(LF_FACESIZE);
  497. expect_value(LF_FULLFACESIZE);
  498. expect_size(LOGFONTW);
  499. expect_size(ENUMLOGFONTW);
  500. expect_size(ENUMLOGFONTEXW);
  501. expect_size(ENUMLOGFONTEXDVW);
  502. expect_size(NEWTEXTMETRICW);
  503. expect_size(LAYERPLANEDESCRIPTOR);
  504. expect_size(COLOR16);
  505. expect_size(TRIVERTEX);
  506. expect_size(GRADIENT_TRIANGLE);
  507. expect_size(GRADIENT_RECT);
  508. expect_size(BLENDFUNCTION);
  509. expect_size(DISPLAY_DEVICEW);
  510. expect_value(AC_SRC_OVER);
  511. expect_value(AC_SRC_ALPHA);
  512. expect_value(RGB(12, 34, 56));
  513. expect_value(PALETTERGB(12, 34, 56));
  514. expect_value(PALETTEINDEX(123));
  515. expect_value(GRADIENT_FILL_RECT_H);
  516. expect_value(GRADIENT_FILL_RECT_V);
  517. expect_value(GRADIENT_FILL_TRIANGLE);
  518. expect_value(BS_SOLID);
  519. expect_value(BS_NULL);
  520. expect_value(BS_HOLLOW);
  521. expect_value(BS_HATCHED);
  522. expect_value(BS_PATTERN);
  523. expect_value(BS_INDEXED);
  524. expect_value(BS_DIBPATTERN);
  525. expect_value(BS_DIBPATTERNPT);
  526. expect_value(BS_PATTERN8X8);
  527. expect_value(BS_DIBPATTERN8X8);
  528. expect_value(BS_MONOPATTERN);
  529. expect_value(HS_HORIZONTAL);
  530. expect_value(HS_VERTICAL);
  531. expect_value(HS_FDIAGONAL);
  532. expect_value(HS_BDIAGONAL);
  533. expect_value(HS_CROSS);
  534. expect_value(HS_DIAGCROSS);
  535. expect_value(HS_API_MAX);
  536. expect_value(PS_SOLID);
  537. expect_value(PS_DASH);
  538. expect_value(PS_DOT);
  539. expect_value(PS_DASHDOT);
  540. expect_value(PS_DASHDOTDOT);
  541. expect_value(PS_NULL);
  542. expect_value(PS_INSIDEFRAME);
  543. expect_value(PS_USERSTYLE);
  544. expect_value(PS_ALTERNATE);
  545. expect_value(PS_STYLE_MASK);
  546. expect_value(PS_ENDCAP_ROUND);
  547. expect_value(PS_ENDCAP_SQUARE);
  548. expect_value(PS_ENDCAP_FLAT);
  549. expect_value(PS_ENDCAP_MASK);
  550. expect_value(PS_JOIN_ROUND);
  551. expect_value(PS_JOIN_BEVEL);
  552. expect_value(PS_JOIN_MITER);
  553. expect_value(PS_COSMETIC);
  554. expect_value(PS_GEOMETRIC);
  555. expect_value(PS_TYPE_MASK);
  556. test_proc_comment("Binary raster ops");
  557. expect_value(R2_BLACK);
  558. expect_value(R2_NOTMERGEPEN);
  559. expect_value(R2_MASKNOTPEN);
  560. expect_value(R2_NOTCOPYPEN);
  561. expect_value(R2_MASKPENNOT);
  562. expect_value(R2_NOT);
  563. expect_value(R2_XORPEN);
  564. expect_value(R2_NOTMASKPEN);
  565. expect_value(R2_MASKPEN);
  566. expect_value(R2_NOTXORPEN);
  567. expect_value(R2_NOP);
  568. expect_value(R2_MERGENOTPEN);
  569. expect_value(R2_COPYPEN);
  570. expect_value(R2_MERGEPENNOT);
  571. expect_value(R2_MERGEPEN);
  572. expect_value(R2_WHITE);
  573. test_proc_comment("Ternary raster operations");
  574. expect_value(SRCCOPY);
  575. expect_value(SRCPAINT);
  576. expect_value(SRCAND);
  577. expect_value(SRCINVERT);
  578. expect_value(SRCERASE);
  579. expect_value(NOTSRCCOPY);
  580. expect_value(NOTSRCERASE);
  581. expect_value(MERGECOPY);
  582. expect_value(MERGEPAINT);
  583. expect_value(PATCOPY);
  584. expect_value(PATPAINT);
  585. expect_value(PATINVERT);
  586. expect_value(DSTINVERT);
  587. expect_value(BLACKNESS);
  588. expect_value(WHITENESS);
  589. expect_value(NOMIRRORBITMAP);
  590. expect_value(CAPTUREBLT);
  591. test_proc_comment("Region Flags");
  592. expect_value(ERROR);
  593. expect_value(NULLREGION);
  594. expect_value(SIMPLEREGION);
  595. expect_value(COMPLEXREGION);
  596. expect_value(RGN_ERROR);
  597. test_proc_comment("CombineRgn() Styles");
  598. expect_value(RGN_AND);
  599. expect_value(RGN_OR);
  600. expect_value(RGN_XOR);
  601. expect_value(RGN_DIFF);
  602. expect_value(RGN_COPY);
  603. test_proc_comment("StretchBlt() Modes");
  604. expect_value(BLACKONWHITE);
  605. expect_value(WHITEONBLACK);
  606. expect_value(COLORONCOLOR);
  607. expect_value(HALFTONE);
  608. //expect_value(STRETCH_ANDSCANS);
  609. //expect_value(STRETCH_ORSCANS);
  610. //expect_value(STRETCH_DELETESCANS);
  611. //expect_value(STRETCH_HALFTONE);
  612. test_proc_comment("PolyFill() Modes");
  613. expect_value(ALTERNATE);
  614. expect_value(WINDING);
  615. test_proc_comment("Layout Orientation Options");
  616. expect_value(LAYOUT_RTL);
  617. expect_value(LAYOUT_BTT);
  618. expect_value(LAYOUT_VBH);
  619. expect_value(LAYOUT_ORIENTATIONMASK);
  620. test_proc_comment("Text Alignment Options");
  621. expect_value(TA_NOUPDATECP);
  622. expect_value(TA_UPDATECP);
  623. expect_value(TA_LEFT);
  624. expect_value(TA_RIGHT);
  625. expect_value(TA_CENTER);
  626. expect_value(TA_TOP);
  627. expect_value(TA_BOTTOM);
  628. expect_value(TA_BASELINE);
  629. expect_value(TA_RTLREADING);
  630. expect_value(TA_MASK);
  631. test_proc_end();
  632. }
  633. static void verify_winmm(ofstream& out) {
  634. test_proc_begin();
  635. test_proc_comment("timeapi.h");
  636. expect_size(TIMECAPS);
  637. test_proc_comment("mmsyscom.h");
  638. expect_size(MMVERSION);
  639. expect_size(MMTIME);
  640. test_proc_comment("mmreg.h");
  641. expect_size(WAVEFORMATEX);
  642. expect_size(WAVEFORMATEXTENSIBLE);
  643. test_proc_comment("mmeapi.h");
  644. expect_size(WAVEHDR);
  645. expect_size(WAVEINCAPSW);
  646. expect_size(WAVEOUTCAPSW);
  647. test_proc_end();
  648. }
  649. static void verify_advapi32(ofstream& out) {
  650. test_proc_begin();
  651. test_proc_comment("wincrypt.h");
  652. expect_size(HCRYPTPROV);
  653. test_proc_end();
  654. }
  655. static void verify_winnls(ofstream& out) {
  656. test_proc_begin();
  657. test_proc_comment("winnls.h");
  658. expect_value(CP_ACP);
  659. expect_value(CP_OEMCP);
  660. expect_value(CP_MACCP);
  661. expect_value(CP_THREAD_ACP);
  662. expect_value(CP_SYMBOL);
  663. expect_value(CP_UTF7);
  664. expect_value(CP_UTF8);
  665. expect_value(MAX_DEFAULTCHAR);
  666. expect_value(MAX_LEADBYTES);
  667. expect_value(LOCALE_NAME_MAX_LENGTH);
  668. expect_value(LOCALE_NAME_USER_DEFAULT);
  669. expect_value_str(LOCALE_NAME_INVARIANT);
  670. expect_value_str(LOCALE_NAME_SYSTEM_DEFAULT);
  671. expect_size(LCTYPE);
  672. expect_size(CPINFOEXW);
  673. test_proc_end();
  674. }
  675. static void verify_winreg(ofstream& out) {
  676. test_proc_begin();
  677. test_proc_comment("winreg.h");
  678. expect_value(RRF_RT_REG_NONE);
  679. expect_value(RRF_RT_REG_SZ);
  680. expect_value(RRF_RT_REG_EXPAND_SZ);
  681. expect_value(RRF_RT_REG_BINARY);
  682. expect_value(RRF_RT_REG_DWORD);
  683. expect_value(RRF_RT_REG_MULTI_SZ);
  684. expect_value(RRF_RT_REG_QWORD);
  685. expect_value(RRF_RT_DWORD);
  686. expect_value(RRF_RT_QWORD);
  687. expect_value(RRF_RT_ANY);
  688. expect_value(RRF_NOEXPAND);
  689. expect_value(RRF_ZEROONFAILURE);
  690. test_proc_comment("winnt.h");
  691. expect_value_32(HKEY_CLASSES_ROOT);
  692. expect_value_32(HKEY_CURRENT_USER);
  693. expect_value_32(HKEY_LOCAL_MACHINE);
  694. expect_value_32(HKEY_USERS);
  695. expect_value_32(HKEY_PERFORMANCE_DATA);
  696. expect_value_32(HKEY_PERFORMANCE_TEXT);
  697. expect_value_32(HKEY_PERFORMANCE_NLSTEXT);
  698. expect_value_32(HKEY_CURRENT_CONFIG);
  699. expect_value_32(HKEY_DYN_DATA);
  700. expect_value_32(HKEY_CURRENT_USER_LOCAL_SETTINGS);
  701. expect_value(DELETE);
  702. expect_value(READ_CONTROL);
  703. expect_value(WRITE_DAC);
  704. expect_value(WRITE_OWNER);
  705. expect_value(SYNCHRONIZE);
  706. expect_value(KEY_QUERY_VALUE);
  707. expect_value(KEY_SET_VALUE);
  708. expect_value(KEY_CREATE_SUB_KEY);
  709. expect_value(KEY_ENUMERATE_SUB_KEYS);
  710. expect_value(KEY_NOTIFY);
  711. expect_value(KEY_CREATE_LINK);
  712. expect_value(KEY_WOW64_32KEY);
  713. expect_value(KEY_WOW64_64KEY);
  714. expect_value(KEY_WOW64_RES);
  715. expect_value(KEY_READ);
  716. expect_value(KEY_WRITE);
  717. expect_value(KEY_EXECUTE);
  718. expect_value(KEY_ALL_ACCESS);
  719. // RegQueryInfoKey
  720. test_proc_end();
  721. }
  722. static void verify_verrsrc(ofstream& out) {
  723. test_proc_begin();
  724. test_proc_comment("verrsrc.h");
  725. //expect_value_64(VS_FILE_INFO);
  726. expect_value(VS_VERSION_INFO);
  727. expect_value(VS_USER_DEFINED);
  728. expect_size(VS_FIXEDFILEINFO);
  729. // expect_value(VS_FF_DEBUG);
  730. // expect_value(VS_FF_PRERELEASE);
  731. // expect_value(VS_FF_PATCHED);
  732. expect_value(VS_FFI_SIGNATURE);
  733. // VFF_DEBUG
  734. // VFT_WINDOWS_DRV
  735. // VFT_WINDOWS_DLL
  736. test_proc_end();
  737. }
  738. static void verify_error_codes(ofstream& out) {
  739. test_proc_begin();
  740. test_proc_comment("winerror.h");
  741. expect_value(ERROR_SUCCESS);
  742. expect_value(NO_ERROR);
  743. expect_value(SEC_E_OK);
  744. out << endl;
  745. expect_value(ERROR_INVALID_FUNCTION);
  746. expect_value(ERROR_FILE_NOT_FOUND);
  747. expect_value(ERROR_PATH_NOT_FOUND);
  748. expect_value(ERROR_ACCESS_DENIED);
  749. expect_value(ERROR_INVALID_HANDLE);
  750. expect_value(ERROR_NOT_ENOUGH_MEMORY);
  751. expect_value(ERROR_INVALID_BLOCK);
  752. expect_value(ERROR_BAD_ENVIRONMENT);
  753. expect_value(ERROR_BAD_FORMAT);
  754. expect_value(ERROR_INVALID_ACCESS);
  755. expect_value(ERROR_INVALID_DATA);
  756. expect_value(ERROR_OUTOFMEMORY);
  757. expect_value(ERROR_INVALID_DRIVE);
  758. expect_value(ERROR_CURRENT_DIRECTORY);
  759. expect_value(ERROR_NO_MORE_FILES);
  760. expect_value(ERROR_SHARING_VIOLATION);
  761. expect_value(ERROR_LOCK_VIOLATION);
  762. expect_value(ERROR_HANDLE_EOF);
  763. expect_value(ERROR_NOT_SUPPORTED);
  764. expect_value(ERROR_FILE_EXISTS);
  765. expect_value(ERROR_INVALID_PARAMETER);
  766. expect_value(ERROR_BROKEN_PIPE);
  767. expect_value(ERROR_CALL_NOT_IMPLEMENTED);
  768. expect_value(ERROR_INSUFFICIENT_BUFFER);
  769. expect_value(ERROR_INVALID_NAME);
  770. expect_value(ERROR_BAD_ARGUMENTS);
  771. expect_value(ERROR_LOCK_FAILED);
  772. expect_value(ERROR_ALREADY_EXISTS);
  773. expect_value(ERROR_NO_DATA);
  774. expect_value(ERROR_ENVVAR_NOT_FOUND);
  775. expect_value(ERROR_OPERATION_ABORTED);
  776. expect_value(ERROR_IO_PENDING);
  777. expect_value(ERROR_NO_UNICODE_TRANSLATION);
  778. expect_value(ERROR_TIMEOUT);
  779. expect_value(ERROR_DATATYPE_MISMATCH);
  780. expect_value(ERROR_UNSUPPORTED_TYPE);
  781. expect_value(ERROR_NOT_SAME_OBJECT);
  782. expect_value(ERROR_PIPE_CONNECTED);
  783. expect_value(ERROR_PIPE_BUSY);
  784. out << endl;
  785. expect_value(S_OK);
  786. expect_value(E_NOTIMPL);
  787. expect_value(E_NOINTERFACE);
  788. expect_value(E_POINTER);
  789. expect_value(E_ABORT);
  790. expect_value(E_FAIL);
  791. expect_value(E_UNEXPECTED);
  792. expect_value(E_ACCESSDENIED);
  793. expect_value(E_HANDLE);
  794. expect_value(E_OUTOFMEMORY);
  795. expect_value(E_INVALIDARG);
  796. // out << endl;
  797. // expect_value(SEVERITY_SUCCESS);
  798. // expect_value(SEVERITY_ERROR);
  799. // out << endl;
  800. // expect_value(FACILITY_NULL);
  801. test_proc_end();
  802. }
  803. static void verify_error_helpers(ofstream& out) {
  804. test_proc_begin();
  805. test_proc_comment("winerror.h");
  806. expect_value(SUCCEEDED(-1));
  807. expect_value(SUCCEEDED(0));
  808. expect_value(SUCCEEDED(1));
  809. out << endl;
  810. expect_value(FAILED(-1));
  811. expect_value(FAILED(0));
  812. expect_value(FAILED(1));
  813. out << endl;
  814. expect_value(IS_ERROR(-1));
  815. expect_value(IS_ERROR(0));
  816. expect_value(IS_ERROR(1));
  817. out << endl;
  818. expect_value(HRESULT_CODE(0xFFFFCCCC));
  819. expect_value(HRESULT_FACILITY(0xFFFFCCCC));
  820. expect_value(HRESULT_SEVERITY(0x12345678));
  821. expect_value(HRESULT_SEVERITY(0x87654321));
  822. out << endl;
  823. expect_value(MAKE_HRESULT(1, 2, 3));
  824. test_proc_end();
  825. }
  826. static void test_core_sys_windows(ofstream& out) {
  827. out << "#+build windows" << endl
  828. << "package " << __func__
  829. << " // generated by " << path(__FILE__).filename().replace_extension("").string() << endl
  830. << endl
  831. << "import \"core:testing\"" << endl
  832. << "import win32 \"core:sys/windows\"" << endl;
  833. verify_win32_type_sizes(out);
  834. verify_macros(out);
  835. verify_winnt(out);
  836. verify_winuser(out);
  837. verify_gdi32(out);
  838. verify_winmm(out);
  839. verify_advapi32(out);
  840. verify_winnls(out);
  841. verify_winreg(out);
  842. verify_verrsrc(out);
  843. verify_error_codes(out);
  844. verify_error_helpers(out);
  845. }
  846. int main(int argc, char* argv[]) {
  847. if (argc < 2) { cout << "Usage: " << path(argv[0]).filename().string() << " <odin-output-file>" << endl; return -1; }
  848. auto filepath = path(argv[1]);
  849. cout << "Writing " << filepath.string() << endl;
  850. ofstream out(filepath);
  851. test_core_sys_windows(out);
  852. out.close();
  853. }