const std = @import("std"); const isWindows = @import("builtin").os.tag == .windows; const windows = std.os.windows; const WINAPI = windows.WINAPI; const HANDLE = windows.HANDLE; const BOOL = windows.BOOL; const DWORD = windows.DWORD; const LONG = windows.LONG; const ULONG = windows.ULONG; const ULONG_PTR = windows.ULONG_PTR; const SIZE_T = windows.SIZE_T; const PVOID = windows.PVOID; const FALSE = windows.FALSE; const TRUE = windows.TRUE; const NTSTATUS = windows.NTSTATUS; pub const CLIENT_ID = extern struct { UniqueProcess: HANDLE, UniqueThread: HANDLE, }; pub const PORT_MESSAGE = extern struct { u1: extern union { s1: extern struct { DataLength: c_short, TotalLength: c_short, }, Length: ULONG, }, u2: extern union { s2: extern struct { Type: c_short, DataInfoOffset: c_short, }, ZeroInit: ULONG, }, pad_0: extern union { ClientId: CLIENT_ID, pad: f64, }, MessageId: ULONG, pad_1: extern union { ClientViewSize: SIZE_T, CallbackId: ULONG, }, }; pub const CSR_CAPTURE_BUFFER = extern struct { Size: ULONG, PreviousCaptureBuffer: *CSR_CAPTURE_BUFFER, PointerCount: ULONG, BufferEnd: PVOID, PointerOffsetsArray: [1]ULONG_PTR, }; pub const CSR_API_NUMBER = ULONG; pub const CONSOLE_GETSETCONSOLEMODE = extern struct { ConsoleHandle: HANDLE, Handle: HANDLE, Mode: ULONG, }; pub const Console_Api_Message = extern struct { Header: PORT_MESSAGE, CsrCaptureData: *CSR_CAPTURE_BUFFER, ApiNumber: CSR_API_NUMBER, Status: NTSTATUS, Reserved: ULONG, Data: extern union { ConsoleModeRequest: CONSOLE_GETSETCONSOLEMODE, }, }; pub const CSR_API_CONNECTINFO = extern struct { ServerId: ULONG, ConnectionInfo: PVOID, ConnectionInfoSize: ULONG, }; pub const CSR_CLIENT_CONNECT = extern struct { Size: ULONG, PreviousCaptureBuffer: *CSR_CAPTURE_BUFFER, PointerCount: ULONG, BufferEnd: PVOID, PointerOffsetsArray: [1]ULONG_PTR, }; pub const CSR_API_MESSAGE = extern struct { Header: PORT_MESSAGE, pad: extern union { ConnectionInfo: CSR_API_CONNECTINFO, pad: extern struct { CsrCaptureData: *CSR_CAPTURE_BUFFER, ApiNumber: CSR_API_NUMBER, Status: NTSTATUS, Reserved: ULONG, Data: extern union { CsrClientConnect: CSR_CLIENT_CONNECT, ApiMessageData: [39]ULONG_PTR, }, }, }, }; pub fn GetConsoleMode(hConsoleHandle: HANDLE, lpMode: *DWORD) callconv(WINAPI) BOOL { var ApiMessage = @as(Console_Api_Message, undefined); const ConsoleHandle = NtCurrentTeb().ProcessEnvironmentBlock.ProcessParameters.ConsoleHandle; ApiMessage.Data = .{ .ConsoleModeRequest = .{ .ConsoleHandle = ConsoleHandle, .Handle = hConsoleHandle, .Mode = undefined, } }; const CONSRV_SERVERDLL_INDEX = 2; const ConsolepGetMode = todo(); const ApiNumber = CSR_CREATE_API_NUMBER( CONSRV_SERVERDLL_INDEX, ConsolepGetMode, ); CsrClientCallServer( @ptrCast(*CSR_API_MESSAGE, &ApiMessage), null, ApiNumber, @sizeOf(CONSOLE_GETSETCONSOLEMODE), ); if (!NT_SUCCESS(ApiMessage.Status)) { BaseSetLastError(ApiMessage.Status); return FALSE; } lpMode.* = ApiMessage.Data.ConsoleModeRequest.Mode; return TRUE; } pub fn SetConsoleMode(hConsoleHandle: HANDLE, dwMode: DWORD) callconv(WINAPI) BOOL { var ApiMessage = @as(Console_Api_Message, undefined); const ConsoleHandle = NtCurrentTeb().ProcessEnvironmentBlock.ProcessParameters.ConsoleHandle; ApiMessage.Data = .{ .ConsoleModeRequest = .{ .ConsoleHandle = ConsoleHandle, .Handle = hConsoleHandle, .Mode = dwMode, } }; const CONSRV_SERVERDLL_INDEX = 2; const ConsolepSetMode = todo(); const ApiNumber = CSR_CREATE_API_NUMBER( CONSRV_SERVERDLL_INDEX, ConsolepSetMode ); CsrClientCallServer( @ptrCast(*CSR_API_MESSAGE, &ApiMessage), null, ApiNumber, @sizeOf(CONSOLE_GETSETCONSOLEMODE), ); if (!NT_SUCCESS(ApiMessage.Status)) { BaseSetLastError(ApiMessage.Status); return FALSE; } return TRUE; } extern "ntdll" fn CsrClientCallServer( ApiMsg: *CSR_API_MESSAGE, CaptureBuffer: ?PVOID, ApiNumber: ULONG, ApiMessageDataSize: LONG, ) NTSTATUS; extern "ntdll" fn NtCurrentTeb() *todo(.{}); fn BaseSetLastError(status: NTSTATUS) void { todo(status); } fn NT_SUCCESS(status: NTSTATUS) bool { return @enumToInt(status) >= 0; } fn CSR_CREATE_API_NUMBER(ServerId: u16, ApiId: u16) ULONG { return @shlExact(@as(ULONG, ServerId), 16) | @as(ULONG, ApiId); } pub fn main() !void { if (!isWindows) { @compileError("Please compile for windows!"); } _ = SetConsoleMode(std.io.getStdIn().handle, 0x10); } noinline fn todo(_: anytype) noreturn { @panic("Not implemented"); }