143 lines
5.5 KiB
C
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);
|