Something went wrong. Try again.
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140const std = @import("std");const windows = std.os.windows;
// Export any constants or functions we need from the Windows API so// we can just import one file.pub const kernel32 = windows.kernel32;pub const unexpectedError = windows.unexpectedError;pub const OpenFile = windows.OpenFile;pub const CloseHandle = windows.CloseHandle;pub const GetCurrentProcessId = windows.GetCurrentProcessId;pub const SetHandleInformation = windows.SetHandleInformation;pub const DWORD = windows.DWORD;pub const FILE_ATTRIBUTE_NORMAL = windows.FILE_ATTRIBUTE_NORMAL;pub const FILE_FLAG_OVERLAPPED = windows.FILE_FLAG_OVERLAPPED;pub const FILE_SHARE_READ = windows.FILE_SHARE_READ;pub const GENERIC_READ = windows.GENERIC_READ;pub const HANDLE = windows.HANDLE;pub const HANDLE_FLAG_INHERIT = windows.HANDLE_FLAG_INHERIT;pub const INFINITE = windows.INFINITE;pub const INVALID_HANDLE_VALUE = windows.INVALID_HANDLE_VALUE;pub const MAX_PATH = windows.MAX_PATH;pub const OPEN_EXISTING = windows.OPEN_EXISTING;pub const PIPE_ACCESS_OUTBOUND = windows.PIPE_ACCESS_OUTBOUND;pub const PIPE_TYPE_BYTE = windows.PIPE_TYPE_BYTE;pub const PROCESS_INFORMATION = windows.PROCESS_INFORMATION;pub const S_OK = windows.S_OK;pub const SECURITY_ATTRIBUTES = windows.SECURITY_ATTRIBUTES;pub const STARTUPINFOW = windows.STARTUPINFOW;pub const STARTF_USESTDHANDLES = windows.STARTF_USESTDHANDLES;pub const SYNCHRONIZE = windows.SYNCHRONIZE;pub const WAIT_FAILED = windows.WAIT_FAILED;pub const FALSE = windows.FALSE;pub const TRUE = windows.TRUE;
pub const exp = struct { pub const HPCON = windows.LPVOID;
pub const CREATE_UNICODE_ENVIRONMENT = 0x00000400; pub const EXTENDED_STARTUPINFO_PRESENT = 0x00080000; pub const LPPROC_THREAD_ATTRIBUTE_LIST = ?*anyopaque; pub const FILE_FLAG_FIRST_PIPE_INSTANCE = 0x00080000;
pub const STATUS_PENDING = 0x00000103; pub const STILL_ACTIVE = STATUS_PENDING;
pub const STARTUPINFOEX = extern struct { StartupInfo: windows.STARTUPINFOW, lpAttributeList: LPPROC_THREAD_ATTRIBUTE_LIST, };
pub const kernel32 = struct { pub extern "kernel32" fn CreatePipe( hReadPipe: *windows.HANDLE, hWritePipe: *windows.HANDLE, lpPipeAttributes: ?*const windows.SECURITY_ATTRIBUTES, nSize: windows.DWORD, ) callconv(.winapi) windows.BOOL; pub extern "kernel32" fn CreatePseudoConsole( size: windows.COORD, hInput: windows.HANDLE, hOutput: windows.HANDLE, dwFlags: windows.DWORD, phPC: *HPCON, ) callconv(.winapi) windows.HRESULT; pub extern "kernel32" fn ResizePseudoConsole(hPC: HPCON, size: windows.COORD) callconv(.winapi) windows.HRESULT; pub extern "kernel32" fn ClosePseudoConsole(hPC: HPCON) callconv(.winapi) void; pub extern "kernel32" fn InitializeProcThreadAttributeList( lpAttributeList: LPPROC_THREAD_ATTRIBUTE_LIST, dwAttributeCount: windows.DWORD, dwFlags: windows.DWORD, lpSize: *windows.SIZE_T, ) callconv(.winapi) windows.BOOL; pub extern "kernel32" fn UpdateProcThreadAttribute( lpAttributeList: LPPROC_THREAD_ATTRIBUTE_LIST, dwFlags: windows.DWORD, Attribute: windows.DWORD_PTR, lpValue: windows.PVOID, cbSize: windows.SIZE_T, lpPreviousValue: ?windows.PVOID, lpReturnSize: ?*windows.SIZE_T, ) callconv(.winapi) windows.BOOL; pub extern "kernel32" fn PeekNamedPipe( hNamedPipe: windows.HANDLE, lpBuffer: ?windows.LPVOID, nBufferSize: windows.DWORD, lpBytesRead: ?*windows.DWORD, lpTotalBytesAvail: ?*windows.DWORD, lpBytesLeftThisMessage: ?*windows.DWORD, ) callconv(.winapi) windows.BOOL; // Duplicated here because lpCommandLine is not marked optional in zig std pub extern "kernel32" fn CreateProcessW( lpApplicationName: ?windows.LPWSTR, lpCommandLine: ?windows.LPWSTR, lpProcessAttributes: ?*windows.SECURITY_ATTRIBUTES, lpThreadAttributes: ?*windows.SECURITY_ATTRIBUTES, bInheritHandles: windows.BOOL, dwCreationFlags: windows.DWORD, lpEnvironment: ?*anyopaque, lpCurrentDirectory: ?windows.LPWSTR, lpStartupInfo: *windows.STARTUPINFOW, lpProcessInformation: *windows.PROCESS_INFORMATION, ) callconv(.winapi) windows.BOOL; /// https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-getcomputernamea pub extern "kernel32" fn GetComputerNameA( lpBuffer: windows.LPSTR, nSize: *windows.DWORD, ) callconv(.winapi) windows.BOOL; /// https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-gettemppathw pub extern "kernel32" fn GetTempPathW( nBufferLength: windows.DWORD, lpBuffer: windows.LPWSTR, ) callconv(.winapi) windows.DWORD; };
pub const PROC_THREAD_ATTRIBUTE_NUMBER = 0x0000FFFF; pub const PROC_THREAD_ATTRIBUTE_THREAD = 0x00010000; pub const PROC_THREAD_ATTRIBUTE_INPUT = 0x00020000; pub const PROC_THREAD_ATTRIBUTE_ADDITIVE = 0x00040000;
pub const ProcThreadAttributeNumber = enum(windows.DWORD) { ProcThreadAttributePseudoConsole = 22, _, };
/// Corresponds to the ProcThreadAttributeValue define in WinBase.h pub fn ProcThreadAttributeValue( comptime attribute: ProcThreadAttributeNumber, comptime thread: bool, comptime input: bool, comptime additive: bool, ) windows.DWORD { return (@intFromEnum(attribute) & PROC_THREAD_ATTRIBUTE_NUMBER) | (if (thread) PROC_THREAD_ATTRIBUTE_THREAD else 0) | (if (input) PROC_THREAD_ATTRIBUTE_INPUT else 0) | (if (additive) PROC_THREAD_ATTRIBUTE_ADDITIVE else 0); }
pub const PROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE = ProcThreadAttributeValue(.ProcThreadAttributePseudoConsole, false, true, false);};