quickwin 2.0.0 → 2.1.1

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 (103) hide show
  1. package/README.en.md +21 -26
  2. package/README.md +3 -6
  3. package/examples/exec_server.js +139 -31
  4. package/examples/exec_server.tsx +7 -8
  5. package/examples/exec_server_worker.js +1 -1
  6. package/examples/exec_server_worker.ts +2 -2
  7. package/examples/pdf_preview2.js +1 -1
  8. package/examples/pdf_preview2.ts +1 -1
  9. package/examples/pdf_viewer.js +132 -28
  10. package/examples/pdf_viewer.tsx +1 -1
  11. package/examples/test_gallery.js +131 -27
  12. package/examples/test_react_lazy.js +131 -27
  13. package/examples/test_react_listbox.js +131 -27
  14. package/examples/test_root_window.js +131 -27
  15. package/examples/test_tab.js +131 -27
  16. package/lib/certs.js +13 -8
  17. package/lib/certs.ts +13 -8
  18. package/lib/fetch.js +51 -3
  19. package/lib/fetch.ts +38 -3
  20. package/lib/ffi/bind.js +94 -5
  21. package/lib/ffi/bind.ts +107 -10
  22. package/lib/ffi/ctype.js +33 -7
  23. package/lib/ffi/ctype.ts +48 -10
  24. package/lib/ffi/struct.js +92 -14
  25. package/lib/ffi/struct.ts +108 -19
  26. package/lib/react-qw/components/ListView.js +1 -0
  27. package/lib/react-qw/components/PathPicker.js +2 -2
  28. package/lib/react-qw/index.js +1 -1
  29. package/lib/react-qw/index.ts +4 -1
  30. package/lib/text-measure.js +3 -1
  31. package/lib/text-measure.ts +4 -3
  32. package/lib/websocket.js +32 -2
  33. package/lib/websocket.ts +25 -2
  34. package/lib/windows/advapi32.js +53 -0
  35. package/lib/windows/advapi32.ts +64 -0
  36. package/lib/windows/comctl32.js +15 -15
  37. package/lib/windows/comctl32.ts +15 -16
  38. package/lib/windows/comdlg32.js +3 -2
  39. package/lib/windows/comdlg32.ts +3 -2
  40. package/lib/windows/gdi32.js +328 -26
  41. package/lib/windows/gdi32.ts +349 -26
  42. package/lib/windows/kernel32.js +206 -10
  43. package/lib/windows/kernel32.ts +225 -10
  44. package/lib/windows/msimg32.js +38 -0
  45. package/lib/windows/msimg32.ts +45 -0
  46. package/lib/windows/ntdll.js +3 -2
  47. package/lib/windows/ntdll.ts +3 -2
  48. package/lib/windows/ole32.js +1 -1
  49. package/lib/windows/ole32.ts +1 -1
  50. package/lib/windows/psapi.js +32 -0
  51. package/lib/windows/psapi.ts +37 -0
  52. package/lib/windows/shell32.js +5 -3
  53. package/lib/windows/shell32.ts +5 -3
  54. package/lib/windows/structs.js +135 -0
  55. package/lib/windows/structs.ts +144 -0
  56. package/lib/windows/user32.js +202 -99
  57. package/lib/windows/user32.ts +204 -99
  58. package/lib/windows/version.js +29 -0
  59. package/lib/windows/version.ts +35 -0
  60. package/lib/windows/winspool.js +71 -0
  61. package/lib/windows/winspool.ts +80 -0
  62. package/package.json +1 -1
  63. package/quickwin.d.ts +11 -5
  64. package/quickwin_const.d.ts +136 -0
  65. package/qwin-nowasm-x86.exe +0 -0
  66. package/qwin-nowasm.exe +0 -0
  67. package/qwin-x86.exe +0 -0
  68. package/qwin.exe +0 -0
  69. package/test/run.js +7 -0
  70. package/test/run.ts +7 -0
  71. package/test/test_basic_fetch.js +21 -0
  72. package/test/test_basic_fetch.ts +17 -0
  73. package/test/test_ffi.js +6 -6
  74. package/test/test_ffi.ts +6 -6
  75. package/test/test_ffi_abi.js +55 -0
  76. package/test/test_ffi_abi.ts +56 -0
  77. package/test/test_ffi_array.js +116 -0
  78. package/test/test_ffi_array.ts +141 -0
  79. package/test/test_ffi_bind.js +82 -0
  80. package/test/test_ffi_bind.ts +71 -0
  81. package/test/test_files.js +102 -0
  82. package/test/test_files.ts +121 -0
  83. package/test/test_gdi_draw.js +681 -0
  84. package/test/test_gdi_draw.ts +725 -0
  85. package/test/test_net_fetch.js +4 -3
  86. package/test/test_net_fetch.ts +4 -3
  87. package/test/test_printer.js +137 -0
  88. package/test/test_printer.ts +148 -0
  89. package/test/test_proc.js +141 -0
  90. package/test/test_proc.ts +163 -0
  91. package/test/test_react_complex.js +131 -27
  92. package/test/test_react_counter.js +131 -27
  93. package/test/test_react_flex.js +131 -27
  94. package/test/test_react_hidden.js +131 -27
  95. package/test/test_react_listview_link.js +131 -27
  96. package/test/test_react_notify.js +131 -27
  97. package/test/test_react_render.js +131 -27
  98. package/test/test_registry.js +74 -0
  99. package/test/test_registry.ts +95 -0
  100. package/test/test_sysinfo.js +122 -0
  101. package/test/test_sysinfo.ts +141 -0
  102. package/test/test_wolfssl_read.js +45 -44
  103. package/test/test_wolfssl_read.ts +42 -42
@@ -1,6 +1,8 @@
1
1
  // kernel32.dll 绑定(进程 / 管道 / 系统信息子集;品牌约定见 lib/windows/user32.ts 头注释):
2
2
  // - 内核对象句柄按用途分品牌:管道/文件 <HFILE>ptr、进程 <HPROCESS>ptr、线程
3
- // <HTHREAD>ptr(CreatePipe 的 HANDLE* 出参槽是缓冲地址非句柄值,仍 <>ptr);
3
+ // <HTHREAD>ptr、toolhelp 快照 <HSNAPSHOT>ptr(CloseHandle 收宽位直通,与 Process32/
4
+ // Module32 专用消费位自产自收,对齐 <HFIND>ptr/FindClose 先例;CreatePipe 的 HANDLE*
5
+ // 出参槽是缓冲地址非句柄值,仍 <>ptr);
4
6
  // CloseHandle/WaitForSingleObject 全家族位保持 <>ptr 收宽(品牌 number 子类型可
5
7
  // 直传),异种对象深层互传由运行时句柄有效性判定兜底
6
8
  // - 结构位按方向分流(结构定义见 ./structs.ts,布局随进程位宽,struct 按 os.arch 推):
@@ -15,18 +17,21 @@ import { STARTUPINFOW } from './structs.js';
15
17
  // dll 名部分应用(工厂转调保泛型 infer,见 lib/windows/user32.ts 头注释)
16
18
  const b = (name, sig, encoders) => bind('kernel32.dll', name, sig, encoders);
17
19
  // ============ 管道 / 进程 ============
18
- /** 建匿名管道;成功 → 非 0
20
+ /** 建匿名管道
21
+ * @returns 成功 → 非 0
19
22
  * @param args_0 hReadPipe 出参槽(读端句柄写回,<>ptr 缓冲地址)
20
23
  * @param args_1 hWritePipe 出参槽(写端句柄写回,<>ptr 缓冲地址)
21
24
  * @param args_2 lpPipeAttributes 安全属性,传 NULL
22
25
  * @param args_3 nSize 管道缓冲字节数,0 = 系统默认 */
23
26
  export const CreatePipe = /*@__PURE__*/ b('CreatePipe', '<>ptr <>ptr <>ptr u32 -> i32');
