Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/std/Thread.zig
Original file line number Diff line number Diff line change
Expand Up @@ -674,7 +674,7 @@ const WindowsThreadImpl = struct {

const heap_handle = windows.kernel32.GetProcessHeap() orelse return error.OutOfMemory;
const alloc_bytes = @alignOf(Instance) + @sizeOf(Instance);
const alloc_ptr = windows.kernel32.HeapAlloc(heap_handle, 0, alloc_bytes) orelse return error.OutOfMemory;
const alloc_ptr = windows.ntdll.RtlAllocateHeap(heap_handle, 0, alloc_bytes) orelse return error.OutOfMemory;
errdefer assert(windows.kernel32.HeapFree(heap_handle, 0, alloc_ptr) != 0);

const instance_bytes = @as([*]u8, @ptrCast(alloc_ptr))[0..alloc_bytes];
Expand Down
4 changes: 2 additions & 2 deletions lib/std/Thread/Condition.zig
Original file line number Diff line number Diff line change
Expand Up @@ -180,8 +180,8 @@ const WindowsImpl = struct {

fn wake(self: *Impl, comptime notify: Notify) void {
switch (notify) {
.one => os.windows.kernel32.WakeConditionVariable(&self.condition),
.all => os.windows.kernel32.WakeAllConditionVariable(&self.condition),
.one => os.windows.ntdll.RtlWakeConditionVariable(&self.condition),
.all => os.windows.ntdll.RtlWakeAllConditionVariable(&self.condition),
}
}
};
Expand Down
6 changes: 3 additions & 3 deletions lib/std/Thread/Mutex.zig
Original file line number Diff line number Diff line change
Expand Up @@ -109,15 +109,15 @@ const WindowsImpl = struct {
srwlock: windows.SRWLOCK = .{},

fn tryLock(self: *@This()) bool {
return windows.kernel32.TryAcquireSRWLockExclusive(&self.srwlock) != windows.FALSE;
return windows.ntdll.RtlTryAcquireSRWLockExclusive(&self.srwlock) != windows.FALSE;
}

fn lock(self: *@This()) void {
windows.kernel32.AcquireSRWLockExclusive(&self.srwlock);
windows.ntdll.RtlAcquireSRWLockExclusive(&self.srwlock);
}

fn unlock(self: *@This()) void {
windows.kernel32.ReleaseSRWLockExclusive(&self.srwlock);
windows.ntdll.RtlReleaseSRWLockExclusive(&self.srwlock);
}

const windows = std.os.windows;
Expand Down
4 changes: 2 additions & 2 deletions lib/std/debug.zig
Original file line number Diff line number Diff line change
Expand Up @@ -1433,7 +1433,7 @@ pub fn attachSegfaultHandler() void {
@compileError("segfault handler not supported for this target");
}
if (native_os == .windows) {
windows_segfault_handle = windows.kernel32.AddVectoredExceptionHandler(0, handleSegfaultWindows);
windows_segfault_handle = windows.ntdll.RtlAddVectoredExceptionHandler(0, handleSegfaultWindows);
return;
}
const act = posix.Sigaction{
Expand All @@ -1447,7 +1447,7 @@ pub fn attachSegfaultHandler() void {
fn resetSegfaultHandler() void {
if (native_os == .windows) {
if (windows_segfault_handle) |handle| {
assert(windows.kernel32.RemoveVectoredExceptionHandler(handle) != 0);
assert(windows.ntdll.RtlRemoveVectoredExceptionHandler(handle) != 0);
windows_segfault_handle = null;
}
return;
Expand Down
102 changes: 13 additions & 89 deletions lib/std/os/windows/kernel32.zig
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,14 @@ const std = @import("../../std.zig");
const windows = std.os.windows;

const BOOL = windows.BOOL;
const BOOLEAN = windows.BOOLEAN;
const CONDITION_VARIABLE = windows.CONDITION_VARIABLE;
const CONSOLE_SCREEN_BUFFER_INFO = windows.CONSOLE_SCREEN_BUFFER_INFO;
const COORD = windows.COORD;
const CRITICAL_SECTION = windows.CRITICAL_SECTION;
const DWORD = windows.DWORD;
const FARPROC = windows.FARPROC;
const FILETIME = windows.FILETIME;
const HANDLE = windows.HANDLE;
const HANDLER_ROUTINE = windows.HANDLER_ROUTINE;
const HLOCAL = windows.HLOCAL;
const HMODULE = windows.HMODULE;
const INIT_ONCE = windows.INIT_ONCE;
const INIT_ONCE_FN = windows.INIT_ONCE_FN;
Expand All @@ -32,30 +29,29 @@ const SECURITY_ATTRIBUTES = windows.SECURITY_ATTRIBUTES;
const SIZE_T = windows.SIZE_T;
const SRWLOCK = windows.SRWLOCK;
const STARTUPINFOW = windows.STARTUPINFOW;
const SYSTEM_INFO = windows.SYSTEM_INFO;
const UCHAR = windows.UCHAR;
const UINT = windows.UINT;
const ULONG = windows.ULONG;
const ULONG_PTR = windows.ULONG_PTR;
const va_list = windows.va_list;
const VECTORED_EXCEPTION_HANDLER = windows.VECTORED_EXCEPTION_HANDLER;
const WCHAR = windows.WCHAR;
const WIN32_FIND_DATAW = windows.WIN32_FIND_DATAW;
const Win32Error = windows.Win32Error;
const WORD = windows.WORD;
const SYSTEM_INFO = windows.SYSTEM_INFO;

// I/O - Filesystem

pub extern "kernel32" fn ReadDirectoryChangesW(
hDirectory: windows.HANDLE,
hDirectory: HANDLE,
lpBuffer: [*]align(@alignOf(windows.FILE_NOTIFY_INFORMATION)) u8,
nBufferLength: windows.DWORD,
bWatchSubtree: windows.BOOL,
nBufferLength: DWORD,
bWatchSubtree: BOOL,
dwNotifyFilter: windows.FileNotifyChangeFilter,
lpBytesReturned: ?*windows.DWORD,
lpOverlapped: ?*windows.OVERLAPPED,
lpBytesReturned: ?*DWORD,
lpOverlapped: ?*OVERLAPPED,
lpCompletionRoutine: windows.LPOVERLAPPED_COMPLETION_ROUTINE,
) callconv(.winapi) windows.BOOL;
) callconv(.winapi) BOOL;

// TODO: Wrapper around NtCancelIoFile.
pub extern "kernel32" fn CancelIo(
Expand Down Expand Up @@ -258,17 +254,6 @@ pub extern "kernel32" fn CreateIoCompletionPort(
NumberOfConcurrentThreads: DWORD,
) callconv(.winapi) ?HANDLE;

// TODO: Forwarder to NtAddVectoredExceptionHandler.
pub extern "kernel32" fn AddVectoredExceptionHandler(
First: ULONG,
Handler: ?VECTORED_EXCEPTION_HANDLER,
) callconv(.winapi) ?LPVOID;

// TODO: Forwarder to NtRemoveVectoredExceptionHandler.
pub extern "kernel32" fn RemoveVectoredExceptionHandler(
Handle: HANDLE,
) callconv(.winapi) ULONG;

// TODO: Wrapper around RtlReportSilentProcessExit + NtTerminateProcess.
pub extern "kernel32" fn TerminateProcess(
hProcess: HANDLE,
Expand Down Expand Up @@ -321,11 +306,6 @@ pub extern "kernel32" fn CreateProcessW(
lpProcessInformation: *PROCESS_INFORMATION,
) callconv(.winapi) BOOL;

// TODO: Fowarder to RtlExitUserProcess.
pub extern "kernel32" fn ExitProcess(
exit_code: UINT,
) callconv(.winapi) noreturn;

// TODO: implement via ntdll instead
pub extern "kernel32" fn SleepEx(
dwMilliseconds: DWORD,
Expand Down Expand Up @@ -372,58 +352,13 @@ pub extern "kernel32" fn SwitchToThread() callconv(.winapi) BOOL;

// Locks, critical sections, initializers

// TODO: Forwarder to RtlInitializeCriticalSection
pub extern "kernel32" fn InitializeCriticalSection(
lpCriticalSection: *CRITICAL_SECTION,
) callconv(.winapi) void;

// TODO: Forwarder to RtlEnterCriticalSection
pub extern "kernel32" fn EnterCriticalSection(
lpCriticalSection: *CRITICAL_SECTION,
) callconv(.winapi) void;

// TODO: Forwarder to RtlLeaveCriticalSection
pub extern "kernel32" fn LeaveCriticalSection(
lpCriticalSection: *CRITICAL_SECTION,
) callconv(.winapi) void;

// TODO: Forwarder to RtlDeleteCriticalSection
pub extern "kernel32" fn DeleteCriticalSection(
lpCriticalSection: *CRITICAL_SECTION,
) callconv(.winapi) void;

// TODO: Forwarder to RtlTryAcquireSRWLockExclusive
pub extern "kernel32" fn TryAcquireSRWLockExclusive(
SRWLock: *SRWLOCK,
) callconv(.winapi) BOOLEAN;

// TODO: Forwarder to RtlAcquireSRWLockExclusive
pub extern "kernel32" fn AcquireSRWLockExclusive(
SRWLock: *SRWLOCK,
) callconv(.winapi) void;

// TODO: Forwarder to RtlReleaseSRWLockExclusive
pub extern "kernel32" fn ReleaseSRWLockExclusive(
SRWLock: *SRWLOCK,
) callconv(.winapi) void;

pub extern "kernel32" fn InitOnceExecuteOnce(
InitOnce: *INIT_ONCE,
InitFn: INIT_ONCE_FN,
Parameter: ?*anyopaque,
Context: ?*anyopaque,
) callconv(.winapi) BOOL;

// TODO: Forwarder to RtlWakeConditionVariable
pub extern "kernel32" fn WakeConditionVariable(
ConditionVariable: *CONDITION_VARIABLE,
) callconv(.winapi) void;

// TODO: Forwarder to RtlWakeAllConditionVariable
pub extern "kernel32" fn WakeAllConditionVariable(
ConditionVariable: *CONDITION_VARIABLE,
) callconv(.winapi) void;

// TODO:
// - dwMilliseconds -> LARGE_INTEGER.
// - RtlSleepConditionVariableSRW
Expand Down Expand Up @@ -514,22 +449,9 @@ pub extern "kernel32" fn HeapCreate(
dwMaximumSize: SIZE_T,
) callconv(.winapi) ?HANDLE;

// TODO: Forwarder to RtlReAllocateHeap.
pub extern "kernel32" fn HeapReAlloc(
hHeap: HANDLE,
dwFlags: DWORD,
lpMem: *anyopaque,
dwBytes: SIZE_T,
) callconv(.winapi) ?*anyopaque;

// TODO: Fowrarder to RtlAllocateHeap.
pub extern "kernel32" fn HeapAlloc(
hHeap: HANDLE,
dwFlags: DWORD,
dwBytes: SIZE_T,
) callconv(.winapi) ?*anyopaque;

// TODO: Fowrarder to RtlFreeHeap.
// TODO: Fowrarder to RtlFreeHeap before win11_zn.
// Since win11_zn this function points to unexported symbol RtlFreeHeapFast.
// See https://github.com/ziglang/zig/pull/25766#discussion_r2479727640
pub extern "kernel32" fn HeapFree(
hHeap: HANDLE,
dwFlags: DWORD,
Expand Down Expand Up @@ -642,4 +564,6 @@ pub extern "kernel32" fn SetLastError(

// Everything Else

pub extern "kernel32" fn GetSystemInfo(lpSystemInfo: *SYSTEM_INFO) callconv(.winapi) void;
pub extern "kernel32" fn GetSystemInfo(
lpSystemInfo: *SYSTEM_INFO,
) callconv(.winapi) void;
54 changes: 54 additions & 0 deletions lib/std/os/windows/ntdll.zig
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,10 @@ const PROCESSINFOCLASS = windows.PROCESSINFOCLASS;
const LPVOID = windows.LPVOID;
const LPCVOID = windows.LPCVOID;
const SECTION_INHERIT = windows.SECTION_INHERIT;
const VECTORED_EXCEPTION_HANDLER = windows.VECTORED_EXCEPTION_HANDLER;
const CRITICAL_SECTION = windows.CRITICAL_SECTION;
const SRWLOCK = windows.SRWLOCK;
const CONDITION_VARIABLE = windows.CONDITION_VARIABLE;

pub extern "ntdll" fn NtQueryInformationProcess(
ProcessHandle: HANDLE,
Expand Down Expand Up @@ -375,3 +379,53 @@ pub extern "ntdll" fn NtFreeVirtualMemory(
RegionSize: *SIZE_T,
FreeType: ULONG,
) callconv(.winapi) NTSTATUS;

pub extern "ntdll" fn RtlAddVectoredExceptionHandler(
First: ULONG,
Handler: ?VECTORED_EXCEPTION_HANDLER,
) callconv(.winapi) ?LPVOID;
pub extern "ntdll" fn RtlRemoveVectoredExceptionHandler(
Handle: HANDLE,
) callconv(.winapi) ULONG;

pub extern "ntdll" fn RtlInitializeCriticalSection(
lpCriticalSection: *CRITICAL_SECTION,
) callconv(.winapi) NTSTATUS;
pub extern "ntdll" fn RtlEnterCriticalSection(
lpCriticalSection: *CRITICAL_SECTION,
) callconv(.winapi) NTSTATUS;
pub extern "ntdll" fn RtlLeaveCriticalSection(
lpCriticalSection: *CRITICAL_SECTION,
) callconv(.winapi) NTSTATUS;
pub extern "ntdll" fn RtlDeleteCriticalSection(
lpCriticalSection: *CRITICAL_SECTION,
) callconv(.winapi) NTSTATUS;

pub extern "ntdll" fn RtlTryAcquireSRWLockExclusive(
SRWLock: *SRWLOCK,
) callconv(.winapi) BOOLEAN;
pub extern "ntdll" fn RtlAcquireSRWLockExclusive(
SRWLock: *SRWLOCK,
) callconv(.winapi) void;
pub extern "ntdll" fn RtlReleaseSRWLockExclusive(
SRWLock: *SRWLOCK,
) callconv(.winapi) void;

pub extern "ntdll" fn RtlWakeConditionVariable(
ConditionVariable: *CONDITION_VARIABLE,
) callconv(.winapi) void;
pub extern "ntdll" fn RtlWakeAllConditionVariable(
ConditionVariable: *CONDITION_VARIABLE,
) callconv(.winapi) void;

pub extern "ntdll" fn RtlReAllocateHeap(
HeapHandle: HANDLE,
Flags: ULONG,
BaseAddress: PVOID,
Size: SIZE_T,
) callconv(.winapi) ?PVOID;
pub extern "ntdll" fn RtlAllocateHeap(
HeapHandle: HANDLE,
Flags: ULONG,
Size: SIZE_T,
) callconv(.winapi) ?PVOID;
4 changes: 2 additions & 2 deletions lib/std/posix.zig
Original file line number Diff line number Diff line change
Expand Up @@ -701,7 +701,7 @@ pub fn abort() noreturn {
if (builtin.mode == .Debug and windows.peb().BeingDebugged != 0) {
@breakpoint();
}
windows.kernel32.ExitProcess(3);
windows.ntdll.RtlExitUserProcess(3);
}
if (!builtin.link_libc and native_os == .linux) {
// The Linux man page says that the libc abort() function
Expand Down Expand Up @@ -794,7 +794,7 @@ pub fn exit(status: u8) noreturn {
std.c.exit(status);
}
if (native_os == .windows) {
windows.kernel32.ExitProcess(status);
windows.ntdll.RtlExitUserProcess(status);
}
if (native_os == .wasi) {
wasi.proc_exit(status);
Expand Down