quickwin 2.0.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/README.en.md +17 -22
  2. package/README.md +1 -3
  3. package/examples/exec_server.js +133 -29
  4. package/examples/exec_server_worker.js +1 -1
  5. package/examples/exec_server_worker.ts +2 -2
  6. package/examples/pdf_preview2.js +1 -1
  7. package/examples/pdf_preview2.ts +1 -1
  8. package/examples/pdf_viewer.js +132 -28
  9. package/examples/pdf_viewer.tsx +1 -1
  10. package/examples/test_gallery.js +131 -27
  11. package/examples/test_react_lazy.js +131 -27
  12. package/examples/test_react_listbox.js +131 -27
  13. package/examples/test_root_window.js +131 -27
  14. package/examples/test_tab.js +131 -27
  15. package/lib/certs.js +13 -8
  16. package/lib/certs.ts +13 -8
  17. package/lib/fetch.js +51 -3
  18. package/lib/fetch.ts +38 -3
  19. package/lib/ffi/bind.js +94 -5
  20. package/lib/ffi/bind.ts +107 -10
  21. package/lib/ffi/ctype.js +33 -7
  22. package/lib/ffi/ctype.ts +48 -10
  23. package/lib/ffi/struct.js +92 -14
  24. package/lib/ffi/struct.ts +108 -19
  25. package/lib/react-qw/components/ListView.js +1 -0
  26. package/lib/react-qw/components/PathPicker.js +2 -2
  27. package/lib/react-qw/index.js +1 -1
  28. package/lib/react-qw/index.ts +4 -1
  29. package/lib/text-measure.js +3 -1
  30. package/lib/text-measure.ts +4 -3
  31. package/lib/websocket.js +32 -2
  32. package/lib/websocket.ts +25 -2
  33. package/lib/windows/advapi32.js +53 -0
  34. package/lib/windows/advapi32.ts +64 -0
  35. package/lib/windows/comctl32.js +15 -15
  36. package/lib/windows/comctl32.ts +15 -16
  37. package/lib/windows/comdlg32.js +3 -2
  38. package/lib/windows/comdlg32.ts +3 -2
  39. package/lib/windows/gdi32.js +328 -26
  40. package/lib/windows/gdi32.ts +349 -26
  41. package/lib/windows/kernel32.js +206 -10
  42. package/lib/windows/kernel32.ts +225 -10
  43. package/lib/windows/msimg32.js +38 -0
  44. package/lib/windows/msimg32.ts +45 -0
  45. package/lib/windows/ntdll.js +3 -2
  46. package/lib/windows/ntdll.ts +3 -2
  47. package/lib/windows/ole32.js +1 -1
  48. package/lib/windows/ole32.ts +1 -1
  49. package/lib/windows/psapi.js +32 -0
  50. package/lib/windows/psapi.ts +37 -0
  51. package/lib/windows/shell32.js +5 -3
  52. package/lib/windows/shell32.ts +5 -3
  53. package/lib/windows/structs.js +135 -0
  54. package/lib/windows/structs.ts +144 -0
  55. package/lib/windows/user32.js +202 -99
  56. package/lib/windows/user32.ts +204 -99
  57. package/lib/windows/version.js +29 -0
  58. package/lib/windows/version.ts +35 -0
  59. package/lib/windows/winspool.js +71 -0
  60. package/lib/windows/winspool.ts +80 -0
  61. package/package.json +1 -1
  62. package/quickwin.d.ts +11 -5
  63. package/quickwin_const.d.ts +136 -0
  64. package/qwin-nowasm-x86.exe +0 -0
  65. package/qwin-nowasm.exe +0 -0
  66. package/qwin-x86.exe +0 -0
  67. package/qwin.exe +0 -0
  68. package/test/run.js +7 -0
  69. package/test/run.ts +7 -0
  70. package/test/test_basic_fetch.js +21 -0
  71. package/test/test_basic_fetch.ts +17 -0
  72. package/test/test_ffi.js +6 -6
  73. package/test/test_ffi.ts +6 -6
  74. package/test/test_ffi_abi.js +55 -0
  75. package/test/test_ffi_abi.ts +56 -0
  76. package/test/test_ffi_array.js +116 -0
  77. package/test/test_ffi_array.ts +141 -0
  78. package/test/test_ffi_bind.js +82 -0
  79. package/test/test_ffi_bind.ts +71 -0
  80. package/test/test_files.js +102 -0
  81. package/test/test_files.ts +121 -0
  82. package/test/test_gdi_draw.js +681 -0
  83. package/test/test_gdi_draw.ts +725 -0
  84. package/test/test_net_fetch.js +4 -3
  85. package/test/test_net_fetch.ts +4 -3
  86. package/test/test_printer.js +137 -0
  87. package/test/test_printer.ts +148 -0
  88. package/test/test_proc.js +141 -0
  89. package/test/test_proc.ts +163 -0
  90. package/test/test_react_complex.js +131 -27
  91. package/test/test_react_counter.js +131 -27
  92. package/test/test_react_flex.js +131 -27
  93. package/test/test_react_hidden.js +131 -27
  94. package/test/test_react_listview_link.js +131 -27
  95. package/test/test_react_notify.js +131 -27
  96. package/test/test_react_render.js +131 -27
  97. package/test/test_registry.js +74 -0
  98. package/test/test_registry.ts +95 -0
  99. package/test/test_sysinfo.js +122 -0
  100. package/test/test_sysinfo.ts +141 -0
  101. package/test/test_wolfssl_read.js +45 -44
  102. package/test/test_wolfssl_read.ts +42 -42