24
- /** 设句柄标志;成功 → 非 0
27
+ /** 设句柄标志
28
+ * @returns 成功 → 非 0
25
29
  * @param args_0 hHandle 文件/管道句柄
26
30
  * @param args_1 dwMask 要改的标志位掩码(HANDLE_FLAG_*)
27
31
  * @param args_2 dwFlags 标志新值(继承 = 1,不继承 = 0) */
28
32
  export const SetHandleInformation = /*@__PURE__*/ b('SetHandleInformation', '<HFILE>ptr! u32 u32 -> i32');
29
- /** 建进程;成功 → 非 0
33
+ /** 建进程
34
+ * @returns 成功 → 非 0
30
35
  * @param args_0 lpApplicationName 可执行文件路径 string 或 NULL
31
36
  * @param args_1 lpCommandLine 命令行 string(含参数)或 NULL
32
37
  * @param args_2 lpProcessAttributes 进程安全属性,传 NULL
@@ -38,29 +43,220 @@ export const SetHandleInformation = /*@__PURE__*/ b('SetHandleInformation', '<HF
38
43
  * @param args_8 lpStartupInfo STARTUPINFOW 对象(cb 必填)
39
44
  * @param args_9 lpProcessInformation 出参槽,传 PROCESS_INFORMATION.alloc().ptr */
40
45
  export const CreateProcess = /*@__PURE__*/ b('CreateProcessW', '<WCHAR>ptr <WCHAR>ptr <>ptr <>ptr i32 u32 <>ptr <WCHAR>ptr <STARTUPINFOW>ptr <PROCESS_INFORMATION>ptr -> i32', { STARTUPINFOW });
41
- /** 等内核对象就绪;返回 WAIT_* 码
46
+ /** 等内核对象就绪
47
+ * @returns WAIT_* 码
42
48
  * @param args_0 hHandle 内核对象句柄
43
49
  * @param args_1 dwMilliseconds 超时毫秒,0xffffffff = 无限等 */
44
50
  export const WaitForSingleObject = /*@__PURE__*/ b('WaitForSingleObject', '<>ptr u32 -> u32');
45
- /** 取进程退出码(带符号读);成功 → 非 0
51
+ /** 取进程退出码(带符号读)
52
+ * @returns 成功 → 非 0
46
53
  * @param args_0 hProcess 进程句柄
47
54
  * @param args_1 lpExitCode 出参槽,传 Int32Array(1).buffer 读回退出码 */
48
55
  export const GetExitCodeProcess = /*@__PURE__*/ b('GetExitCodeProcess', '<HPROCESS>ptr! <BYTE>ptr -> i32');
49
- /** 关闭内核对象句柄;成功 → 非 0
56
+ /** 关闭内核对象句柄
57
+ * @returns 成功 → 非 0
50
58
  * @param args_0 hObject 任意内核对象 */
51
59
  export const CloseHandle = /*@__PURE__*/ b('CloseHandle', '<>ptr -> i32');
60
+ // ============ 进程快照(toolhelp)============
61
+ /** 建系统快照;用完 CloseHandle(收宽位直通)
62
+ * @returns 成功 → 快照句柄,失败 → -1(INVALID_HANDLE_VALUE——truthy,判 < 0 非判 0,
63
+ * 同 CreateFile)
64
+ * @param args_0 dwFlags 快照范围掩码:TH32CS_SNAPPROCESS(0x2) 全系统进程、
65
+ * TH32CS_SNAPMODULE(0x8) 指定进程的模块(跨位宽目标另加 SNAPMODULE32(0x10);
66
+ * 可组合不标枚举)
67
+ * @param args_1 th32ProcessID 目标进程 PID(SNAPPROCESS 传 0 = 忽略) */
68
+ export const CreateToolhelp32Snapshot = /*@__PURE__*/ b('CreateToolhelp32Snapshot', 'u32 u32 -> <HSNAPSHOT>ptr!');
69
+ /** 取快照第一个进程
70
+ * @returns 成功 → 非 0,0 = 迭代尽/失败(ERROR_NO_MORE_FILES=18 等,见 GetLastError)
71
+ * @param args_0 hSnapshot 快照句柄(CreateToolhelp32Snapshot 产物,0 拦截)
72
+ * @param args_1 lppe 迭代缓冲:alloc() 后预写 offset0 dwSize = size(见结构 JSDoc),
73
+ * 每轮 PROCESSENTRY32W.decode(buf) 读回,Next 复用同一 buf */
74
+ export const Process32First = /*@__PURE__*/ b('Process32FirstW', '<HSNAPSHOT>ptr! <PROCESSENTRY32W>ptr! -> i32');
75
+ /** 取快照下一进程(First 后循环调用);参数同 First
76
+ * @returns 成功 → 非 0,0 = 迭代完毕 */
77
+ export const Process32Next = /*@__PURE__*/ b('Process32NextW', '<HSNAPSHOT>ptr! <PROCESSENTRY32W>ptr! -> i32');
78
+ /** 取指定进程的第一个模块(可执行 + 已加载 DLL)
79
+ * @returns 成功 → 非 0,0 = 迭代尽/失败
80
+ * @param args_0 hSnapshot 快照句柄(TH32CS_SNAPMODULE 建)
81
+ * @param args_1 lpme 迭代缓冲:alloc() 后预写 offset0 dwSize = size,MODULEENTRY32W.decode 读回 */
82
+ export const Module32First = /*@__PURE__*/ b('Module32FirstW', '<HSNAPSHOT>ptr! <MODULEENTRY32W>ptr! -> i32');
83
+ /** 取下一模块;参数同 First
84
+ * @returns 成功 → 非 0,0 = 迭代完毕 */
85
+ export const Module32Next = /*@__PURE__*/ b('Module32NextW', '<HSNAPSHOT>ptr! <MODULEENTRY32W>ptr! -> i32');
86
+ // ============ 进程控制 ============
87
+ /** 按 PID 开进程;配对 CloseHandle
88
+ * @returns 成功 → 句柄,失败 → NULL(0 保真)
89
+ * @param args_0 dwDesiredAccess 访问掩码组合:PROCESS_QUERY_INFORMATION(0x400) /
90
+ * PROCESS_VM_READ(0x10) 读内存与模块路径、PROCESS_TERMINATE(0x1) 杀进程
91
+ * (可组合不标枚举)
92
+ * @param args_1 bInheritHandle 句柄继承,传 0
93
+ * @param args_2 dwProcessId 目标 PID(不存在 → NULL) */
94
+ export const OpenProcess = /*@__PURE__*/ b('OpenProcess', 'u32 i32 u32 -> <HPROCESS>ptr');
95
+ /** 结束进程
96
+ * @returns 成功 → 非 0(自身/无 PROCESS_TERMINATE 权限失败)
97
+ * @param args_0 hProcess 进程句柄(须 PROCESS_TERMINATE 权限)
98
+ * @param args_1 uExitCode 退出码(GetExitCodeProcess 读回;STILL_ACTIVE=259 是系统保留值,
99
+ * 杀进程时避开) */
100
+ export const TerminateProcess = /*@__PURE__*/ b('TerminateProcess', '<HPROCESS>ptr! u32 -> i32');
101
+ /** 取当前进程 PID(互证锚点)
102
+ * @returns 当前进程 PID */
103
+ export const GetCurrentProcessId = /*@__PURE__*/ b('GetCurrentProcessId', ' -> u32');
52
104
  // ============ 文件 I/O ============
53
- /** 同步读文件 / 管道;成功 → 非 0,管道写端全部关闭后读返回 0(EOF)
105
+ /** 同步读文件 / 管道
106
+ * @returns 成功 → 非 0,管道写端全部关闭后读返回 0(EOF)
54
107
  * @param args_0 hFile 文件/管道句柄
55
108
  * @param args_1 lpBuffer 接收缓冲(<BYTE>ptr,PtrArrayBuffer 原地读回)
56
109
  * @param args_2 nNumberOfBytesToRead 请求读取的字节数
57
110
  * @param args_3 lpNumberOfBytesRead 出参槽,传 Uint32Array(1).buffer 读实际字节数
58
111
  * @param args_4 lpOverlapped 重叠结构,传 NULL(同步读) */
59
112
  export const ReadFile = /*@__PURE__*/ b('ReadFile', '<HFILE>ptr! <BYTE>ptr u32 <BYTE>ptr <>ptr -> i32');
113
+ /** 创建/打开文件
114
+ * @returns 成功 → 句柄,失败 → INVALID_HANDLE_VALUE(-1——truthy,须 === -1 判失败,
115
+ * 0 由返回位 ! 运行时检查兜底)
116
+ * @param args_0 lpFileName 路径 string(禁空)
117
+ * @param args_1 dwDesiredAccess 访问掩码:GENERIC_READ(0x80000000)|GENERIC_WRITE(0x40000000)
118
+ * 组合(flags 位不标枚举)
119
+ * @param args_2 dwShareMode 共享掩码:FILE_SHARE_READ(0x1)|FILE_SHARE_WRITE(0x2),独占传 0
120
+ * @param args_3 lpSecurityAttributes 安全属性,传 NULL
121
+ * @param args_4 dwCreationDisposition 创建处置 gui.FileCreation.*(互斥单选)
122
+ * @param args_5 dwFlagsAndAttributes 属性:FILE_ATTRIBUTE_NORMAL(0x80) 等(可组合不标)
123
+ * @param args_6 hTemplateFile 模板文件句柄,传 NULL */
124
+ export const CreateFile = /*@__PURE__*/ b('CreateFileW', '<WCHAR>ptr! u32 u32 <>ptr u32@FileCreation u32 <>ptr -> <HFILE>ptr!');
125
+ /** 同步写文件 / 管道
126
+ * @returns 成功 → 非 0(失败原因见 GetLastError)
127
+ * @param args_0 hFile 文件/管道句柄
128
+ * @param args_1 lpBuffer 数据缓冲(<BYTE>ptr,PtrArrayBuffer)
129
+ * @param args_2 nNumberOfBytesToWrite 写入字节数
130
+ * @param args_3 lpNumberOfBytesWritten 出参槽,传 PtrArrayBuffer(4) 读实际写入字节数
131
+ * @param args_4 lpOverlapped 重叠结构,传 NULL(同步写) */
132
+ export const WriteFile = /*@__PURE__*/ b('WriteFile', '<HFILE>ptr! <BYTE>ptr u32 <BYTE>ptr <>ptr -> i32');
133
+ /** 删除文件
134
+ * @returns 成功 → 非 0 */
135
+ export const DeleteFile = /*@__PURE__*/ b('DeleteFileW', '<WCHAR>ptr! -> i32');
136
+ /** 读文件属性掩码
137
+ * @returns 属性掩码(FILE_ATTRIBUTE_DIRECTORY=0x10 / NORMAL=0x80 / READONLY=0x1 等,
138
+ * 可组合不标枚举);失败 → 0xFFFFFFFF(INVALID_FILE_ATTRIBUTES) */
139
+ export const GetFileAttributes = /*@__PURE__*/ b('GetFileAttributesW', '<WCHAR>ptr! -> u32');
140
+ /** 建目录(不含中间层级——多级须逐级建)
141
+ * @returns 成功 → 非 0 */
142
+ export const CreateDirectory = /*@__PURE__*/ b('CreateDirectoryW', '<WCHAR>ptr! <>ptr -> i32');
143
+ /** 删空目录
144
+ * @returns 成功 → 非 0 */
145
+ export const RemoveDirectory = /*@__PURE__*/ b('RemoveDirectoryW', '<WCHAR>ptr! -> i32');
146
+ /** 复制文件
147
+ * @returns 成功 → 非 0
148
+ * @param args_2 bFailIfExists 非 0:目标已存在则失败 */
149
+ export const CopyFile = /*@__PURE__*/ b('CopyFileW', '<WCHAR>ptr! <WCHAR>ptr! i32 -> i32');
150
+ /** 移动/改名(可跨卷)
151
+ * @returns 成功 → 非 0
152
+ * @param args_2 dwFlags 标志组合:MOVEFILE_REPLACE_EXISTING(0x1) 覆盖目标、
153
+ * MOVEFILE_COPY_ALLOWED(0x2) 跨卷时允许复制删除(flags 位不标枚举) */
154
+ export const MoveFileEx = /*@__PURE__*/ b('MoveFileExW', '<WCHAR>ptr! <WCHAR>ptr! u32 -> i32');
155
+ /** 移动文件指针
156
+ * @returns 新偏移(32 位),0xFFFFFFFF = 失败(须 GetLastError 区分
157
+ * 与合法的 0xFFFFFFFF 偏移)
158
+ * @param args_1 lDistanceToMove 偏移(LONG,可负)
159
+ * @param args_2 lpDistanceToMoveHigh 64 位偏移高半(出参双向),32 位够用传 NULL
160
+ * @param args_3 dwMoveMethod 起点 gui.FileSeekFrom.BEGIN / CURRENT / END */
161
+ export const SetFilePointer = /*@__PURE__*/ b('SetFilePointer', '<HFILE>ptr! i32 <BYTE>ptr u32@FileSeekFrom -> u32');
162
+ /** 读文件大小
163
+ * @returns 文件大小(低 32 位);0xFFFFFFFF = 失败(INVALID_FILE_SIZE,须 GetLastError 区分)
164
+ * @param args_1 lpFileSizeHigh 高 32 位出参槽(>4GB 文件),不需要传 NULL */
165
+ export const GetFileSize = /*@__PURE__*/ b('GetFileSize', '<HFILE>ptr! <BYTE>ptr -> u32');
166
+ /** 按通配模式枚举首个匹配('dir\\*.txt');配对 FindClose
167
+ * @returns 成功 → 查找句柄,失败 → INVALID_HANDLE_VALUE(-1)
168
+ * @param args_0 lpFileName 路径/通配模式 string(禁空)
169
+ * @param args_1 lpFindFileData 出参槽,传 WIN32_FIND_DATAW.alloc().ptr、decode 读回 */
170
+ export const FindFirstFile = /*@__PURE__*/ b('FindFirstFileW', '<WCHAR>ptr! <WIN32_FIND_DATAW>ptr! -> <HFIND>ptr!');
171
+ /** 枚举下一匹配
172
+ * @returns 成功 → 非 0,0 = ERROR_NO_MORE_FILES(枚举完毕) */
173
+ export const FindNextFile = /*@__PURE__*/ b('FindNextFileW', '<HFIND>ptr! <WIN32_FIND_DATAW>ptr! -> i32');
174
+ /** 关闭查找句柄(Find 族专用,不用 CloseHandle)
175
+ * @returns 成功 → 非 0 */
176
+ export const FindClose = /*@__PURE__*/ b('FindClose', '<HFIND>ptr! -> i32');
177
+ /** 取临时目录路径(尾带反斜杠)
178
+ * @returns 写入字符数(不含 NUL,0 失败)
179
+ * @param args_0 nBufferLength 缓冲容量(WCHAR 个数,含 NUL 余量)
180
+ * @param args_1 lpBuffer 接收缓冲,传 WCHAR.alloc(n)、WCHAR.decode 读回 */
181
+ export const GetTempPath = /*@__PURE__*/ b('GetTempPathW', 'u32 <BYTE>ptr -> u32');
60
182
  // ============ 系统 / 错误 ============
61
- /** 取调用线程最近一次 Win32 错误码 */
183
+ /** 取调用线程最近一次 Win32 错误码
184
+ * @returns 最近一次失败的线程局部错误码 */
62
185
  export const GetLastError = /*@__PURE__*/ b('GetLastError', ' -> u32');
63
- /** 取 System32 目录路径(宽字符);返回写入的字符数(不含 NUL,0 失败)
186
+ /** 取 System32 目录路径(宽字符)
187
+ * @returns 写入的字符数(不含 NUL,0 失败)
64
188
  * @param args_0 lpBuffer 接收缓冲,传 WCHAR.alloc(n)
65
189
  * @param args_1 uSize 缓冲容量(WCHAR 个数,含 NUL 余量) */
66
190
  export const GetSystemDirectory = /*@__PURE__*/ b('GetSystemDirectoryW', '<BYTE>ptr u32 -> u32');
191
+ /** 错误码 → 可读文字(GetLastError 的搭档)
192
+ * @returns 写入字符数(0 失败)
193
+ * @param args_0 dwFlags 组合标志:FROM_SYSTEM(0x1000) 系统错误表 | IGNORE_INSERTS(0x200)
194
+ * 吞掉 %1 插值符(裸 u32 组合传 0x1200,可组合 flags 不标枚举)
195
+ * @param args_1 lpSource 消息表源(FROM_SYSTEM 时传 NULL)
196
+ * @param args_2 dwMessageId 错误码(如 GetLastError() 的返回)
197
+ * @param args_3 dwLanguageId 语言 0 = 中性(按系统 UI)
198
+ * @param args_4 lpBuffer 接收缓冲,传 WCHAR.alloc(n)
199
+ * @param args_5 nSize 缓冲容量(WCHAR 个数)
200
+ * @param args_6 Arguments 插值参数表,IGNORE_INSERTS 时传 NULL */
201
+ export const FormatMessage = /*@__PURE__*/ b('FormatMessageW', 'u32 <>ptr u32 u32 <BYTE>ptr u32 <>ptr -> u32');
202
+ // ============ 计时 / 系统信息 ============
203
+ /** 高精度计数器读数(LARGE_INTEGER,8 字节)
204
+ * @returns 成功 → 非 0
205
+ * @param args_0 lpPerformanceCount 出参缓冲,PtrArrayBuffer(8) + DataView getBigInt64 读回 */
206
+ export const QueryPerformanceCounter = /*@__PURE__*/ b('QueryPerformanceCounter', '<BYTE>ptr -> i32');
207
+ /** 高精度计数器频率(每秒计数,LARGE_INTEGER 8 字节)
208
+ * @returns 成功 → 非 0
209
+ * @param args_0 lpFrequency 出参缓冲,PtrArrayBuffer(8) + DataView getBigInt64 读回 */
210
+ export const QueryPerformanceFrequency = /*@__PURE__*/ b('QueryPerformanceFrequency', '<BYTE>ptr -> i32');
211
+ /** 挂起当前线程毫秒数(0 = 让出剩余时间片);无返回值 */
212
+ export const Sleep = /*@__PURE__*/ b('Sleep', 'u32 -> void');
213
+ /** 当前系统时间(UTC FILETIME,8 字节 = 1601 起的 100ns 单元);无返回值
214
+ * @param args_0 lpSystemTimeAsFileTime 出参缓冲,PtrArrayBuffer(8) + DataView getBigUint64 读回 */
215
+ export const GetSystemTimeAsFileTime = /*@__PURE__*/ b('GetSystemTimeAsFileTime', '<BYTE>ptr -> void');
216
+ /** 本地时间(SYSTEMTIME 出参位不注册 encoder:SYSTEMTIME.alloc().ptr 进、decode 读回);
217
+ * 无返回值
218
+ * @param args_0 lpSystemTime 出参结构缓冲 */
219
+ export const GetLocalTime = /*@__PURE__*/ b('GetLocalTime', '<SYSTEMTIME>ptr -> void');
220
+ /** 取环境变量值
221
+ * @returns 读取字符数(不含 NUL,0 = 不存在或缓冲不足)
222
+ * @param args_0 lpName 变量名(禁空,如 'PATH')
223
+ * @param args_1 lpBuffer 接收缓冲,传 WCHAR.alloc(n)
224
+ * @param args_2 nSize 缓冲容量(WCHAR 个数,含 NUL 余量) */
225
+ export const GetEnvironmentVariable = /*@__PURE__*/ b('GetEnvironmentVariableW', '<WCHAR>ptr! <BYTE>ptr u32 -> u32');
226
+ /** 计算机名(*lpnSize 入 = 缓冲 WCHAR 容量,出 = 实际长度不含 NUL)
227
+ * @returns 成功 → 非 0
228
+ * @param args_0 lpBuffer 接收缓冲,传 WCHAR.alloc(n)
229
+ * @param args_1 lpnSize 长度槽(PtrArrayBuffer(4),Uint32Array 写入容量) */
230
+ export const GetComputerName = /*@__PURE__*/ b('GetComputerNameW', '<BYTE>ptr <BYTE>ptr -> i32');
231
+ /** 模块文件路径(全路径含扩展名)
232
+ * @returns 写入字符数(不含 NUL,0 失败/缓冲不足)
233
+ * @param args_0 hModule 模块句柄(<HMODULE>ptr 与 win 模块同型),NULL = 当前进程 exe
234
+ * @param args_1 lpFilename 接收缓冲,传 WCHAR.alloc(n)
235
+ * @param args_2 nSize 缓冲容量(WCHAR 个数) */
236
+ export const GetModuleFileName = /*@__PURE__*/ b('GetModuleFileNameW', '<HMODULE>ptr <BYTE>ptr u32 -> u32');
237
+ /** 进程命令行(含程序名;进程启动即有值,永不返回 NULL)
238
+ * @returns 命令行整串(返回位 `<WCHAR>ptr!`:内建 WCHAR codec 自动解码为 string,
239
+ * `!` 担保非 NULL 由返回位 0 检查兜底,无需接收缓冲) */
240
+ export const GetCommandLineW = /*@__PURE__*/ b('GetCommandLineW', ' -> <WCHAR>ptr!');
241
+ // ============ 全局内存(剪贴板数据载体)============
242
+ /** 分配全局内存块
243
+ * @returns 成功 → 句柄(0 失败)
244
+ * @param args_0 uFlags GMEM_MOVEABLE(0x2) 可移动(剪贴板要求)等 GMEM_* 组合
245
+ * @param args_1 dwBytes 字节数(SIZE_T 随位宽 = <>ptr 的 ptr 宽,非指针语义) */
246
+ export const GlobalAlloc = /*@__PURE__*/ b('GlobalAlloc', 'u32 <>ptr -> <HGLOBAL>ptr');
247
+ /** 句柄 → 内存地址(配 GlobalAlloc 使用,与 SetClipboardData 的自产自收配对)
248
+ * @returns 内存地址(0 失败/已锁定)——地址非句柄,返回位保持裸 <>ptr */
249
+ export const GlobalLock = /*@__PURE__*/ b('GlobalLock', '<HGLOBAL>ptr -> <>ptr');
250
+ /** 解锁(GlobalLock 每次获取须配对一次)
251
+ * @returns 锁定计数归 0 → 非 0 */
252
+ export const GlobalUnlock = /*@__PURE__*/ b('GlobalUnlock', '<HGLOBAL>ptr -> i32');
253
+ /** 释放全局内存(SetClipboardData 成功后所有权转系统,勿再释放)
254
+ * @returns 成功 → NULL */
255
+ export const GlobalFree = /*@__PURE__*/ b('GlobalFree', '<HGLOBAL>ptr -> <>ptr');
256
+ /** 拷贝内存块(dst = 目标进程地址,src = 数据缓冲);无返回值。ffi 只有 readByte,
257
+ * 写远程内存的唯一通道(GlobalLock 后灌数据、自定义窗口类 WNDCLASSEX 的 lpszClassName
258
+ * 等场景同用)
259
+ * @param args_0 dst 目标地址(GlobalLock 返回值等裸地址)
260
+ * @param args_1 src 源数据缓冲(<BYTE>ptr 收 PAB 本体)
261
+ * @param args_2 n 字节数(src.byteLength) */
262
+ export const RtlMoveMemory = /*@__PURE__*/ b('RtlMoveMemory', '<>ptr <BYTE>ptr u32 -> void');
@@ -1,6 +1,8 @@
1
1
  // kernel32.dll 绑定(进程 / 管道 / 系统信息子集;品牌约定见 lib/windows/user32.ts 头注释):
2
2
  // - 内核对象句柄按用途分品牌:管道/文件 <HFILE>ptr、进程 <HPROCESS>ptr、线程
3
- // <HTHREAD>ptr(CreatePipe 的 HANDLE* 出参槽是缓冲地址非句柄值,仍 <>ptr);
3
+ // <HTHREAD>ptr、toolhelp 快照 <HSNAPSHOT>ptr(CloseHandle 收宽位直通,与 Process32/
4
+ // Module32 专用消费位自产自收,对齐 <HFIND>ptr/FindClose 先例;CreatePipe 的 HANDLE*
5
+ // 出参槽是缓冲地址非句柄值,仍 <>ptr);
4
6
  // CloseHandle/WaitForSingleObject 全家族位保持 <>ptr 收宽(品牌 number 子类型可
5
7
  // 直传),异种对象深层互传由运行时句柄有效性判定兜底
6
8
  // - 结构位按方向分流(结构定义见 ./structs.ts,布局随进程位宽,struct 按 os.arch 推):
@@ -19,18 +21,21 @@ const b = <const S extends string, const LE extends CodecMap = {}>(name: string,
19
21
 
20
22
  // ============ 管道 / 进程 ============
21
23
 
22
- /** 建匿名管道;成功 → 非 0
24
+ /** 建匿名管道
25
+ * @returns 成功 → 非 0
23
26
  * @param args_0 hReadPipe 出参槽(读端句柄写回,<>ptr 缓冲地址)
24
27
  * @param args_1 hWritePipe 出参槽(写端句柄写回,<>ptr 缓冲地址)
25
28
  * @param args_2 lpPipeAttributes 安全属性,传 NULL
26
29
  * @param args_3 nSize 管道缓冲字节数,0 = 系统默认 */
27
30
  export const CreatePipe = /*@__PURE__*/ b('CreatePipe', '<>ptr <>ptr <>ptr u32 -> i32')
28
- /** 设句柄标志;成功 → 非 0
31
+ /** 设句柄标志
32
+ * @returns 成功 → 非 0
29
33
  * @param args_0 hHandle 文件/管道句柄
30
34
  * @param args_1 dwMask 要改的标志位掩码(HANDLE_FLAG_*)
31
35
  * @param args_2 dwFlags 标志新值(继承 = 1,不继承 = 0) */
32
36
  export const SetHandleInformation = /*@__PURE__*/ b('SetHandleInformation', '<HFILE>ptr! u32 u32 -> i32')
33
- /** 建进程;成功 → 非 0
37
+ /** 建进程
38
+ * @returns 成功 → 非 0
34
39
  * @param args_0 lpApplicationName 可执行文件路径 string 或 NULL
35
40
  * @param args_1 lpCommandLine 命令行 string(含参数)或 NULL
36
41
  * @param args_2 lpProcessAttributes 进程安全属性,传 NULL
@@ -44,21 +49,79 @@ export const SetHandleInformation = /*@__PURE__*/ b('SetHandleInformation', '<HF
44
49
  export const CreateProcess = /*@__PURE__*/ b('CreateProcessW',
45
50
  '<WCHAR>ptr <WCHAR>ptr <>ptr <>ptr i32 u32 <>ptr <WCHAR>ptr <STARTUPINFOW>ptr <PROCESS_INFORMATION>ptr -> i32',
46
51
  { STARTUPINFOW })
47
- /** 等内核对象就绪;返回 WAIT_* 码
52
+ /** 等内核对象就绪
53
+ * @returns WAIT_* 码
48
54
  * @param args_0 hHandle 内核对象句柄
49
55
  * @param args_1 dwMilliseconds 超时毫秒,0xffffffff = 无限等 */
50
56
  export const WaitForSingleObject = /*@__PURE__*/ b('WaitForSingleObject', '<>ptr u32 -> u32')
51
- /** 取进程退出码(带符号读);成功 → 非 0
57
+ /** 取进程退出码(带符号读)
58
+ * @returns 成功 → 非 0
52
59
  * @param args_0 hProcess 进程句柄
53
60
  * @param args_1 lpExitCode 出参槽,传 Int32Array(1).buffer 读回退出码 */
54
61
  export const GetExitCodeProcess = /*@__PURE__*/ b('GetExitCodeProcess', '<HPROCESS>ptr! <BYTE>ptr -> i32')
55
- /** 关闭内核对象句柄;成功 → 非 0
62
+ /** 关闭内核对象句柄
63
+ * @returns 成功 → 非 0
56
64
  * @param args_0 hObject 任意内核对象 */
57
65
  export const CloseHandle = /*@__PURE__*/ b('CloseHandle', '<>ptr -> i32')
58
66
 
67
+ // ============ 进程快照(toolhelp)============
68
+
69
+ /** 建系统快照;用完 CloseHandle(收宽位直通)
70
+ * @returns 成功 → 快照句柄,失败 → -1(INVALID_HANDLE_VALUE——truthy,判 < 0 非判 0,
71
+ * 同 CreateFile)
72
+ * @param args_0 dwFlags 快照范围掩码:TH32CS_SNAPPROCESS(0x2) 全系统进程、
73
+ * TH32CS_SNAPMODULE(0x8) 指定进程的模块(跨位宽目标另加 SNAPMODULE32(0x10);
74
+ * 可组合不标枚举)
75
+ * @param args_1 th32ProcessID 目标进程 PID(SNAPPROCESS 传 0 = 忽略) */
76
+ export const CreateToolhelp32Snapshot = /*@__PURE__*/ b('CreateToolhelp32Snapshot',
77
+ 'u32 u32 -> <HSNAPSHOT>ptr!')
78
+
79
+ /** 取快照第一个进程
80
+ * @returns 成功 → 非 0,0 = 迭代尽/失败(ERROR_NO_MORE_FILES=18 等,见 GetLastError)
81
+ * @param args_0 hSnapshot 快照句柄(CreateToolhelp32Snapshot 产物,0 拦截)
82
+ * @param args_1 lppe 迭代缓冲:alloc() 后预写 offset0 dwSize = size(见结构 JSDoc),
83
+ * 每轮 PROCESSENTRY32W.decode(buf) 读回,Next 复用同一 buf */
84
+ export const Process32First = /*@__PURE__*/ b('Process32FirstW',
85
+ '<HSNAPSHOT>ptr! <PROCESSENTRY32W>ptr! -> i32')
86
+ /** 取快照下一进程(First 后循环调用);参数同 First
87
+ * @returns 成功 → 非 0,0 = 迭代完毕 */
88
+ export const Process32Next = /*@__PURE__*/ b('Process32NextW',
89
+ '<HSNAPSHOT>ptr! <PROCESSENTRY32W>ptr! -> i32')
90
+ /** 取指定进程的第一个模块(可执行 + 已加载 DLL)
91
+ * @returns 成功 → 非 0,0 = 迭代尽/失败
92
+ * @param args_0 hSnapshot 快照句柄(TH32CS_SNAPMODULE 建)
93
+ * @param args_1 lpme 迭代缓冲:alloc() 后预写 offset0 dwSize = size,MODULEENTRY32W.decode 读回 */
94
+ export const Module32First = /*@__PURE__*/ b('Module32FirstW',
95
+ '<HSNAPSHOT>ptr! <MODULEENTRY32W>ptr! -> i32')
96
+ /** 取下一模块;参数同 First
97
+ * @returns 成功 → 非 0,0 = 迭代完毕 */
98
+ export const Module32Next = /*@__PURE__*/ b('Module32NextW',
99
+ '<HSNAPSHOT>ptr! <MODULEENTRY32W>ptr! -> i32')
100
+
101
+ // ============ 进程控制 ============
102
+
103
+ /** 按 PID 开进程;配对 CloseHandle
104
+ * @returns 成功 → 句柄,失败 → NULL(0 保真)
105
+ * @param args_0 dwDesiredAccess 访问掩码组合:PROCESS_QUERY_INFORMATION(0x400) /
106
+ * PROCESS_VM_READ(0x10) 读内存与模块路径、PROCESS_TERMINATE(0x1) 杀进程
107
+ * (可组合不标枚举)
108
+ * @param args_1 bInheritHandle 句柄继承,传 0
109
+ * @param args_2 dwProcessId 目标 PID(不存在 → NULL) */
110
+ export const OpenProcess = /*@__PURE__*/ b('OpenProcess', 'u32 i32 u32 -> <HPROCESS>ptr')
111
+ /** 结束进程
112
+ * @returns 成功 → 非 0(自身/无 PROCESS_TERMINATE 权限失败)
113
+ * @param args_0 hProcess 进程句柄(须 PROCESS_TERMINATE 权限)
114
+ * @param args_1 uExitCode 退出码(GetExitCodeProcess 读回;STILL_ACTIVE=259 是系统保留值,
115
+ * 杀进程时避开) */
116
+ export const TerminateProcess = /*@__PURE__*/ b('TerminateProcess', '<HPROCESS>ptr! u32 -> i32')
117
+ /** 取当前进程 PID(互证锚点)
118
+ * @returns 当前进程 PID */
119
+ export const GetCurrentProcessId = /*@__PURE__*/ b('GetCurrentProcessId', ' -> u32')
120
+
59
121
  // ============ 文件 I/O ============
60
122
 
61
- /** 同步读文件 / 管道;成功 → 非 0,管道写端全部关闭后读返回 0(EOF)
123
+ /** 同步读文件 / 管道
124
+ * @returns 成功 → 非 0,管道写端全部关闭后读返回 0(EOF)
62
125
  * @param args_0 hFile 文件/管道句柄
63
126
  * @param args_1 lpBuffer 接收缓冲(<BYTE>ptr,PtrArrayBuffer 原地读回)
64
127
  * @param args_2 nNumberOfBytesToRead 请求读取的字节数
@@ -66,11 +129,163 @@ export const CloseHandle = /*@__PURE__*/ b('CloseHandle', '<>ptr -> i32')
66
129
  * @param args_4 lpOverlapped 重叠结构,传 NULL(同步读) */
67
130
  export const ReadFile = /*@__PURE__*/ b('ReadFile', '<HFILE>ptr! <BYTE>ptr u32 <BYTE>ptr <>ptr -> i32')
68
131
 
132
+ /** 创建/打开文件
133
+ * @returns 成功 → 句柄,失败 → INVALID_HANDLE_VALUE(-1——truthy,须 === -1 判失败,
134
+ * 0 由返回位 ! 运行时检查兜底)
135
+ * @param args_0 lpFileName 路径 string(禁空)
136
+ * @param args_1 dwDesiredAccess 访问掩码:GENERIC_READ(0x80000000)|GENERIC_WRITE(0x40000000)
137
+ * 组合(flags 位不标枚举)
138
+ * @param args_2 dwShareMode 共享掩码:FILE_SHARE_READ(0x1)|FILE_SHARE_WRITE(0x2),独占传 0
139
+ * @param args_3 lpSecurityAttributes 安全属性,传 NULL
140
+ * @param args_4 dwCreationDisposition 创建处置 gui.FileCreation.*(互斥单选)
141
+ * @param args_5 dwFlagsAndAttributes 属性:FILE_ATTRIBUTE_NORMAL(0x80) 等(可组合不标)
142
+ * @param args_6 hTemplateFile 模板文件句柄,传 NULL */
143
+ export const CreateFile = /*@__PURE__*/ b('CreateFileW',
144
+ '<WCHAR>ptr! u32 u32 <>ptr u32@FileCreation u32 <>ptr -> <HFILE>ptr!')
145
+ /** 同步写文件 / 管道
146
+ * @returns 成功 → 非 0(失败原因见 GetLastError)
147
+ * @param args_0 hFile 文件/管道句柄
148
+ * @param args_1 lpBuffer 数据缓冲(<BYTE>ptr,PtrArrayBuffer)
149
+ * @param args_2 nNumberOfBytesToWrite 写入字节数
150
+ * @param args_3 lpNumberOfBytesWritten 出参槽,传 PtrArrayBuffer(4) 读实际写入字节数
151
+ * @param args_4 lpOverlapped 重叠结构,传 NULL(同步写) */
152
+ export const WriteFile = /*@__PURE__*/ b('WriteFile', '<HFILE>ptr! <BYTE>ptr u32 <BYTE>ptr <>ptr -> i32')
153
+ /** 删除文件
154
+ * @returns 成功 → 非 0 */
155
+ export const DeleteFile = /*@__PURE__*/ b('DeleteFileW', '<WCHAR>ptr! -> i32')
156
+ /** 读文件属性掩码
157
+ * @returns 属性掩码(FILE_ATTRIBUTE_DIRECTORY=0x10 / NORMAL=0x80 / READONLY=0x1 等,
158
+ * 可组合不标枚举);失败 → 0xFFFFFFFF(INVALID_FILE_ATTRIBUTES) */
159
+ export const GetFileAttributes = /*@__PURE__*/ b('GetFileAttributesW', '<WCHAR>ptr! -> u32')
160
+ /** 建目录(不含中间层级——多级须逐级建)
161
+ * @returns 成功 → 非 0 */
162
+ export const CreateDirectory = /*@__PURE__*/ b('CreateDirectoryW', '<WCHAR>ptr! <>ptr -> i32')
163
+ /** 删空目录
164
+ * @returns 成功 → 非 0 */
165
+ export const RemoveDirectory = /*@__PURE__*/ b('RemoveDirectoryW', '<WCHAR>ptr! -> i32')
166
+ /** 复制文件
167
+ * @returns 成功 → 非 0
168
+ * @param args_2 bFailIfExists 非 0:目标已存在则失败 */
169
+ export const CopyFile = /*@__PURE__*/ b('CopyFileW', '<WCHAR>ptr! <WCHAR>ptr! i32 -> i32')
170
+ /** 移动/改名(可跨卷)
171
+ * @returns 成功 → 非 0
172
+ * @param args_2 dwFlags 标志组合:MOVEFILE_REPLACE_EXISTING(0x1) 覆盖目标、
173
+ * MOVEFILE_COPY_ALLOWED(0x2) 跨卷时允许复制删除(flags 位不标枚举) */
174
+ export const MoveFileEx = /*@__PURE__*/ b('MoveFileExW', '<WCHAR>ptr! <WCHAR>ptr! u32 -> i32')
175
+ /** 移动文件指针
176
+ * @returns 新偏移(32 位),0xFFFFFFFF = 失败(须 GetLastError 区分
177
+ * 与合法的 0xFFFFFFFF 偏移)
178
+ * @param args_1 lDistanceToMove 偏移(LONG,可负)
179
+ * @param args_2 lpDistanceToMoveHigh 64 位偏移高半(出参双向),32 位够用传 NULL
180
+ * @param args_3 dwMoveMethod 起点 gui.FileSeekFrom.BEGIN / CURRENT / END */
181
+ export const SetFilePointer = /*@__PURE__*/ b('SetFilePointer', '<HFILE>ptr! i32 <BYTE>ptr u32@FileSeekFrom -> u32')
182
+ /** 读文件大小
183
+ * @returns 文件大小(低 32 位);0xFFFFFFFF = 失败(INVALID_FILE_SIZE,须 GetLastError 区分)
184
+ * @param args_1 lpFileSizeHigh 高 32 位出参槽(>4GB 文件),不需要传 NULL */
185
+ export const GetFileSize = /*@__PURE__*/ b('GetFileSize', '<HFILE>ptr! <BYTE>ptr -> u32')
186
+ /** 按通配模式枚举首个匹配('dir\\*.txt');配对 FindClose
187
+ * @returns 成功 → 查找句柄,失败 → INVALID_HANDLE_VALUE(-1)
188
+ * @param args_0 lpFileName 路径/通配模式 string(禁空)
189
+ * @param args_1 lpFindFileData 出参槽,传 WIN32_FIND_DATAW.alloc().ptr、decode 读回 */
190
+ export const FindFirstFile = /*@__PURE__*/ b('FindFirstFileW',
191
+ '<WCHAR>ptr! <WIN32_FIND_DATAW>ptr! -> <HFIND>ptr!')
192
+ /** 枚举下一匹配
193
+ * @returns 成功 → 非 0,0 = ERROR_NO_MORE_FILES(枚举完毕) */
194
+ export const FindNextFile = /*@__PURE__*/ b('FindNextFileW', '<HFIND>ptr! <WIN32_FIND_DATAW>ptr! -> i32')
195
+ /** 关闭查找句柄(Find 族专用,不用 CloseHandle)
196
+ * @returns 成功 → 非 0 */
197
+ export const FindClose = /*@__PURE__*/ b('FindClose', '<HFIND>ptr! -> i32')
198
+ /** 取临时目录路径(尾带反斜杠)
199
+ * @returns 写入字符数(不含 NUL,0 失败)
200
+ * @param args_0 nBufferLength 缓冲容量(WCHAR 个数,含 NUL 余量)
201
+ * @param args_1 lpBuffer 接收缓冲,传 WCHAR.alloc(n)、WCHAR.decode 读回 */
202
+ export const GetTempPath = /*@__PURE__*/ b('GetTempPathW', 'u32 <BYTE>ptr -> u32')
203
+
69
204
  // ============ 系统 / 错误 ============
70
205
 
71
- /** 取调用线程最近一次 Win32 错误码 */
206
+ /** 取调用线程最近一次 Win32 错误码
207
+ * @returns 最近一次失败的线程局部错误码 */
72
208
  export const GetLastError = /*@__PURE__*/ b('GetLastError', ' -> u32')
73
- /** 取 System32 目录路径(宽字符);返回写入的字符数(不含 NUL,0 失败)
209
+ /** 取 System32 目录路径(宽字符)
210
+ * @returns 写入的字符数(不含 NUL,0 失败)
74
211
  * @param args_0 lpBuffer 接收缓冲,传 WCHAR.alloc(n)
75
212
  * @param args_1 uSize 缓冲容量(WCHAR 个数,含 NUL 余量) */
76
213
  export const GetSystemDirectory = /*@__PURE__*/ b('GetSystemDirectoryW', '<BYTE>ptr u32 -> u32')
214
+ /** 错误码 → 可读文字(GetLastError 的搭档)
215
+ * @returns 写入字符数(0 失败)
216
+ * @param args_0 dwFlags 组合标志:FROM_SYSTEM(0x1000) 系统错误表 | IGNORE_INSERTS(0x200)
217
+ * 吞掉 %1 插值符(裸 u32 组合传 0x1200,可组合 flags 不标枚举)
218
+ * @param args_1 lpSource 消息表源(FROM_SYSTEM 时传 NULL)
219
+ * @param args_2 dwMessageId 错误码(如 GetLastError() 的返回)
220
+ * @param args_3 dwLanguageId 语言 0 = 中性(按系统 UI)
221
+ * @param args_4 lpBuffer 接收缓冲,传 WCHAR.alloc(n)
222
+ * @param args_5 nSize 缓冲容量(WCHAR 个数)
223
+ * @param args_6 Arguments 插值参数表,IGNORE_INSERTS 时传 NULL */
224
+ export const FormatMessage = /*@__PURE__*/ b('FormatMessageW',
225
+ 'u32 <>ptr u32 u32 <BYTE>ptr u32 <>ptr -> u32')
226
+
227
+ // ============ 计时 / 系统信息 ============
228
+
229
+ /** 高精度计数器读数(LARGE_INTEGER,8 字节)
230
+ * @returns 成功 → 非 0
231
+ * @param args_0 lpPerformanceCount 出参缓冲,PtrArrayBuffer(8) + DataView getBigInt64 读回 */
232
+ export const QueryPerformanceCounter = /*@__PURE__*/ b('QueryPerformanceCounter', '<BYTE>ptr -> i32')
233
+ /** 高精度计数器频率(每秒计数,LARGE_INTEGER 8 字节)
234
+ * @returns 成功 → 非 0
235
+ * @param args_0 lpFrequency 出参缓冲,PtrArrayBuffer(8) + DataView getBigInt64 读回 */
236
+ export const QueryPerformanceFrequency = /*@__PURE__*/ b('QueryPerformanceFrequency', '<BYTE>ptr -> i32')
237
+ /** 挂起当前线程毫秒数(0 = 让出剩余时间片);无返回值 */
238
+ export const Sleep = /*@__PURE__*/ b('Sleep', 'u32 -> void')
239
+ /** 当前系统时间(UTC FILETIME,8 字节 = 1601 起的 100ns 单元);无返回值
240
+ * @param args_0 lpSystemTimeAsFileTime 出参缓冲,PtrArrayBuffer(8) + DataView getBigUint64 读回 */
241
+ export const GetSystemTimeAsFileTime = /*@__PURE__*/ b('GetSystemTimeAsFileTime', '<BYTE>ptr -> void')
242
+ /** 本地时间(SYSTEMTIME 出参位不注册 encoder:SYSTEMTIME.alloc().ptr 进、decode 读回);
243
+ * 无返回值
244
+ * @param args_0 lpSystemTime 出参结构缓冲 */
245
+ export const GetLocalTime = /*@__PURE__*/ b('GetLocalTime', '<SYSTEMTIME>ptr -> void')
246
+ /** 取环境变量值
247
+ * @returns 读取字符数(不含 NUL,0 = 不存在或缓冲不足)
248
+ * @param args_0 lpName 变量名(禁空,如 'PATH')
249
+ * @param args_1 lpBuffer 接收缓冲,传 WCHAR.alloc(n)
250
+ * @param args_2 nSize 缓冲容量(WCHAR 个数,含 NUL 余量) */
251
+ export const GetEnvironmentVariable = /*@__PURE__*/ b('GetEnvironmentVariableW',
252
+ '<WCHAR>ptr! <BYTE>ptr u32 -> u32')
253
+ /** 计算机名(*lpnSize 入 = 缓冲 WCHAR 容量,出 = 实际长度不含 NUL)
254
+ * @returns 成功 → 非 0
255
+ * @param args_0 lpBuffer 接收缓冲,传 WCHAR.alloc(n)
256
+ * @param args_1 lpnSize 长度槽(PtrArrayBuffer(4),Uint32Array 写入容量) */
257
+ export const GetComputerName = /*@__PURE__*/ b('GetComputerNameW', '<BYTE>ptr <BYTE>ptr -> i32')
258
+ /** 模块文件路径(全路径含扩展名)
259
+ * @returns 写入字符数(不含 NUL,0 失败/缓冲不足)
260
+ * @param args_0 hModule 模块句柄(<HMODULE>ptr 与 win 模块同型),NULL = 当前进程 exe
261
+ * @param args_1 lpFilename 接收缓冲,传 WCHAR.alloc(n)
262
+ * @param args_2 nSize 缓冲容量(WCHAR 个数) */
263
+ export const GetModuleFileName = /*@__PURE__*/ b('GetModuleFileNameW', '<HMODULE>ptr <BYTE>ptr u32 -> u32')
264
+ /** 进程命令行(含程序名;进程启动即有值,永不返回 NULL)
265
+ * @returns 命令行整串(返回位 `<WCHAR>ptr!`:内建 WCHAR codec 自动解码为 string,
266
+ * `!` 担保非 NULL 由返回位 0 检查兜底,无需接收缓冲) */
267
+ export const GetCommandLineW = /*@__PURE__*/ b('GetCommandLineW', ' -> <WCHAR>ptr!')
268
+
269
+ // ============ 全局内存(剪贴板数据载体)============
270
+
271
+ /** 分配全局内存块
272
+ * @returns 成功 → 句柄(0 失败)
273
+ * @param args_0 uFlags GMEM_MOVEABLE(0x2) 可移动(剪贴板要求)等 GMEM_* 组合
274
+ * @param args_1 dwBytes 字节数(SIZE_T 随位宽 = <>ptr 的 ptr 宽,非指针语义) */
275
+ export const GlobalAlloc = /*@__PURE__*/ b('GlobalAlloc', 'u32 <>ptr -> <HGLOBAL>ptr')
276
+ /** 句柄 → 内存地址(配 GlobalAlloc 使用,与 SetClipboardData 的自产自收配对)
277
+ * @returns 内存地址(0 失败/已锁定)——地址非句柄,返回位保持裸 <>ptr */
278
+ export const GlobalLock = /*@__PURE__*/ b('GlobalLock', '<HGLOBAL>ptr -> <>ptr')
279
+ /** 解锁(GlobalLock 每次获取须配对一次)
280
+ * @returns 锁定计数归 0 → 非 0 */
281
+ export const GlobalUnlock = /*@__PURE__*/ b('GlobalUnlock', '<HGLOBAL>ptr -> i32')
282
+ /** 释放全局内存(SetClipboardData 成功后所有权转系统,勿再释放)
283
+ * @returns 成功 → NULL */
284
+ export const GlobalFree = /*@__PURE__*/ b('GlobalFree', '<HGLOBAL>ptr -> <>ptr')
285
+ /** 拷贝内存块(dst = 目标进程地址,src = 数据缓冲);无返回值。ffi 只有 readByte,
286
+ * 写远程内存的唯一通道(GlobalLock 后灌数据、自定义窗口类 WNDCLASSEX 的 lpszClassName
287
+ * 等场景同用)
288
+ * @param args_0 dst 目标地址(GlobalLock 返回值等裸地址)
289
+ * @param args_1 src 源数据缓冲(<BYTE>ptr 收 PAB 本体)
290
+ * @param args_2 n 字节数(src.byteLength) */
291
+ export const RtlMoveMemory = /*@__PURE__*/ b('RtlMoveMemory', '<>ptr <BYTE>ptr u32 -> void')
@@ -0,0 +1,38 @@
1
+ // msimg32 绑定(透明色键 / 逐像素 alpha 混合,Win2000+ 系统自带 DLL)
2
+ import { bind } from '../ffi/bind.js';
3
+ import { BLENDFUNCTION } from './structs.js';
4
+ // dll 名部分应用(工厂转调保泛型 infer,见 lib/windows/user32.ts 头注释;第三参透传 encoders)
5
+ const b = (name, sig, encoders) => bind('msimg32.dll', name, sig, encoders);
6
+ /** 颜色键透明传送(crTransparent 色的源像素不画、透出目标底色;源区与目标可不同大 =
7
+ * 拉伸 + 透明一次完成)
8
+ * @returns 成功 → 非 0
9
+ * @param args_0 hdcDest 目标 DC
10
+ * @param args_1 xDest 目标左上 x
11
+ * @param args_2 yDest 目标左上 y
12
+ * @param args_3 wDest 目标宽
13
+ * @param args_4 hDest 目标高
14
+ * @param args_5 hdcSrc 源 DC
15
+ * @param args_6 xSrc 源区左上 x
16
+ * @param args_7 ySrc 源区左上 y
17
+ * @param args_8 wSrc 源区宽
18
+ * @param args_9 hSrc 源区高
19
+ * @param args_10 crTransparent 键色 0x00BBGGRR(取低 3 字节与源像素 RGB 比较) */
20
+ export const TransparentBlt = /*@__PURE__*/ b('TransparentBlt', '<HDC>ptr! i32 i32 i32 i32 <HDC>ptr i32 i32 i32 i32 u32 -> i32');
21
+ /** 逐像素 alpha 混合(当前 DC 与源 DC 按 AlphaBlend 规则合成,支持半透明)
22
+ * @returns 成功 → 非 0
23
+ * @param args_0 hdcDest 目标 DC
24
+ * @param args_1 xDest 目标左上 x
25
+ * @param args_2 yDest 目标左上 y
26
+ * @param args_3 wDest 目标宽
27
+ * @param args_4 hDest 目标高
28
+ * @param args_5 hdcSrc 源 DC
29
+ * @param args_6 xSrc 源区左上 x
30
+ * @param args_7 ySrc 源区左上 y
31
+ * @param args_8 wSrc 源区宽
32
+ * @param args_9 hSrc 源区高
33
+ * @param args_10 ftn 混合函数对象直传(按值位 `<BLENDFUNCTION>`:4B 聚合体不传地址)
34
+ * —— BlendOp 仅 AC_SRC_OVER(0)、BlendFlags 恒 0;AC_SRC_ALPHA(1) 是
35
+ * AlphaFormat 的值(源带 premultiplied alpha 通道时置位)。GDI 实测:
36
+ * AlphaFormat=0 时源仍按 premultiplied 公式混合(out = src + dst*(1-SCA/255),
37
+ * MS Answers 已知行为),与文档的非预乘公式不同 */
38
+ export const AlphaBlend = /*@__PURE__*/ b('AlphaBlend', '<HDC>ptr! i32 i32 i32 i32 <HDC>ptr i32 i32 i32 i32 <BLENDFUNCTION> -> i32', { BLENDFUNCTION });
@@ -0,0 +1,45 @@
1
+ // msimg32 绑定(透明色键 / 逐像素 alpha 混合,Win2000+ 系统自带 DLL)
2
+ import { bind, type CodecMap } from '../ffi/bind.js'
3
+ import { BLENDFUNCTION } from './structs.js'
4
+
5
+ // dll 名部分应用(工厂转调保泛型 infer,见 lib/windows/user32.ts 头注释;第三参透传 encoders)
6
+ const b = <const S extends string, const LE extends CodecMap = {}>(name: string, sig: S, encoders?: LE) =>
7
+ bind('msimg32.dll', name, sig, encoders)
8
+
9
+ /** 颜色键透明传送(crTransparent 色的源像素不画、透出目标底色;源区与目标可不同大 =
10
+ * 拉伸 + 透明一次完成)
11
+ * @returns 成功 → 非 0
12
+ * @param args_0 hdcDest 目标 DC
13
+ * @param args_1 xDest 目标左上 x
14
+ * @param args_2 yDest 目标左上 y
15
+ * @param args_3 wDest 目标宽
16
+ * @param args_4 hDest 目标高
17
+ * @param args_5 hdcSrc 源 DC
18
+ * @param args_6 xSrc 源区左上 x
19
+ * @param args_7 ySrc 源区左上 y
20
+ * @param args_8 wSrc 源区宽
21
+ * @param args_9 hSrc 源区高
22
+ * @param args_10 crTransparent 键色 0x00BBGGRR(取低 3 字节与源像素 RGB 比较) */
23
+ export const TransparentBlt = /*@__PURE__*/ b('TransparentBlt',
24
+ '<HDC>ptr! i32 i32 i32 i32 <HDC>ptr i32 i32 i32 i32 u32 -> i32')
25
+
26
+ /** 逐像素 alpha 混合(当前 DC 与源 DC 按 AlphaBlend 规则合成,支持半透明)
27
+ * @returns 成功 → 非 0
28
+ * @param args_0 hdcDest 目标 DC
29
+ * @param args_1 xDest 目标左上 x
30
+ * @param args_2 yDest 目标左上 y
31
+ * @param args_3 wDest 目标宽
32
+ * @param args_4 hDest 目标高
33
+ * @param args_5 hdcSrc 源 DC
34
+ * @param args_6 xSrc 源区左上 x
35
+ * @param args_7 ySrc 源区左上 y
36
+ * @param args_8 wSrc 源区宽
37
+ * @param args_9 hSrc 源区高
38
+ * @param args_10 ftn 混合函数对象直传(按值位 `<BLENDFUNCTION>`:4B 聚合体不传地址)
39
+ * —— BlendOp 仅 AC_SRC_OVER(0)、BlendFlags 恒 0;AC_SRC_ALPHA(1) 是
40
+ * AlphaFormat 的值(源带 premultiplied alpha 通道时置位)。GDI 实测:
41
+ * AlphaFormat=0 时源仍按 premultiplied 公式混合(out = src + dst*(1-SCA/255),
42
+ * MS Answers 已知行为),与文档的非预乘公式不同 */
43
+ export const AlphaBlend = /*@__PURE__*/ b('AlphaBlend',
44
+ '<HDC>ptr! i32 i32 i32 i32 <HDC>ptr i32 i32 i32 i32 <BLENDFUNCTION> -> i32',
45
+ { BLENDFUNCTION })