// Native console service protocol and client helpers. #pragma once #include #include #include #include #include #define NTL_CONSOLE_PROTOCOL_VERSION 1u #define NTL_CONSOLE_SERVICE_PATH "/Services/Console" #define NTL_CONSOLE_FLAG_NONE 0x00000000u #define NTL_CONSOLE_WRITE_MAX 512u #define NTL_CONSOLE_OP_WRITE 1u #define NTL_CONSOLE_OP_QUERY_INFO 2u #define NTL_CONSOLE_OP_SET_CURSOR 3u #define NTL_CONSOLE_OP_FILL_CHARACTER 4u #define NTL_CONSOLE_OP_FILL_ATTRIBUTE 5u #define NTL_CONSOLE_OP_PUT_CHARACTER 6u #define NTL_CONSOLE_OP_CLEAR 7u #define NTL_CONSOLE_OP_READ_INPUT 8u #define NTL_CONSOLE_OP_PEEK_INPUT 9u #define NTL_CONSOLE_OP_FLUSH_INPUT 10u #define NTL_CONSOLE_OP_WRITE_AT 11u typedef struct NTL_CONSOLE_INFO { uint32_t Size; uint32_t Flags; uint32_t Columns; uint32_t Rows; uint32_t CursorX; uint32_t CursorY; uint16_t Attribute; uint16_t Reserved; uint32_t PixelWidth; uint32_t PixelHeight; uint64_t Generation; } NTL_CONSOLE_INFO; typedef struct NTL_CONSOLE_REQUEST { uint32_t Size; uint32_t Version; uint32_t Operation; uint32_t Flags; uint64_t TimeoutMilliseconds; union { struct { uint32_t Length; char Data[NTL_CONSOLE_WRITE_MAX]; } Write; struct { int32_t X; int32_t Y; } Cursor; struct { int32_t X; int32_t Y; uint32_t Length; char Data[NTL_CONSOLE_WRITE_MAX - 8u]; } WriteAt; struct { char Character; // One legacy ASCII display cell, never one UTF-8 code point. uint8_t Reserved[3]; int32_t X; int32_t Y; uint32_t Length; } FillCharacter; struct { uint16_t Attribute; uint16_t Reserved; int32_t X; int32_t Y; uint32_t Length; } FillAttribute; struct { char Character; // One legacy ASCII display cell, never one UTF-8 code point. uint8_t Reserved[3]; int32_t X; int32_t Y; uint32_t Foreground; uint32_t Background; } PutCharacter; struct { uint32_t Color; } Clear; } Data; } NTL_CONSOLE_REQUEST; typedef struct NTL_CONSOLE_REPLY { uint32_t Size; uint32_t Version; uint32_t Operation; uint32_t Flags; KSTATUS Status; uint32_t Written; INPUT_KEY_RECORD Input; NTL_CONSOLE_INFO Info; } NTL_CONSOLE_REPLY; // RSSRV console IPC layout must agree with every native console client. _Static_assert(sizeof(NTL_CONSOLE_INFO) == 48u, "NTL_CONSOLE_INFO ABI size changed"); _Static_assert(offsetof(NTL_CONSOLE_INFO, Generation) == 40u, "NTL_CONSOLE_INFO generation offset changed"); _Static_assert(sizeof(NTL_CONSOLE_REQUEST) == 544u, "NTL_CONSOLE_REQUEST ABI size changed"); _Static_assert(offsetof(NTL_CONSOLE_REQUEST, Data) == 24u, "NTL_CONSOLE_REQUEST payload offset changed"); _Static_assert(sizeof(NTL_CONSOLE_REPLY) == 80u, "NTL_CONSOLE_REPLY ABI size changed"); _Static_assert(offsetof(NTL_CONSOLE_REPLY, Status) == 16u, "NTL_CONSOLE_REPLY status offset changed"); #if defined(NTL_SYSCALL_STATIC) #define NTL_CONSOLE_API #elif defined(NTL_SYSCALL_BUILD) #define NTL_CONSOLE_API __declspec(dllexport) #else #define NTL_CONSOLE_API #endif NTL_CONSOLE_API KSTATUS NtlConsoleConnect(SYS_HANDLE* sessionOut); NTL_CONSOLE_API KSTATUS NtlConsoleClose(SYS_HANDLE session); NTL_CONSOLE_API KSTATUS NtlConsoleWrite(SYS_HANDLE session, const void* data, size_t length, size_t* writtenOut); NTL_CONSOLE_API KSTATUS NtlConsoleQueryInfo(SYS_HANDLE session, NTL_CONSOLE_INFO* infoOut); // Writes one ASCII text span at fixed console coordinates without moving the logical cursor. NTL_CONSOLE_API KSTATUS NtlConsoleWriteAt(SYS_HANDLE session, int32_t x, int32_t y, const char* text, size_t length, size_t* writtenOut); NTL_CONSOLE_API KSTATUS NtlConsoleSetCursor(SYS_HANDLE session, int32_t x, int32_t y); // Legacy cell operations accept ASCII glyph codes only. Unicode text uses // NtlConsoleWrite's byte stream until the RSSRV text renderer is upgraded. NTL_CONSOLE_API KSTATUS NtlConsoleFillCharacter(SYS_HANDLE session, char character, int32_t x, int32_t y, size_t length, size_t* writtenOut); NTL_CONSOLE_API KSTATUS NtlConsoleFillAttribute(SYS_HANDLE session, uint16_t attribute, int32_t x, int32_t y, size_t length, size_t* writtenOut); NTL_CONSOLE_API KSTATUS NtlConsolePutCharacter(SYS_HANDLE session, char character, int32_t x, int32_t y, uint32_t foreground, uint32_t background); NTL_CONSOLE_API KSTATUS NtlConsoleClear(SYS_HANDLE session, uint32_t color); NTL_CONSOLE_API KSTATUS NtlConsoleReadInput(SYS_HANDLE session, uint64_t timeoutMilliseconds, INPUT_KEY_RECORD* recordOut); NTL_CONSOLE_API KSTATUS NtlConsolePeekInput(SYS_HANDLE session, uint64_t timeoutMilliseconds, INPUT_KEY_RECORD* recordOut); NTL_CONSOLE_API KSTATUS NtlConsoleFlushInput(SYS_HANDLE session); // ASCII-only legacy key convenience function; use NtlConsoleReadInput for key events. NTL_CONSOLE_API KSTATUS NtlConsoleReadCharacter(SYS_HANDLE session, char* characterOut);