@@ -2,7 +2,8 @@
2
2
  import { bind } from '../ffi/bind.js';
3
3
  // dll 名部分应用(工厂转调保泛型 infer,见 lib/windows/user32.ts 头注释)
4
4
  const b = (name, sig) => bind('ntdll.dll', name, sig);
5
- /** 取真实 OS 版本(成功 → 0);缓冲必须用 OSVERSIONINFO_148(148B 特制布局,
5
+ /** 取真实 OS 版本;缓冲必须用 OSVERSIONINFO_148(148B 特制布局,
6
6
  * 标准 OSVERSIONINFOW 会越界写坏调用方堆,见 structs.ts)
7
+ * @returns 0 = 成功
7
8
  * @param args_0 lpVersionInformation OSVERSIONINFO_148.encode(...).ptr 出参缓冲 */
8
- export const RtlGetVersion = /*@__PURE__*/ b('RtlGetVersion', '<BYTE>ptr -> i32');
9
+ export const RtlGetVersion = /*@__PURE__*/ b('RtlGetVersion', '<OSVERSIONINFO_148>ptr -> i32');
@@ -4,7 +4,8 @@ import { bind } from '../ffi/bind.js'
4
4
  // dll 名部分应用(工厂转调保泛型 infer,见 lib/windows/user32.ts 头注释)
5
5
  const b = <const S extends string>(name: string, sig: S) => bind('ntdll.dll', name, sig)
6
6
 
7
- /** 取真实 OS 版本(成功 → 0);缓冲必须用 OSVERSIONINFO_148(148B 特制布局,
7
+ /** 取真实 OS 版本;缓冲必须用 OSVERSIONINFO_148(148B 特制布局,
8
8
  * 标准 OSVERSIONINFOW 会越界写坏调用方堆,见 structs.ts)
9
+ * @returns 0 = 成功
9
10
  * @param args_0 lpVersionInformation OSVERSIONINFO_148.encode(...).ptr 出参缓冲 */
10
- export const RtlGetVersion = /*@__PURE__*/ b('RtlGetVersion', '<BYTE>ptr -> i32')
11
+ export const RtlGetVersion = /*@__PURE__*/ b('RtlGetVersion', '<OSVERSIONINFO_148>ptr -> i32')
@@ -2,6 +2,6 @@
2
2
  import { bind } from '../ffi/bind.js';
3
3
  // dll 名部分应用(工厂转调保泛型 infer,见 lib/windows/user32.ts 头注释)
4
4
  const b = (name, sig) => bind('ole32.dll', name, sig);
5
- /** 释放 CoTaskMemAlloc 分配的内存(SHBrowseForFolder 返回的 PIDL 等);无返回值
5
+ /** 释放 CoTaskMemAlloc 分配的内存(SHBrowseForFolder 返回的 PIDL 等)
6
6
  * @param args_0 pv CoTaskMem 分配的指针(0/NULL 安全) */
7
7
  export const CoTaskMemFree = /*@__PURE__*/ b('CoTaskMemFree', '<>ptr -> void');
@@ -4,6 +4,6 @@ import { bind } from '../ffi/bind.js'
4
4
  // dll 名部分应用(工厂转调保泛型 infer,见 lib/windows/user32.ts 头注释)
5
5
  const b = <const S extends string>(name: string, sig: S) => bind('ole32.dll', name, sig)
6
6
 
7
- /** 释放 CoTaskMemAlloc 分配的内存(SHBrowseForFolder 返回的 PIDL 等);无返回值
7
+ /** 释放 CoTaskMemAlloc 分配的内存(SHBrowseForFolder 返回的 PIDL 等)
8
8
  * @param args_0 pv CoTaskMem 分配的指针(0/NULL 安全) */
9
9
  export const CoTaskMemFree = /*@__PURE__*/ b('CoTaskMemFree', '<>ptr -> void')
