From 7f6e7e3e5db5f8dc749e58b704eb0ff812a1cdbf Mon Sep 17 00:00:00 2001 From: viri Date: Sat, 12 Jun 2021 18:36:22 -0600 Subject: [PATCH] std.windows: fix `OVERLAPPED`, add `OVERLAPPED_ENTRY` --- lib/std/event/loop.zig | 8 ++++++-- lib/std/fs/watch.zig | 8 ++++++-- lib/std/os/windows.zig | 32 ++++++++++++++++++++++++-------- lib/std/os/windows/bits.zig | 17 +++++++++++++++-- 4 files changed, 51 insertions(+), 14 deletions(-) diff --git a/lib/std/event/loop.zig b/lib/std/event/loop.zig index 393d5688a5f90504b6bf1d399ab03d7e95269d0f..ca55a366f8cf4f68c3ad631a925e95ebb021642b 100644 --- a/lib/std/event/loop.zig +++ b/lib/std/event/loop.zig @@ -54,8 +54,12 @@ pub const Loop = struct { .windows => windows.OVERLAPPED{ .Internal = 0, .InternalHigh = 0, - .Offset = 0, - .OffsetHigh = 0, + .DUMMYUNIONNAME = .{ + .DUMMYSTRUCTNAME = .{ + .Offset = 0, + .OffsetHigh = 0, + }, + }, .hEvent = null, }, else => {}, diff --git a/lib/std/fs/watch.zig b/lib/std/fs/watch.zig index a9fd55da0c28e72eecf763a1493e598e51cf28b0..40867bb3b570886b6a661b623e0826ee8fd08eb8 100644 --- a/lib/std/fs/watch.zig +++ b/lib/std/fs/watch.zig @@ -437,8 +437,12 @@ pub fn Watch(comptime V: type) type { .overlapped = windows.OVERLAPPED{ .Internal = 0, .InternalHigh = 0, - .Offset = 0, - .OffsetHigh = 0, + .DUMMYUNIONNAME = .{ + .DUMMYSTRUCTNAME = .{ + .Offset = 0, + .OffsetHigh = 0, + }, + }, .hEvent = null, }, }, diff --git a/lib/std/os/windows.zig b/lib/std/os/windows.zig index b5da153e59071d3391132ad06b10bca7b0ac8b41..f4c1d28bb1e9aaf7836dc50defcea71d95d03021 100644 --- a/lib/std/os/windows.zig +++ b/lib/std/os/windows.zig @@ -454,8 +454,12 @@ pub fn ReadFile(in_hFile: HANDLE, buffer: []u8, offset: ?u64, io_mode: std.io.Mo .overlapped = OVERLAPPED{ .Internal = 0, .InternalHigh = 0, - .Offset = @truncate(u32, off), - .OffsetHigh = @truncate(u32, off >> 32), + .DUMMYUNIONNAME = .{ + .DUMMYSTRUCTNAME = .{ + .Offset = @truncate(u32, off), + .OffsetHigh = @truncate(u32, off >> 32), + }, + }, .hEvent = null, }, }, @@ -490,8 +494,12 @@ pub fn ReadFile(in_hFile: HANDLE, buffer: []u8, offset: ?u64, io_mode: std.io.Mo overlapped_data = .{ .Internal = 0, .InternalHigh = 0, - .Offset = @truncate(u32, off), - .OffsetHigh = @truncate(u32, off >> 32), + .DUMMYUNIONNAME = .{ + .DUMMYSTRUCTNAME = .{ + .Offset = @truncate(u32, off), + .OffsetHigh = @truncate(u32, off >> 32), + }, + }, .hEvent = null, }; break :blk &overlapped_data; @@ -534,8 +542,12 @@ pub fn WriteFile( .overlapped = OVERLAPPED{ .Internal = 0, .InternalHigh = 0, - .Offset = @truncate(u32, off), - .OffsetHigh = @truncate(u32, off >> 32), + .DUMMYUNIONNAME = .{ + .DUMMYSTRUCTNAME = .{ + .Offset = @truncate(u32, off), + .OffsetHigh = @truncate(u32, off >> 32), + }, + }, .hEvent = null, }, }, @@ -570,8 +582,12 @@ pub fn WriteFile( overlapped_data = .{ .Internal = 0, .InternalHigh = 0, - .Offset = @truncate(u32, off), - .OffsetHigh = @truncate(u32, off >> 32), + .DUMMYUNIONNAME = .{ + .DUMMYSTRUCTNAME = .{ + .Offset = @truncate(u32, off), + .OffsetHigh = @truncate(u32, off >> 32), + }, + }, .hEvent = null, }; break :blk &overlapped_data; diff --git a/lib/std/os/windows/bits.zig b/lib/std/os/windows/bits.zig index 6fff56e71e6c929387af6d765d016e32eedfda24..c95b7fc5ca85c2aa2871a57ce19ead7710cd6d73 100644 --- a/lib/std/os/windows/bits.zig +++ b/lib/std/os/windows/bits.zig @@ -363,12 +363,25 @@ pub const FILE_INFORMATION_CLASS = enum(c_int) { pub const OVERLAPPED = extern struct { Internal: ULONG_PTR, InternalHigh: ULONG_PTR, - Offset: DWORD, - OffsetHigh: DWORD, + DUMMYUNIONNAME: extern union { + DUMMYSTRUCTNAME: extern struct { + Offset: DWORD, + OffsetHigh: DWORD, + }, + Pointer: ?PVOID, + }, hEvent: ?HANDLE, }; pub const LPOVERLAPPED = *OVERLAPPED; +pub const OVERLAPPED_ENTRY = extern struct { + lpCompletionKey: ULONG_PTR, + lpOverlapped: LPOVERLAPPED, + Internal: ULONG_PTR, + dwNumberOfBytesTransferred: DWORD, +}; +pub const LPOVERLAPPED_ENTRY = *OVERLAPPED_ENTRY; + pub const MAX_PATH = 260; // TODO issue #305 -- 2.54.0