Files
nt-lite/code/public/ntlite/console_service.h
T

143 lines
5.5 KiB
C

// Native console service protocol and client helpers.
#pragma once
#include <stddef.h>
#include <stdint.h>
#include <ntlite/handle.h>
#include <ntlite/input.h>
#include <ntlite/status.h>
#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);