@@ -0,0 +1,32 @@
1
+ // psapi.dll 绑定(进程内存统计 / 模块路径;品牌约定见 lib/windows/user32.ts 头注释):
2
+ // - 句柄位与 kernel32 同型互认:进程 <HPROCESS>ptr(OpenProcess 产物,CloseHandle 收宽
3
+ // 直通)、模块 <HMODULE>ptr(NULL = 主执行模块)
4
+ // - PID 数组 / DWORD 出参槽用 <BYTE>ptr 直收 PtrArrayBuffer(TypedArray 原地读回);
5
+ // 结构出参位收 alloc().ptr、预写首字段后 decode 读回(PROCESSENTRY32W 同法,
6
+ // 见 ./structs.ts JSDoc)
7
+ // - XP 起系统自带 psapi.dll(官方 min XP 桌面应用),XP/Win7 双机直连
8
+ import { bind } from '../ffi/bind.js';
9
+ // dll 名部分应用(工厂转调保泛型 infer,见 lib/windows/user32.ts 头注释)
10
+ const b = (name, sig) => bind('psapi.dll', name, sig);
11
+ /** 把系统进程 PID 填进数组缓冲
12
+ * @returns 成功 → 非 0
13
+ * @param args_0 lpidProcess PID 数组缓冲(PtrArrayBuffer(count * 4),Uint32Array 读回)
14
+ * @param args_1 cb 缓冲字节数(= count * 4)
15
+ * @param args_2 lpcbNeeded 出参槽(实际写字节数 → PID 数 = /4),PtrArrayBuffer(4) */
16
+ export const EnumProcesses = /*@__PURE__*/ b('EnumProcesses', '<BYTE>ptr u32 <BYTE>ptr -> i32');
17
+ /** 取进程内存统计
18
+ * @returns 成功 → 非 0
19
+ * @param args_0 hProcess 进程句柄(须 PROCESS_QUERY_INFORMATION | PROCESS_VM_READ)
20
+ * @param args_1 ppmc 出参缓冲:alloc() 后预写 offset0 cb = size(new Uint32Array(buf)[0]
21
+ * = PROCESS_MEMORY_COUNTERS.size),decode(buf) 读回
22
+ * @param args_2 cb 结构字节数(= PROCESS_MEMORY_COUNTERS.size) */
23
+ export const GetProcessMemoryInfo = /*@__PURE__*/ b('GetProcessMemoryInfo', '<HPROCESS>ptr! <PROCESS_MEMORY_COUNTERS>ptr! u32 -> i32');
24
+ /** 取进程模块完整路径(hModule = NULL → 主执行文件)
25
+ * @returns 写入字符数(0 失败;
26
+ * 缓冲不足 = 截断返回 nSize 不含 NUL)
27
+ * @param args_0 hProcess 进程句柄(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ)
28
+ * @param args_1 hModule 模块句柄(NULL = exe 主模块;toolhelp MODULEENTRY32W.hModule 是
29
+ * 目标进程上下文的值,跨进程须同权限下重开句柄才可用——本族先例:NULL 用法)
30
+ * @param args_2 lpFilename 文本出参缓冲(WCHAR.alloc(n) + WCHAR.decode 读回)
31
+ * @param args_3 nSize 缓冲字符数(含 NUL 空间) */
32
+ export const GetModuleFileNameEx = /*@__PURE__*/ b('GetModuleFileNameExW', '<HPROCESS>ptr! <HMODULE>ptr <BYTE>ptr u32 -> u32');
@@ -0,0 +1,37 @@
1
+ // psapi.dll 绑定(进程内存统计 / 模块路径;品牌约定见 lib/windows/user32.ts 头注释):
2
+ // - 句柄位与 kernel32 同型互认:进程 <HPROCESS>ptr(OpenProcess 产物,CloseHandle 收宽
3
+ // 直通)、模块 <HMODULE>ptr(NULL = 主执行模块)
4
+ // - PID 数组 / DWORD 出参槽用 <BYTE>ptr 直收 PtrArrayBuffer(TypedArray 原地读回);
5
+ // 结构出参位收 alloc().ptr、预写首字段后 decode 读回(PROCESSENTRY32W 同法,
6
+ // 见 ./structs.ts JSDoc)
7
+ // - XP 起系统自带 psapi.dll(官方 min XP 桌面应用),XP/Win7 双机直连
8
+ import { bind } from '../ffi/bind.js'
9
+
10
+ // dll 名部分应用(工厂转调保泛型 infer,见 lib/windows/user32.ts 头注释)
11
+ const b = <const S extends string>(name: string, sig: S) => bind('psapi.dll', name, sig)
12
+
13
+ /** 把系统进程 PID 填进数组缓冲
14
+ * @returns 成功 → 非 0
15
+ * @param args_0 lpidProcess PID 数组缓冲(PtrArrayBuffer(count * 4),Uint32Array 读回)
16
+ * @param args_1 cb 缓冲字节数(= count * 4)
17
+ * @param args_2 lpcbNeeded 出参槽(实际写字节数 → PID 数 = /4),PtrArrayBuffer(4) */
18
+ export const EnumProcesses = /*@__PURE__*/ b('EnumProcesses',
19
+ '<BYTE>ptr u32 <BYTE>ptr -> i32')
20
+ /** 取进程内存统计
21
+ * @returns 成功 → 非 0
22
+ * @param args_0 hProcess 进程句柄(须 PROCESS_QUERY_INFORMATION | PROCESS_VM_READ)
23
+ * @param args_1 ppmc 出参缓冲:alloc() 后预写 offset0 cb = size(new Uint32Array(buf)[0]
24
+ * = PROCESS_MEMORY_COUNTERS.size),decode(buf) 读回
25
+ * @param args_2 cb 结构字节数(= PROCESS_MEMORY_COUNTERS.size) */
26
+ export const GetProcessMemoryInfo = /*@__PURE__*/ b('GetProcessMemoryInfo',
27
+ '<HPROCESS>ptr! <PROCESS_MEMORY_COUNTERS>ptr! u32 -> i32')
28
+ /** 取进程模块完整路径(hModule = NULL → 主执行文件)
29
+ * @returns 写入字符数(0 失败;
30
+ * 缓冲不足 = 截断返回 nSize 不含 NUL)
31
+ * @param args_0 hProcess 进程句柄(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ)
32
+ * @param args_1 hModule 模块句柄(NULL = exe 主模块;toolhelp MODULEENTRY32W.hModule 是
33
+ * 目标进程上下文的值,跨进程须同权限下重开句柄才可用——本族先例:NULL 用法)
34
+ * @param args_2 lpFilename 文本出参缓冲(WCHAR.alloc(n) + WCHAR.decode 读回)
35
+ * @param args_3 nSize 缓冲字符数(含 NUL 空间) */
36
+ export const GetModuleFileNameEx = /*@__PURE__*/ b('GetModuleFileNameExW',
37
+ '<HPROCESS>ptr! <HMODULE>ptr <BYTE>ptr u32 -> u32')
@@ -2,10 +2,12 @@
2
2
  import { bind } from '../ffi/bind.js';
