authorgravatar for 89187439+qilme@users.noreply.github.comqilme <89187439+qilme@users.noreply.github.com> 2025-10-31 21:54:50+08:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2025-10-31 13:54:50+00:00
log8347791ce3e3ffc82d95c09ccc036e8e47c1ed0c
treeccd73698764a6d6b8f2b5884c2fea48667a8c356
parent62de7a2efd760bec85a41d52eca641fd61cd4a5d
signaturebadge-check Signed by PGP key B5690EEEBB952194

std.os.windows: eliminate forwarder function in kernel32 (#25766)

#1840 kernel32.AddVectoredExceptionHandler -> ntdll.RtlAddVectoredExceptionHandler kernel32.RemoveVectoredExceptionHandler -> ntdll.RtlRemoveVectoredExceptionHandler kernel32.ExitProcess -> ntdll.RtlExitUserProcess kernel32.InitializeCriticalSection -> ntdll.RtlInitializeCriticalSection kernel32.EnterCriticalSection -> ntdll.RtlEnterCriticalSection kernel32.LeaveCriticalSection -> ntdll.RtlLeaveCriticalSection kernel32.DeleteCriticalSection -> ntdll.RtlDeleteCriticalSection kernel32.TryAcquireSRWLockExclusive -> ntdll.RtlTryAcquireSRWLockExclusive kernel32.AcquireSRWLockExclusive -> ntdll.RtlAcquireSRWLockExclusive kernel32.ReleaseSRWLockExclusive -> ntdll.RtlReleaseSRWLockExclusive kernel32.WakeConditionVariable -> ntdll.RtlWakeConditionVariable kernel32.WakeAllConditionVariable -> ntdll.RtlWakeAllConditionVariable kernel32.HeapReAlloc -> ntdll.RtlReAllocateHeap kernel32.HeapAlloc -> ntdll.RtlAllocateHeap

7 files changed, 77 insertions(+), 99 deletions(-)

lib/std/Thread.zig+1-1
...@@ -674,7 +674,7 @@ const WindowsThreadImpl = struct {...@@ -674,7 +674,7 @@ const WindowsThreadImpl = struct {
674674
675 const heap_handle = windows.kernel32.GetProcessHeap() orelse return error.OutOfMemory;675 const heap_handle = windows.kernel32.GetProcessHeap() orelse return error.OutOfMemory;
676 const alloc_bytes = @alignOf(Instance) + @sizeOf(Instance);676 const alloc_bytes = @alignOf(Instance) + @sizeOf(Instance);
677 const alloc_ptr = windows.kernel32.HeapAlloc(heap_handle, 0, alloc_bytes) orelse return error.OutOfMemory;677 const alloc_ptr = windows.ntdll.RtlAllocateHeap(heap_handle, 0, alloc_bytes) orelse return error.OutOfMemory;
678 errdefer assert(windows.kernel32.HeapFree(heap_handle, 0, alloc_ptr) != 0);678 errdefer assert(windows.kernel32.HeapFree(heap_handle, 0, alloc_ptr) != 0);
679679
680 const instance_bytes = @as([*]u8, @ptrCast(alloc_ptr))[0..alloc_bytes];680 const instance_bytes = @as([*]u8, @ptrCast(alloc_ptr))[0..alloc_bytes];
lib/std/Thread/Condition.zig+2-2
...@@ -180,8 +180,8 @@ const WindowsImpl = struct {...@@ -180,8 +180,8 @@ const WindowsImpl = struct {
180180
181 fn wake(self: *Impl, comptime notify: Notify) void {181 fn wake(self: *Impl, comptime notify: Notify) void {
182 switch (notify) {182 switch (notify) {
183 .one => os.windows.kernel32.WakeConditionVariable(&self.condition),183 .one => os.windows.ntdll.RtlWakeConditionVariable(&self.condition),
184 .all => os.windows.kernel32.WakeAllConditionVariable(&self.condition),184 .all => os.windows.ntdll.RtlWakeAllConditionVariable(&self.condition),
185 }185 }
186 }186 }
187};187};
lib/std/Thread/Mutex.zig+3-3
...@@ -109,15 +109,15 @@ const WindowsImpl = struct {...@@ -109,15 +109,15 @@ const WindowsImpl = struct {
109 srwlock: windows.SRWLOCK = .{},109 srwlock: windows.SRWLOCK = .{},
110110
111 fn tryLock(self: *@This()) bool {111 fn tryLock(self: *@This()) bool {
112 return windows.kernel32.TryAcquireSRWLockExclusive(&self.srwlock) != windows.FALSE;112 return windows.ntdll.RtlTryAcquireSRWLockExclusive(&self.srwlock) != windows.FALSE;
113 }113 }
114114
115 fn lock(self: *@This()) void {115 fn lock(self: *@This()) void {
116 windows.kernel32.AcquireSRWLockExclusive(&self.srwlock);116 windows.ntdll.RtlAcquireSRWLockExclusive(&self.srwlock);
117 }117 }
118118
119 fn unlock(self: *@This()) void {119 fn unlock(self: *@This()) void {
120 windows.kernel32.ReleaseSRWLockExclusive(&self.srwlock);120 windows.ntdll.RtlReleaseSRWLockExclusive(&self.srwlock);
121 }121 }
122122
123 const windows = std.os.windows;123 const windows = std.os.windows;
lib/std/debug.zig+2-2
...@@ -1433,7 +1433,7 @@ pub fn attachSegfaultHandler() void {...@@ -1433,7 +1433,7 @@ pub fn attachSegfaultHandler() void {
1433 @compileError("segfault handler not supported for this target");1433 @compileError("segfault handler not supported for this target");
1434 }1434 }
1435 if (native_os == .windows) {1435 if (native_os == .windows) {
1436 windows_segfault_handle = windows.kernel32.AddVectoredExceptionHandler(0, handleSegfaultWindows);1436 windows_segfault_handle = windows.ntdll.RtlAddVectoredExceptionHandler(0, handleSegfaultWindows);
1437 return;1437 return;
1438 }1438 }
1439 const act = posix.Sigaction{1439 const act = posix.Sigaction{
...@@ -1447,7 +1447,7 @@ pub fn attachSegfaultHandler() void {...@@ -1447,7 +1447,7 @@ pub fn attachSegfaultHandler() void {
1447fn resetSegfaultHandler() void {1447fn resetSegfaultHandler() void {
1448 if (native_os == .windows) {1448 if (native_os == .windows) {
1449 if (windows_segfault_handle) |handle| {1449 if (windows_segfault_handle) |handle| {
1450 assert(windows.kernel32.RemoveVectoredExceptionHandler(handle) != 0);1450 assert(windows.ntdll.RtlRemoveVectoredExceptionHandler(handle) != 0);
1451 windows_segfault_handle = null;1451 windows_segfault_handle = null;
1452 }1452 }
1453 return;1453 return;
lib/std/os/windows/kernel32.zig+13-89
...@@ -2,17 +2,14 @@ const std = @import("../../std.zig");...@@ -2,17 +2,14 @@ const std = @import("../../std.zig");
2const windows = std.os.windows;2const windows = std.os.windows;
33
4const BOOL = windows.BOOL;4const BOOL = windows.BOOL;
5const BOOLEAN = windows.BOOLEAN;
6const CONDITION_VARIABLE = windows.CONDITION_VARIABLE;5const CONDITION_VARIABLE = windows.CONDITION_VARIABLE;
7const CONSOLE_SCREEN_BUFFER_INFO = windows.CONSOLE_SCREEN_BUFFER_INFO;6const CONSOLE_SCREEN_BUFFER_INFO = windows.CONSOLE_SCREEN_BUFFER_INFO;
8const COORD = windows.COORD;7const COORD = windows.COORD;
9const CRITICAL_SECTION = windows.CRITICAL_SECTION;
10const DWORD = windows.DWORD;8const DWORD = windows.DWORD;
11const FARPROC = windows.FARPROC;9const FARPROC = windows.FARPROC;
12const FILETIME = windows.FILETIME;10const FILETIME = windows.FILETIME;
13const HANDLE = windows.HANDLE;11const HANDLE = windows.HANDLE;
14const HANDLER_ROUTINE = windows.HANDLER_ROUTINE;12const HANDLER_ROUTINE = windows.HANDLER_ROUTINE;
15const HLOCAL = windows.HLOCAL;
16const HMODULE = windows.HMODULE;13const HMODULE = windows.HMODULE;
17const INIT_ONCE = windows.INIT_ONCE;14const INIT_ONCE = windows.INIT_ONCE;
18const INIT_ONCE_FN = windows.INIT_ONCE_FN;15const INIT_ONCE_FN = windows.INIT_ONCE_FN;
...@@ -32,30 +29,29 @@ const SECURITY_ATTRIBUTES = windows.SECURITY_ATTRIBUTES;...@@ -32,30 +29,29 @@ const SECURITY_ATTRIBUTES = windows.SECURITY_ATTRIBUTES;
32const SIZE_T = windows.SIZE_T;29const SIZE_T = windows.SIZE_T;
33const SRWLOCK = windows.SRWLOCK;30const SRWLOCK = windows.SRWLOCK;
34const STARTUPINFOW = windows.STARTUPINFOW;31const STARTUPINFOW = windows.STARTUPINFOW;
32const SYSTEM_INFO = windows.SYSTEM_INFO;
35const UCHAR = windows.UCHAR;33const UCHAR = windows.UCHAR;
36const UINT = windows.UINT;34const UINT = windows.UINT;
37const ULONG = windows.ULONG;35const ULONG = windows.ULONG;
38const ULONG_PTR = windows.ULONG_PTR;36const ULONG_PTR = windows.ULONG_PTR;
39const va_list = windows.va_list;37const va_list = windows.va_list;
40const VECTORED_EXCEPTION_HANDLER = windows.VECTORED_EXCEPTION_HANDLER;
41const WCHAR = windows.WCHAR;38const WCHAR = windows.WCHAR;
42const WIN32_FIND_DATAW = windows.WIN32_FIND_DATAW;39const WIN32_FIND_DATAW = windows.WIN32_FIND_DATAW;
43const Win32Error = windows.Win32Error;40const Win32Error = windows.Win32Error;
44const WORD = windows.WORD;41const WORD = windows.WORD;
45const SYSTEM_INFO = windows.SYSTEM_INFO;
4642
47// I/O - Filesystem43// I/O - Filesystem
4844
49pub extern "kernel32" fn ReadDirectoryChangesW(45pub extern "kernel32" fn ReadDirectoryChangesW(
50 hDirectory: windows.HANDLE,46 hDirectory: HANDLE,
51 lpBuffer: [*]align(@alignOf(windows.FILE_NOTIFY_INFORMATION)) u8,47 lpBuffer: [*]align(@alignOf(windows.FILE_NOTIFY_INFORMATION)) u8,
52 nBufferLength: windows.DWORD,48 nBufferLength: DWORD,
53 bWatchSubtree: windows.BOOL,49 bWatchSubtree: BOOL,
54 dwNotifyFilter: windows.FileNotifyChangeFilter,50 dwNotifyFilter: windows.FileNotifyChangeFilter,
55 lpBytesReturned: ?*windows.DWORD,51 lpBytesReturned: ?*DWORD,
56 lpOverlapped: ?*windows.OVERLAPPED,52 lpOverlapped: ?*OVERLAPPED,
57 lpCompletionRoutine: windows.LPOVERLAPPED_COMPLETION_ROUTINE,53 lpCompletionRoutine: windows.LPOVERLAPPED_COMPLETION_ROUTINE,
58) callconv(.winapi) windows.BOOL;54) callconv(.winapi) BOOL;
5955
60// TODO: Wrapper around NtCancelIoFile.56// TODO: Wrapper around NtCancelIoFile.
61pub extern "kernel32" fn CancelIo(57pub extern "kernel32" fn CancelIo(
...@@ -258,17 +254,6 @@ pub extern "kernel32" fn CreateIoCompletionPort(...@@ -258,17 +254,6 @@ pub extern "kernel32" fn CreateIoCompletionPort(
258 NumberOfConcurrentThreads: DWORD,254 NumberOfConcurrentThreads: DWORD,
259) callconv(.winapi) ?HANDLE;255) callconv(.winapi) ?HANDLE;
260256
261// TODO: Forwarder to NtAddVectoredExceptionHandler.
262pub extern "kernel32" fn AddVectoredExceptionHandler(
263 First: ULONG,
264 Handler: ?VECTORED_EXCEPTION_HANDLER,
265) callconv(.winapi) ?LPVOID;
266
267// TODO: Forwarder to NtRemoveVectoredExceptionHandler.
268pub extern "kernel32" fn RemoveVectoredExceptionHandler(
269 Handle: HANDLE,
270) callconv(.winapi) ULONG;
271
272// TODO: Wrapper around RtlReportSilentProcessExit + NtTerminateProcess.257// TODO: Wrapper around RtlReportSilentProcessExit + NtTerminateProcess.
273pub extern "kernel32" fn TerminateProcess(258pub extern "kernel32" fn TerminateProcess(
274 hProcess: HANDLE,259 hProcess: HANDLE,
...@@ -321,11 +306,6 @@ pub extern "kernel32" fn CreateProcessW(...@@ -321,11 +306,6 @@ pub extern "kernel32" fn CreateProcessW(
321 lpProcessInformation: *PROCESS_INFORMATION,306 lpProcessInformation: *PROCESS_INFORMATION,
322) callconv(.winapi) BOOL;307) callconv(.winapi) BOOL;
323308
324// TODO: Fowarder to RtlExitUserProcess.
325pub extern "kernel32" fn ExitProcess(
326 exit_code: UINT,
327) callconv(.winapi) noreturn;
328
329// TODO: implement via ntdll instead309// TODO: implement via ntdll instead
330pub extern "kernel32" fn SleepEx(310pub extern "kernel32" fn SleepEx(
331 dwMilliseconds: DWORD,311 dwMilliseconds: DWORD,
...@@ -372,41 +352,6 @@ pub extern "kernel32" fn SwitchToThread() callconv(.winapi) BOOL;...@@ -372,41 +352,6 @@ pub extern "kernel32" fn SwitchToThread() callconv(.winapi) BOOL;
372352
373// Locks, critical sections, initializers353// Locks, critical sections, initializers
374354
375// TODO: Forwarder to RtlInitializeCriticalSection
376pub extern "kernel32" fn InitializeCriticalSection(
377 lpCriticalSection: *CRITICAL_SECTION,
378) callconv(.winapi) void;
379
380// TODO: Forwarder to RtlEnterCriticalSection
381pub extern "kernel32" fn EnterCriticalSection(
382 lpCriticalSection: *CRITICAL_SECTION,
383) callconv(.winapi) void;
384
385// TODO: Forwarder to RtlLeaveCriticalSection
386pub extern "kernel32" fn LeaveCriticalSection(
387 lpCriticalSection: *CRITICAL_SECTION,
388) callconv(.winapi) void;
389
390// TODO: Forwarder to RtlDeleteCriticalSection
391pub extern "kernel32" fn DeleteCriticalSection(
392 lpCriticalSection: *CRITICAL_SECTION,
393) callconv(.winapi) void;
394
395// TODO: Forwarder to RtlTryAcquireSRWLockExclusive
396pub extern "kernel32" fn TryAcquireSRWLockExclusive(
397 SRWLock: *SRWLOCK,
398) callconv(.winapi) BOOLEAN;
399
400// TODO: Forwarder to RtlAcquireSRWLockExclusive
401pub extern "kernel32" fn AcquireSRWLockExclusive(
402 SRWLock: *SRWLOCK,
403) callconv(.winapi) void;
404
405// TODO: Forwarder to RtlReleaseSRWLockExclusive
406pub extern "kernel32" fn ReleaseSRWLockExclusive(
407 SRWLock: *SRWLOCK,
408) callconv(.winapi) void;
409
410pub extern "kernel32" fn InitOnceExecuteOnce(355pub extern "kernel32" fn InitOnceExecuteOnce(
411 InitOnce: *INIT_ONCE,356 InitOnce: *INIT_ONCE,
412 InitFn: INIT_ONCE_FN,357 InitFn: INIT_ONCE_FN,
...@@ -414,16 +359,6 @@ pub extern "kernel32" fn InitOnceExecuteOnce(...@@ -414,16 +359,6 @@ pub extern "kernel32" fn InitOnceExecuteOnce(
414 Context: ?*anyopaque,359 Context: ?*anyopaque,
415) callconv(.winapi) BOOL;360) callconv(.winapi) BOOL;
416361
417// TODO: Forwarder to RtlWakeConditionVariable
418pub extern "kernel32" fn WakeConditionVariable(
419 ConditionVariable: *CONDITION_VARIABLE,
420) callconv(.winapi) void;
421
422// TODO: Forwarder to RtlWakeAllConditionVariable
423pub extern "kernel32" fn WakeAllConditionVariable(
424 ConditionVariable: *CONDITION_VARIABLE,
425) callconv(.winapi) void;
426
427// TODO:362// TODO:
428// - dwMilliseconds -> LARGE_INTEGER.363// - dwMilliseconds -> LARGE_INTEGER.
429// - RtlSleepConditionVariableSRW364// - RtlSleepConditionVariableSRW
...@@ -514,22 +449,9 @@ pub extern "kernel32" fn HeapCreate(...@@ -514,22 +449,9 @@ pub extern "kernel32" fn HeapCreate(
514 dwMaximumSize: SIZE_T,449 dwMaximumSize: SIZE_T,
515) callconv(.winapi) ?HANDLE;450) callconv(.winapi) ?HANDLE;
516451
517// TODO: Forwarder to RtlReAllocateHeap.452// TODO: Fowrarder to RtlFreeHeap before win11_zn.
518pub extern "kernel32" fn HeapReAlloc(453// Since win11_zn this function points to unexported symbol RtlFreeHeapFast.
519 hHeap: HANDLE,454// See https://github.com/ziglang/zig/pull/25766#discussion_r2479727640
520 dwFlags: DWORD,
521 lpMem: *anyopaque,
522 dwBytes: SIZE_T,
523) callconv(.winapi) ?*anyopaque;
524
525// TODO: Fowrarder to RtlAllocateHeap.
526pub extern "kernel32" fn HeapAlloc(
527 hHeap: HANDLE,
528 dwFlags: DWORD,
529 dwBytes: SIZE_T,
530) callconv(.winapi) ?*anyopaque;
531
532// TODO: Fowrarder to RtlFreeHeap.
533pub extern "kernel32" fn HeapFree(455pub extern "kernel32" fn HeapFree(
534 hHeap: HANDLE,456 hHeap: HANDLE,
535 dwFlags: DWORD,457 dwFlags: DWORD,
...@@ -642,4 +564,6 @@ pub extern "kernel32" fn SetLastError(...@@ -642,4 +564,6 @@ pub extern "kernel32" fn SetLastError(
642564
643// Everything Else565// Everything Else
644566
645pub extern "kernel32" fn GetSystemInfo(lpSystemInfo: *SYSTEM_INFO) callconv(.winapi) void;567pub extern "kernel32" fn GetSystemInfo(
568 lpSystemInfo: *SYSTEM_INFO,
569) callconv(.winapi) void;
lib/std/os/windows/ntdll.zig+54
...@@ -37,6 +37,10 @@ const PROCESSINFOCLASS = windows.PROCESSINFOCLASS;...@@ -37,6 +37,10 @@ const PROCESSINFOCLASS = windows.PROCESSINFOCLASS;
37const LPVOID = windows.LPVOID;37const LPVOID = windows.LPVOID;
38const LPCVOID = windows.LPCVOID;38const LPCVOID = windows.LPCVOID;
39const SECTION_INHERIT = windows.SECTION_INHERIT;39const SECTION_INHERIT = windows.SECTION_INHERIT;
40const VECTORED_EXCEPTION_HANDLER = windows.VECTORED_EXCEPTION_HANDLER;
41const CRITICAL_SECTION = windows.CRITICAL_SECTION;
42const SRWLOCK = windows.SRWLOCK;
43const CONDITION_VARIABLE = windows.CONDITION_VARIABLE;
4044
41pub extern "ntdll" fn NtQueryInformationProcess(45pub extern "ntdll" fn NtQueryInformationProcess(
42 ProcessHandle: HANDLE,46 ProcessHandle: HANDLE,
...@@ -375,3 +379,53 @@ pub extern "ntdll" fn NtFreeVirtualMemory(...@@ -375,3 +379,53 @@ pub extern "ntdll" fn NtFreeVirtualMemory(
375 RegionSize: *SIZE_T,379 RegionSize: *SIZE_T,
376 FreeType: ULONG,380 FreeType: ULONG,
377) callconv(.winapi) NTSTATUS;381) callconv(.winapi) NTSTATUS;
382
383pub extern "ntdll" fn RtlAddVectoredExceptionHandler(
384 First: ULONG,
385 Handler: ?VECTORED_EXCEPTION_HANDLER,
386) callconv(.winapi) ?LPVOID;
387pub extern "ntdll" fn RtlRemoveVectoredExceptionHandler(
388 Handle: HANDLE,
389) callconv(.winapi) ULONG;
390
391pub extern "ntdll" fn RtlInitializeCriticalSection(
392 lpCriticalSection: *CRITICAL_SECTION,
393) callconv(.winapi) NTSTATUS;
394pub extern "ntdll" fn RtlEnterCriticalSection(
395 lpCriticalSection: *CRITICAL_SECTION,
396) callconv(.winapi) NTSTATUS;
397pub extern "ntdll" fn RtlLeaveCriticalSection(
398 lpCriticalSection: *CRITICAL_SECTION,
399) callconv(.winapi) NTSTATUS;
400pub extern "ntdll" fn RtlDeleteCriticalSection(
401 lpCriticalSection: *CRITICAL_SECTION,
402) callconv(.winapi) NTSTATUS;
403
404pub extern "ntdll" fn RtlTryAcquireSRWLockExclusive(
405 SRWLock: *SRWLOCK,
406) callconv(.winapi) BOOLEAN;
407pub extern "ntdll" fn RtlAcquireSRWLockExclusive(
408 SRWLock: *SRWLOCK,
409) callconv(.winapi) void;
410pub extern "ntdll" fn RtlReleaseSRWLockExclusive(
411 SRWLock: *SRWLOCK,
412) callconv(.winapi) void;
413
414pub extern "ntdll" fn RtlWakeConditionVariable(
415 ConditionVariable: *CONDITION_VARIABLE,
416) callconv(.winapi) void;
417pub extern "ntdll" fn RtlWakeAllConditionVariable(
418 ConditionVariable: *CONDITION_VARIABLE,
419) callconv(.winapi) void;
420
421pub extern "ntdll" fn RtlReAllocateHeap(
422 HeapHandle: HANDLE,
423 Flags: ULONG,
424 BaseAddress: PVOID,
425 Size: SIZE_T,
426) callconv(.winapi) ?PVOID;
427pub extern "ntdll" fn RtlAllocateHeap(
428 HeapHandle: HANDLE,
429 Flags: ULONG,
430 Size: SIZE_T,
431) callconv(.winapi) ?PVOID;
lib/std/posix.zig+2-2
...@@ -701,7 +701,7 @@ pub fn abort() noreturn {...@@ -701,7 +701,7 @@ pub fn abort() noreturn {
701 if (builtin.mode == .Debug and windows.peb().BeingDebugged != 0) {701 if (builtin.mode == .Debug and windows.peb().BeingDebugged != 0) {
702 @breakpoint();702 @breakpoint();
703 }703 }
704 windows.kernel32.ExitProcess(3);704 windows.ntdll.RtlExitUserProcess(3);
705 }705 }
706 if (!builtin.link_libc and native_os == .linux) {706 if (!builtin.link_libc and native_os == .linux) {
707 // The Linux man page says that the libc abort() function707 // The Linux man page says that the libc abort() function
...@@ -794,7 +794,7 @@ pub fn exit(status: u8) noreturn {...@@ -794,7 +794,7 @@ pub fn exit(status: u8) noreturn {
794 std.c.exit(status);794 std.c.exit(status);
795 }795 }
796 if (native_os == .windows) {796 if (native_os == .windows) {
797 windows.kernel32.ExitProcess(status);797 windows.ntdll.RtlExitUserProcess(status);
798 }798 }
799 if (native_os == .wasi) {799 if (native_os == .wasi) {
800 wasi.proc_exit(status);800 wasi.proc_exit(status);