[CONSRV] Convenience fixes.

- Simplify screen-buffers initialization.
- Get rid of this CONSOLE_SCREEN_BUFFER_VTBL virtual table.
- Move ConsoleInput to a proper header.
This commit is contained in:
Hermès Bélusca-Maïto 2020-04-12 19:03:30 +02:00
parent 69e565891d
commit 83c238e490
No known key found for this signature in database
GPG key ID: 3B2539C65E7B93D0
6 changed files with 55 additions and 81 deletions

View file

@ -34,10 +34,11 @@ GRAPHICS_BUFFER_Destroy(IN OUT PCONSOLE_SCREEN_BUFFER Buffer);
NTSTATUS NTSTATUS
CONSOLE_SCREEN_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer, CONSOLE_SCREEN_BUFFER_Initialize(
IN PCONSOLE Console, OUT PCONSOLE_SCREEN_BUFFER* Buffer,
IN PCONSOLE_SCREEN_BUFFER_VTBL Vtbl, IN PCONSOLE Console,
IN SIZE_T Size) IN CONSOLE_IO_OBJECT_TYPE Type,
IN SIZE_T Size)
{ {
if (Buffer == NULL || Console == NULL) if (Buffer == NULL || Console == NULL)
return STATUS_INVALID_PARAMETER; return STATUS_INVALID_PARAMETER;
@ -46,32 +47,37 @@ CONSOLE_SCREEN_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer,
if (*Buffer == NULL) return STATUS_INSUFFICIENT_RESOURCES; if (*Buffer == NULL) return STATUS_INSUFFICIENT_RESOURCES;
/* Initialize the header with the default type */ /* Initialize the header with the default type */
ConSrvInitObject(&(*Buffer)->Header, SCREEN_BUFFER, Console); ConSrvInitObject(&(*Buffer)->Header, Type /* SCREEN_BUFFER */, Console);
(*Buffer)->Vtbl = Vtbl;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
VOID VOID
CONSOLE_SCREEN_BUFFER_Destroy(IN OUT PCONSOLE_SCREEN_BUFFER Buffer) CONSOLE_SCREEN_BUFFER_Destroy(IN OUT PCONSOLE_SCREEN_BUFFER Buffer)
{ {
if (Buffer->Header.Type == TEXTMODE_BUFFER) switch (Buffer->Header.Type)
{ {
case TEXTMODE_BUFFER:
TEXTMODE_BUFFER_Destroy(Buffer); TEXTMODE_BUFFER_Destroy(Buffer);
} break;
else if (Buffer->Header.Type == GRAPHICS_BUFFER)
{ case GRAPHICS_BUFFER:
GRAPHICS_BUFFER_Destroy(Buffer); GRAPHICS_BUFFER_Destroy(Buffer);
} break;
else if (Buffer->Header.Type == SCREEN_BUFFER)
case SCREEN_BUFFER:
{ {
/* Free the palette handle */ /* Free the palette handle */
if (Buffer->PaletteHandle != NULL) DeleteObject(Buffer->PaletteHandle); if (Buffer->PaletteHandle != NULL)
DeleteObject(Buffer->PaletteHandle);
/* Free the screen buffer memory */ /* Free the screen buffer memory */
ConsoleFreeHeap(Buffer); ConsoleFreeHeap(Buffer);
break;
}
default:
break;
} }
// else
// do_nothing;
} }
// ConDrvCreateConsoleScreenBuffer // ConDrvCreateConsoleScreenBuffer
@ -94,18 +100,19 @@ ConDrvCreateScreenBuffer(OUT PCONSOLE_SCREEN_BUFFER* Buffer,
if (ProcessHandle == NULL) if (ProcessHandle == NULL)
ProcessHandle = NtCurrentProcess(); ProcessHandle = NtCurrentProcess();
if (BufferType == CONSOLE_TEXTMODE_BUFFER) switch (BufferType)
{ {
case CONSOLE_TEXTMODE_BUFFER:
Status = TEXTMODE_BUFFER_Initialize(Buffer, Console, ProcessHandle, Status = TEXTMODE_BUFFER_Initialize(Buffer, Console, ProcessHandle,
(PTEXTMODE_BUFFER_INFO)ScreenBufferInfo); (PTEXTMODE_BUFFER_INFO)ScreenBufferInfo);
} break;
else if (BufferType == CONSOLE_GRAPHICS_BUFFER)
{ case CONSOLE_GRAPHICS_BUFFER:
Status = GRAPHICS_BUFFER_Initialize(Buffer, Console, ProcessHandle, Status = GRAPHICS_BUFFER_Initialize(Buffer, Console, ProcessHandle,
(PGRAPHICS_BUFFER_INFO)ScreenBufferInfo); (PGRAPHICS_BUFFER_INFO)ScreenBufferInfo);
} break;
else
{ default:
/* Never ever go there!! */ /* Never ever go there!! */
ASSERT(FALSE); ASSERT(FALSE);
} }

View file

@ -18,24 +18,13 @@
/* PRIVATE FUNCTIONS **********************************************************/ /* PRIVATE FUNCTIONS **********************************************************/
CONSOLE_IO_OBJECT_TYPE
GRAPHICS_BUFFER_GetType(PCONSOLE_SCREEN_BUFFER This)
{
// return This->Header.Type;
return GRAPHICS_BUFFER;
}
static CONSOLE_SCREEN_BUFFER_VTBL GraphicsVtbl =
{
GRAPHICS_BUFFER_GetType,
};
NTSTATUS NTSTATUS
CONSOLE_SCREEN_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer, CONSOLE_SCREEN_BUFFER_Initialize(
IN PCONSOLE Console, OUT PCONSOLE_SCREEN_BUFFER* Buffer,
IN PCONSOLE_SCREEN_BUFFER_VTBL Vtbl, IN PCONSOLE Console,
IN SIZE_T Size); IN CONSOLE_IO_OBJECT_TYPE Type,
IN SIZE_T Size);
VOID VOID
CONSOLE_SCREEN_BUFFER_Destroy(IN OUT PCONSOLE_SCREEN_BUFFER Buffer); CONSOLE_SCREEN_BUFFER_Destroy(IN OUT PCONSOLE_SCREEN_BUFFER Buffer);
@ -59,10 +48,9 @@ GRAPHICS_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer,
Status = CONSOLE_SCREEN_BUFFER_Initialize((PCONSOLE_SCREEN_BUFFER*)&NewBuffer, Status = CONSOLE_SCREEN_BUFFER_Initialize((PCONSOLE_SCREEN_BUFFER*)&NewBuffer,
Console, Console,
&GraphicsVtbl, GRAPHICS_BUFFER,
sizeof(GRAPHICS_SCREEN_BUFFER)); sizeof(GRAPHICS_SCREEN_BUFFER));
if (!NT_SUCCESS(Status)) return Status; if (!NT_SUCCESS(Status)) return Status;
NewBuffer->Header.Type = GRAPHICS_BUFFER;
/* /*
* Remember the handle to the process so that we can close or unmap * Remember the handle to the process so that we can close or unmap

View file

@ -36,28 +36,16 @@ do { \
/* PRIVATE FUNCTIONS **********************************************************/ /* PRIVATE FUNCTIONS **********************************************************/
CONSOLE_IO_OBJECT_TYPE
TEXTMODE_BUFFER_GetType(PCONSOLE_SCREEN_BUFFER This)
{
// return This->Header.Type;
return TEXTMODE_BUFFER;
}
static CONSOLE_SCREEN_BUFFER_VTBL TextVtbl =
{
TEXTMODE_BUFFER_GetType,
};
/*static*/ VOID /*static*/ VOID
ClearLineBuffer(PTEXTMODE_SCREEN_BUFFER Buff); ClearLineBuffer(PTEXTMODE_SCREEN_BUFFER Buff);
NTSTATUS NTSTATUS
CONSOLE_SCREEN_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer, CONSOLE_SCREEN_BUFFER_Initialize(
IN PCONSOLE Console, OUT PCONSOLE_SCREEN_BUFFER* Buffer,
IN PCONSOLE_SCREEN_BUFFER_VTBL Vtbl, IN PCONSOLE Console,
IN SIZE_T Size); IN CONSOLE_IO_OBJECT_TYPE Type,
IN SIZE_T Size);
VOID VOID
CONSOLE_SCREEN_BUFFER_Destroy(IN OUT PCONSOLE_SCREEN_BUFFER Buffer); CONSOLE_SCREEN_BUFFER_Destroy(IN OUT PCONSOLE_SCREEN_BUFFER Buffer);
@ -86,10 +74,9 @@ TEXTMODE_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer,
Status = CONSOLE_SCREEN_BUFFER_Initialize((PCONSOLE_SCREEN_BUFFER*)&NewBuffer, Status = CONSOLE_SCREEN_BUFFER_Initialize((PCONSOLE_SCREEN_BUFFER*)&NewBuffer,
Console, Console,
&TextVtbl, TEXTMODE_BUFFER,
sizeof(TEXTMODE_SCREEN_BUFFER)); sizeof(TEXTMODE_SCREEN_BUFFER));
if (!NT_SUCCESS(Status)) return Status; if (!NT_SUCCESS(Status)) return Status;
NewBuffer->Header.Type = TEXTMODE_BUFFER;
NewBuffer->Buffer = ConsoleAllocHeap(HEAP_ZERO_MEMORY, NewBuffer->Buffer = ConsoleAllocHeap(HEAP_ZERO_MEMORY,
TextModeInfo->ScreenBufferSize.X * TextModeInfo->ScreenBufferSize.X *

View file

@ -9,6 +9,13 @@
#pragma once #pragma once
typedef struct ConsoleInput_t
{
LIST_ENTRY ListEntry;
INPUT_RECORD InputEvent;
} ConsoleInput;
NTSTATUS NTAPI NTSTATUS NTAPI
ConDrvInitInputBuffer(IN PCONSOLE Console, ConDrvInitInputBuffer(IN PCONSOLE Console,
IN ULONG InputBufferSize); IN ULONG InputBufferSize);

View file

@ -54,12 +54,6 @@ typedef struct _CONSOLE_PROCESS_DATA
// LPTHREAD_START_ROUTINE ImeRoutine; // LPTHREAD_START_ROUTINE ImeRoutine;
} CONSOLE_PROCESS_DATA, *PCONSOLE_PROCESS_DATA; } CONSOLE_PROCESS_DATA, *PCONSOLE_PROCESS_DATA;
typedef struct ConsoleInput_t
{
LIST_ENTRY ListEntry;
INPUT_RECORD InputEvent;
} ConsoleInput;
#include "include/conio.h" #include "include/conio.h"
#include "include/conio_winsrv.h" #include "include/conio_winsrv.h"

View file

@ -51,20 +51,11 @@ typedef struct _CONSOLE_IO_OBJECT
* See conoutput.c for the implementation * See conoutput.c for the implementation
*/ */
typedef struct _CONSOLE_SCREEN_BUFFER CONSOLE_SCREEN_BUFFER, #define GetType(This) (((PCONSOLE_SCREEN_BUFFER)(This))->Header.Type)
*PCONSOLE_SCREEN_BUFFER;
typedef struct _CONSOLE_SCREEN_BUFFER_VTBL typedef struct _CONSOLE_SCREEN_BUFFER
{
CONSOLE_IO_OBJECT_TYPE (*GetType)(PCONSOLE_SCREEN_BUFFER This);
} CONSOLE_SCREEN_BUFFER_VTBL, *PCONSOLE_SCREEN_BUFFER_VTBL;
#define GetType(This) (This)->Vtbl->GetType(This)
struct _CONSOLE_SCREEN_BUFFER
{ {
CONSOLE_IO_OBJECT Header; /* Object header - MUST BE IN FIRST PLACE */ CONSOLE_IO_OBJECT Header; /* Object header - MUST BE IN FIRST PLACE */
PCONSOLE_SCREEN_BUFFER_VTBL Vtbl; /* Virtual table */
LIST_ENTRY ListEntry; /* Entry in console's list of buffers */ LIST_ENTRY ListEntry; /* Entry in console's list of buffers */
@ -90,7 +81,7 @@ struct _CONSOLE_SCREEN_BUFFER
// USHORT ScreenDefaultAttrib; /* Default screen char attribute */ // USHORT ScreenDefaultAttrib; /* Default screen char attribute */
// USHORT PopupDefaultAttrib; /* Default popup char attribute */ // USHORT PopupDefaultAttrib; /* Default popup char attribute */
USHORT Mode; /* Output buffer modes */ USHORT Mode; /* Output buffer modes */
}; } CONSOLE_SCREEN_BUFFER, *PCONSOLE_SCREEN_BUFFER;
@ -182,8 +173,6 @@ typedef struct _CONSOLE_INPUT_BUFFER
} CONSOLE_INPUT_BUFFER, *PCONSOLE_INPUT_BUFFER; } CONSOLE_INPUT_BUFFER, *PCONSOLE_INPUT_BUFFER;
typedef struct _TERMINAL TERMINAL, *PTERMINAL;
/* /*
* Structure used to hold console information * Structure used to hold console information
*/ */
@ -204,6 +193,8 @@ typedef struct _CONSOLE_INFO
} CONSOLE_INFO, *PCONSOLE_INFO; } CONSOLE_INFO, *PCONSOLE_INFO;
typedef struct _TERMINAL TERMINAL, *PTERMINAL;
typedef struct _TERMINAL_VTBL typedef struct _TERMINAL_VTBL
{ {
/* /*