3
3
  // dll 名部分应用(工厂转调保泛型 infer,见 lib/windows/user32.ts 头注释)
4
4
  const b = (name, sig) => bind('shell32.dll', name, sig);
5
- /** 文件夹浏览对话框;返回 PIDL,取消 → 0;PIDL 用 ole32.CoTaskMemFree 释放
5
+ /** 文件夹浏览对话框;PIDL 用 ole32.CoTaskMemFree 释放
6
+ * @returns PIDL,取消 → 0
6
7
  * @param args_0 pbi BROWSEINFOW.encode(...).ptr(见 structs.ts) */
7
- export const SHBrowseForFolder = /*@__PURE__*/ b('SHBrowseForFolderW', '<BYTE>ptr -> <>ptr');
8
- /** PIDL → 文件系统全路径;PIDL 在文件系统中 → 非 0,否则 0(缓冲内容未定义)
8
+ export const SHBrowseForFolder = /*@__PURE__*/ b('SHBrowseForFolderW', '<BROWSEINFOW>ptr -> <>ptr');
9
+ /** PIDL → 文件系统全路径
10
+ * @returns PIDL 在文件系统中 → 非 0,否则 0(缓冲内容未定义)
9
11
  * @param args_0 pidl SHBrowseForFolder 等返回的 PIDL
10
12
  * @param args_1 pszPath 出参缓冲,WCHAR.alloc(260)(MAX_PATH=260)、WCHAR.decode 读回 */
11
13
  export const SHGetPathFromIDList = /*@__PURE__*/ b('SHGetPathFromIDListW', '<>ptr <BYTE>ptr -> u32');
@@ -4,11 +4,13 @@ import { bind } from '../ffi/bind.js'
4
4
  // dll 名部分应用(工厂转调保泛型 infer,见 lib/windows/user32.ts 头注释)
5
5
  const b = <const S extends string>(name: string, sig: S) => bind('shell32.dll', name, sig)
6
6
 
7
- /** 文件夹浏览对话框;返回 PIDL,取消 → 0;PIDL 用 ole32.CoTaskMemFree 释放
7
+ /** 文件夹浏览对话框;PIDL 用 ole32.CoTaskMemFree 释放
8
+ * @returns PIDL,取消 → 0
8
9
  * @param args_0 pbi BROWSEINFOW.encode(...).ptr(见 structs.ts) */
9
- export const SHBrowseForFolder = /*@__PURE__*/ b('SHBrowseForFolderW', '<BYTE>ptr -> <>ptr')
10
+ export const SHBrowseForFolder = /*@__PURE__*/ b('SHBrowseForFolderW', '<BROWSEINFOW>ptr -> <>ptr')
10
11
 
11
- /** PIDL → 文件系统全路径;PIDL 在文件系统中 → 非 0,否则 0(缓冲内容未定义)
12
+ /** PIDL → 文件系统全路径
13
+ * @returns PIDL 在文件系统中 → 非 0,否则 0(缓冲内容未定义)
12
14
  * @param args_0 pidl SHBrowseForFolder 等返回的 PIDL
13
15
  * @param args_1 pszPath 出参缓冲,WCHAR.alloc(260)(MAX_PATH=260)、WCHAR.decode 读回 */
14
16
  export const SHGetPathFromIDList = /*@__PURE__*/ b('SHGetPathFromIDListW', '<>ptr <BYTE>ptr -> u32')
@@ -22,6 +22,17 @@ export const SIZE = /* @__PURE__ */ struct('SIZE', {
22
22
  cx: 'i32',
23
23
  cy: 'i32',
24
24
  });
25
+ /** 混合函数(4B,双架构同布局):AlphaBlend 末参**按值**传(bind 的按值位
26
+ * `<BLENDFUNCTION>`,非 `<BLENDFUNCTION>ptr`)——4B POD 聚合体在 x64 走位置寄存器、
27
+ * ia32 压 4 字节,字段序须与 windows.h 逐字节一致。BlendOp 仅 AC_SRC_OVER(0)、
28
+ * BlendFlags 恒 0(MSDN);AC_SRC_ALPHA(1) 是 AlphaFormat 的值(源带 premultiplied
29
+ * alpha 通道时置位)。纯入参位注册 encoder(对象直传,缺省字段跳过的零值合法)。 */
30
+ export const BLENDFUNCTION = /* @__PURE__ */ struct('BLENDFUNCTION', {
31
+ BlendOp: 'u8',
32
+ BlendFlags: 'u8',
33
+ SourceConstantAlpha: 'u8',
34
+ AlphaFormat: 'u8',
35
+ });
25
36
  /** 滚动参数(28B):cbSize 必须 = SCROLLINFO.size(结构自描述是 Win32 要求,缺省跳过帮不了);
26
37
  * fMask = SIF_* 决定 Set 写哪些项 / Get 读哪些项 */
27
38
  export const SCROLLINFO = /* @__PURE__ */ struct('SCROLLINFO', {
@@ -51,6 +62,82 @@ export const LOGFONTW = /* @__PURE__ */ struct('LOGFONTW', {
51
62
  lfPitchAndFamily: 'u8',
52
63
  lfFaceName: 'u16[32]@utf-16le',
53
64
  });
65
+ /** TEXTMETRICW(60B = 11 LONG + 4 WCHAR + 5 BYTE 尾部补齐,双架构同布局):
66
+ * GetTextMetrics 纯出参位(不注册 encoder:TEXTMETRICW.alloc().ptr 进、decode 读回) */
67
+ export const TEXTMETRICW = /* @__PURE__ */ struct('TEXTMETRICW', {
68
+ tmHeight: 'i32',
69
+ tmAscent: 'i32',
70
+ tmDescent: 'i32',
71
+ tmInternalLeading: 'i32',
72
+ tmExternalLeading: 'i32',
73
+ tmAveCharWidth: 'i32',
74
+ tmMaxCharWidth: 'i32',
75
+ tmWeight: 'i32',
76
+ tmOverhang: 'i32',
77
+ tmDigitizedAspectX: 'i32',
78
+ tmDigitizedAspectY: 'i32',
79
+ tmFirstChar: 'u16',
80
+ tmLastChar: 'u16',
81
+ tmDefaultChar: 'u16',
82
+ tmBreakChar: 'u16',
83
+ tmItalic: 'u8',
84
+ tmUnderlined: 'u8',
85
+ tmStruckOut: 'u8',
86
+ tmPitchAndFamily: 'u8',
87
+ tmCharSet: 'u8',
88
+ });
89
+ /** WIN32_FIND_DATAW(592B 双架构同布局 = 8 头字段 44B + WCHAR[260] + WCHAR[14],
90
+ * mingw wingdi.h 的 cAlternateFileName 为 WCHAR[14] 非 MSDN 的 CHAR[14]):
91
+ * FindFirstFile/FindNextFile 纯出参位(不注册 encoder:WIN32_FIND_DATAW.alloc().ptr
92
+ * 进、decode 读回)。FILETIME 是 align 4 的 8B 时间,以 u64 + pack 4 忠实布局
93
+ * (u64 自然 align 8 须 pack 压到 4);时间值为 1601 起的 100ns 单元(bigint) */
94
+ export const WIN32_FIND_DATAW = /* @__PURE__ */ struct('WIN32_FIND_DATAW', {
95
+ dwFileAttributes: 'u32',
96
+ ftCreationTime: 'u64',
97
+ ftLastAccessTime: 'u64',
98
+ ftLastWriteTime: 'u64',
99
+ nFileSizeHigh: 'u32',
100
+ nFileSizeLow: 'u32',
101
+ dwReserved0: 'u32',
102
+ dwReserved1: 'u32',
103
+ cFileName: 'u16[260]@utf-16le',
104
+ cAlternateFileName: 'u16[14]@utf-16le',
105
+ }, { pack: 4 });
106
+ /** DOC_INFO_1W(3 指针随位宽:x64 24B / ia32 12B):StartDocPrinter 纯入参位
107
+ * (注册 encoder:{ pDocName: WCHAR.encode(s).ptr, ... } 对象直传——指针字段收裸
108
+ * 地址 number,字符串缓冲自行 WCHAR.encode 分配并保持引用) */
109
+ export const DOC_INFO_1W = /* @__PURE__ */ struct('DOC_INFO_1W', {
110
+ pDocName: '<>ptr',
111
+ pOutputFile: '<>ptr',
112
+ pDatatype: '<>ptr',
113
+ });
114
+ /** PRINTER_INFO_2W(13 指针 + 8 DWORD:x64 136B / ia32 84B,双架构已由 test_ffi raw 实测):
115
+ * EnumPrinters(Level=2) 出参数组元素。指针字段 decode 出地址 number,字符串须
116
+ * 逐字宽读跟进;数组 = 单缓冲读回(structArray().decode(buf, count):元素间无空洞,
117
+ * 但缓冲尾部含字符串区 → byteLength 非整数倍,须显式 count)。纯出参不注册 encoder */
118
+ export const PRINTER_INFO_2W = /* @__PURE__ */ struct('PRINTER_INFO_2W', {
119
+ pServerName: '<>ptr',
120
+ pPrinterName: '<>ptr',
121
+ pShareName: '<>ptr',
122
+ pPortName: '<>ptr',
123
+ pDriverName: '<>ptr',
124
+ pComment: '<>ptr',
125
+ pLocation: '<>ptr',
126
+ pDevMode: '<>ptr',
127
+ pSepFile: '<>ptr',
128
+ pPrintProcessor: '<>ptr',
129
+ pDatatype: '<>ptr',
130
+ pParameters: '<>ptr',
131
+ pSecurityDescriptor: '<>ptr',
132
+ Attributes: 'u32',
133
+ Priority: 'u32',
134
+ DefaultPriority: 'u32',
135
+ StartTime: 'u32',
136
+ UntilTime: 'u32',
137
+ Status: 'u32',
138
+ cJobs: 'u32',
139
+ AveragePPM: 'u32',
140
+ });
54
141
  /** 进程启动信息(CreateProcessW 纯入参位):指针字段随进程位宽(x86 68B / x64 104B,struct 按 os.arch 推,
55
142
  * os.arch 是编译期进程指针宽度,WOW64 下 32 位进程得 ia32 布局)。cb 必须 = STARTUPINFOW.size
56
143
  * (结构自描述是 Win32 要求);dwFlags 含 STARTF_USESTDHANDLES(0x100) 时才读 hStd* */
@@ -382,3 +469,51 @@ export const OSVERSIONINFO_148 = /* @__PURE__ */ struct('OSVERSIONINFO_148', {
382
469
  dwPlatformId: 'u32',
383
470
  szCSDVersion: 'u8[128]',
384
471
  });
472
+ // ── 进程快照 / 内存统计(toolhelp + psapi,布局来源官方 tlhelp32.h / psapi.h)────────
473
+ /** PROCESSENTRY32W(Process32First/Next 就地迭代位;x86 556B / x64 564B——ULONG_PTR
474
+ * th32DefaultHeapID 随位宽,struct 按 os.arch 推):调用前须把 offset 0 的 dwSize 预写
475
+ * 成 size(MSDN:不初始化 dwSize 则 Process32First 失败)——alloc() 后
476
+ * new Uint32Array(buf)[0] = PROCESSENTRY32W.size 一次;First/Next 迭代间复用同一 buf
477
+ * (API 只改内容不改 dwSize),每轮 N.decode(buf) 读回 */
478
+ export const PROCESSENTRY32W = /* @__PURE__ */ struct('PROCESSENTRY32W', {
479
+ dwSize: 'u32',
480
+ cntUsage: 'u32',
481
+ th32ProcessID: 'u32',
482
+ th32DefaultHeapID: '<>ptr',
483
+ th32ModuleID: 'u32',
484
+ cntThreads: 'u32',
485
+ th32ParentProcessID: 'u32',
486
+ pcPriClassBase: 'i32',
487
+ dwFlags: 'u32',
488
+ szExeFile: 'u16[260]@utf-16le',
489
+ });
490
+ /** MODULEENTRY32W(Module32First/Next 就地迭代位;x86 1072B / x64 1088B——BYTE* +
491
+ * HMODULE 随位宽)。dwSize 预写同 PROCESSENTRY32W;modBaseAddr/hModule 仅在
492
+ * th32ProcessID 的进程上下文有效;szModule 定长 256 = MAX_MODULE_NAME32+1 */
493
+ export const MODULEENTRY32W = /* @__PURE__ */ struct('MODULEENTRY32W', {
494
+ dwSize: 'u32',
495
+ th32ModuleID: 'u32',
496
+ th32ProcessID: 'u32',
497
+ GlblcntUsage: 'u32',
498
+ ProccntUsage: 'u32',
499
+ modBaseAddr: '<>ptr',
500
+ modBaseSize: 'u32',
501
+ hModule: '<HMODULE>ptr',
502
+ szModule: 'u16[256]@utf-16le',
503
+ szExePath: 'u16[260]@utf-16le',
504
+ });
505
+ /** PROCESS_MEMORY_COUNTERS(GetProcessMemoryInfo 出参位;x86 40B / x64 72B):官方 psapi.h
506
+ * 为 cb + PageFaultCount 后接 8×SIZE_T——SIZE_T 随位宽(非全 DWORD),struct 按 os.arch 推。
507
+ * 调用前 offset 0 的 cb 预写成 size(new Uint32Array(buf)[0] = N.size),实参 u32 cb 同传 size */
508
+ export const PROCESS_MEMORY_COUNTERS = /* @__PURE__ */ struct('PROCESS_MEMORY_COUNTERS', {
509
+ cb: 'u32',
510
+ PageFaultCount: 'u32',
511
+ PeakWorkingSetSize: '<>ptr',
512
+ WorkingSetSize: '<>ptr',
513
+ QuotaPeakPagedPoolUsage: '<>ptr',
514
+ QuotaPagedPoolUsage: '<>ptr',
515
+ QuotaPeakNonPagedPoolUsage: '<>ptr',
516
+ QuotaNonPagedPoolUsage: '<>ptr',
517
+ PagefileUsage: '<>ptr',
518
+ PeakPagefileUsage: '<>ptr',
519
+ });
@@ -27,6 +27,18 @@ export const SIZE = /* @__PURE__ */ struct('SIZE', {
27
27
  cy: 'i32',
28
28
  })
29
29
 
30
+ /** 混合函数(4B,双架构同布局):AlphaBlend 末参**按值**传(bind 的按值位
31
+ * `<BLENDFUNCTION>`,非 `<BLENDFUNCTION>ptr`)——4B POD 聚合体在 x64 走位置寄存器、
32
+ * ia32 压 4 字节,字段序须与 windows.h 逐字节一致。BlendOp 仅 AC_SRC_OVER(0)、
33
+ * BlendFlags 恒 0(MSDN);AC_SRC_ALPHA(1) 是 AlphaFormat 的值(源带 premultiplied
34
+ * alpha 通道时置位)。纯入参位注册 encoder(对象直传,缺省字段跳过的零值合法)。 */
35
+ export const BLENDFUNCTION = /* @__PURE__ */ struct('BLENDFUNCTION', {
36
+ BlendOp: 'u8',
37
+ BlendFlags: 'u8',
38
+ SourceConstantAlpha: 'u8',
39
+ AlphaFormat: 'u8',
40
+ })
41
+
30
42
  /** 滚动参数(28B):cbSize 必须 = SCROLLINFO.size(结构自描述是 Win32 要求,缺省跳过帮不了);
31
43
  * fMask = SIF_* 决定 Set 写哪些项 / Get 读哪些项 */
32
44
  export const SCROLLINFO = /* @__PURE__ */ struct('SCROLLINFO', {
@@ -58,6 +70,86 @@ export const LOGFONTW = /* @__PURE__ */ struct('LOGFONTW', {
58
70
  lfFaceName: 'u16[32]@utf-16le',
59
71
  })
60
72
 
73
+ /** TEXTMETRICW(60B = 11 LONG + 4 WCHAR + 5 BYTE 尾部补齐,双架构同布局):
74
+ * GetTextMetrics 纯出参位(不注册 encoder:TEXTMETRICW.alloc().ptr 进、decode 读回) */
75
+ export const TEXTMETRICW = /* @__PURE__ */ struct('TEXTMETRICW', {
76
+ tmHeight: 'i32',
77
+ tmAscent: 'i32',
78
+ tmDescent: 'i32',
79
+ tmInternalLeading: 'i32',
80
+ tmExternalLeading: 'i32',
81
+ tmAveCharWidth: 'i32',
82
+ tmMaxCharWidth: 'i32',
83
+ tmWeight: 'i32',
84
+ tmOverhang: 'i32',
85
+ tmDigitizedAspectX: 'i32',
86
+ tmDigitizedAspectY: 'i32',
87
+ tmFirstChar: 'u16',
88
+ tmLastChar: 'u16',
89
+ tmDefaultChar: 'u16',
90
+ tmBreakChar: 'u16',
91
+ tmItalic: 'u8',
92
+ tmUnderlined: 'u8',
93
+ tmStruckOut: 'u8',
94
+ tmPitchAndFamily: 'u8',
95
+ tmCharSet: 'u8',
96
+ })
97
+
98
+ /** WIN32_FIND_DATAW(592B 双架构同布局 = 8 头字段 44B + WCHAR[260] + WCHAR[14],
99
+ * mingw wingdi.h 的 cAlternateFileName 为 WCHAR[14] 非 MSDN 的 CHAR[14]):
100
+ * FindFirstFile/FindNextFile 纯出参位(不注册 encoder:WIN32_FIND_DATAW.alloc().ptr
101
+ * 进、decode 读回)。FILETIME 是 align 4 的 8B 时间,以 u64 + pack 4 忠实布局
102
+ * (u64 自然 align 8 须 pack 压到 4);时间值为 1601 起的 100ns 单元(bigint) */
103
+ export const WIN32_FIND_DATAW = /* @__PURE__ */ struct('WIN32_FIND_DATAW', {
104
+ dwFileAttributes: 'u32',
105
+ ftCreationTime: 'u64',
106
+ ftLastAccessTime: 'u64',
107
+ ftLastWriteTime: 'u64',
108
+ nFileSizeHigh: 'u32',
109
+ nFileSizeLow: 'u32',
110
+ dwReserved0: 'u32',
111
+ dwReserved1: 'u32',
112
+ cFileName: 'u16[260]@utf-16le',
113
+ cAlternateFileName: 'u16[14]@utf-16le',
114
+ }, { pack: 4 })
115
+
116
+ /** DOC_INFO_1W(3 指针随位宽:x64 24B / ia32 12B):StartDocPrinter 纯入参位
117
+ * (注册 encoder:{ pDocName: WCHAR.encode(s).ptr, ... } 对象直传——指针字段收裸
118
+ * 地址 number,字符串缓冲自行 WCHAR.encode 分配并保持引用) */
119
+ export const DOC_INFO_1W = /* @__PURE__ */ struct('DOC_INFO_1W', {
120
+ pDocName: '<>ptr',
121
+ pOutputFile: '<>ptr',
122
+ pDatatype: '<>ptr',
123
+ })
124
+
125
+ /** PRINTER_INFO_2W(13 指针 + 8 DWORD:x64 136B / ia32 84B,双架构已由 test_ffi raw 实测):
126
+ * EnumPrinters(Level=2) 出参数组元素。指针字段 decode 出地址 number,字符串须
127
+ * 逐字宽读跟进;数组 = 单缓冲读回(structArray().decode(buf, count):元素间无空洞,
128
+ * 但缓冲尾部含字符串区 → byteLength 非整数倍,须显式 count)。纯出参不注册 encoder */
129
+ export const PRINTER_INFO_2W = /* @__PURE__ */ struct('PRINTER_INFO_2W', {
130
+ pServerName: '<>ptr',
131
+ pPrinterName: '<>ptr',
132
+ pShareName: '<>ptr',
133
+ pPortName: '<>ptr',
134
+ pDriverName: '<>ptr',
135
+ pComment: '<>ptr',
136
+ pLocation: '<>ptr',
137
+ pDevMode: '<>ptr',
138
+ pSepFile: '<>ptr',
139
+ pPrintProcessor: '<>ptr',
140
+ pDatatype: '<>ptr',
141
+ pParameters: '<>ptr',
142
+ pSecurityDescriptor: '<>ptr',
143
+ Attributes: 'u32',
144
+ Priority: 'u32',
145
+ DefaultPriority: 'u32',
146
+ StartTime: 'u32',
147
+ UntilTime: 'u32',
148
+ Status: 'u32',
149
+ cJobs: 'u32',
150
+ AveragePPM: 'u32',
151
+ })
152
+
61
153
  /** 进程启动信息(CreateProcessW 纯入参位):指针字段随进程位宽(x86 68B / x64 104B,struct 按 os.arch 推,
62
154
  * os.arch 是编译期进程指针宽度,WOW64 下 32 位进程得 ia32 布局)。cb 必须 = STARTUPINFOW.size
63
155
  * (结构自描述是 Win32 要求);dwFlags 含 STARTF_USESTDHANDLES(0x100) 时才读 hStd* */
@@ -420,3 +512,55 @@ export const OSVERSIONINFO_148 = /* @__PURE__ */ struct('OSVERSIONINFO_148', {
420
512
  dwPlatformId: 'u32',
421
513
  szCSDVersion: 'u8[128]',
422
514
  })
515
+
516
+ // ── 进程快照 / 内存统计(toolhelp + psapi,布局来源官方 tlhelp32.h / psapi.h)────────
517
+
518
+ /** PROCESSENTRY32W(Process32First/Next 就地迭代位;x86 556B / x64 564B——ULONG_PTR
519
+ * th32DefaultHeapID 随位宽,struct 按 os.arch 推):调用前须把 offset 0 的 dwSize 预写
520
+ * 成 size(MSDN:不初始化 dwSize 则 Process32First 失败)——alloc() 后
521
+ * new Uint32Array(buf)[0] = PROCESSENTRY32W.size 一次;First/Next 迭代间复用同一 buf
522
+ * (API 只改内容不改 dwSize),每轮 N.decode(buf) 读回 */
523
+ export const PROCESSENTRY32W = /* @__PURE__ */ struct('PROCESSENTRY32W', {
524
+ dwSize: 'u32',
525
+ cntUsage: 'u32',
526
+ th32ProcessID: 'u32',
527
+ th32DefaultHeapID: '<>ptr',
528
+ th32ModuleID: 'u32',
529
+ cntThreads: 'u32',
530
+ th32ParentProcessID: 'u32',
531
+ pcPriClassBase: 'i32',
532
+ dwFlags: 'u32',
533
+ szExeFile: 'u16[260]@utf-16le',
534
+ })
535
+
536
+ /** MODULEENTRY32W(Module32First/Next 就地迭代位;x86 1072B / x64 1088B——BYTE* +
537
+ * HMODULE 随位宽)。dwSize 预写同 PROCESSENTRY32W;modBaseAddr/hModule 仅在
538
+ * th32ProcessID 的进程上下文有效;szModule 定长 256 = MAX_MODULE_NAME32+1 */
539
+ export const MODULEENTRY32W = /* @__PURE__ */ struct('MODULEENTRY32W', {
540
+ dwSize: 'u32',
541
+ th32ModuleID: 'u32',
542
+ th32ProcessID: 'u32',
543
+ GlblcntUsage: 'u32',
544
+ ProccntUsage: 'u32',
545
+ modBaseAddr: '<>ptr',
546
+ modBaseSize: 'u32',
547
+ hModule: '<HMODULE>ptr',
548
+ szModule: 'u16[256]@utf-16le',
549
+ szExePath: 'u16[260]@utf-16le',
550
+ })
551
+
552
+ /** PROCESS_MEMORY_COUNTERS(GetProcessMemoryInfo 出参位;x86 40B / x64 72B):官方 psapi.h
553
+ * 为 cb + PageFaultCount 后接 8×SIZE_T——SIZE_T 随位宽(非全 DWORD),struct 按 os.arch 推。
554
+ * 调用前 offset 0 的 cb 预写成 size(new Uint32Array(buf)[0] = N.size),实参 u32 cb 同传 size */
555
+ export const PROCESS_MEMORY_COUNTERS = /* @__PURE__ */ struct('PROCESS_MEMORY_COUNTERS', {
556
+ cb: 'u32',
557
+ PageFaultCount: 'u32',
558
+ PeakWorkingSetSize: '<>ptr',
559
+ WorkingSetSize: '<>ptr',
560
+ QuotaPeakPagedPoolUsage: '<>ptr',
561
+ QuotaPagedPoolUsage: '<>ptr',
562
+ QuotaPeakNonPagedPoolUsage: '<>ptr',
563
+ QuotaNonPagedPoolUsage: '<>ptr',
564
+ PagefileUsage: '<>ptr',
565
+ PeakPagefileUsage: '<>ptr',
566
+ })