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

View file

@ -18,24 +18,13 @@
/* 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
CONSOLE_SCREEN_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer,
IN PCONSOLE Console,
IN PCONSOLE_SCREEN_BUFFER_VTBL Vtbl,
IN SIZE_T Size);
CONSOLE_SCREEN_BUFFER_Initialize(
OUT PCONSOLE_SCREEN_BUFFER* Buffer,
IN PCONSOLE Console,
IN CONSOLE_IO_OBJECT_TYPE Type,
IN SIZE_T Size);
VOID
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,
Console,
&GraphicsVtbl,
GRAPHICS_BUFFER,
sizeof(GRAPHICS_SCREEN_BUFFER));
if (!NT_SUCCESS(Status)) return Status;
NewBuffer->Header.Type = GRAPHICS_BUFFER;
/*
* Remember the handle to the process so that we can close or unmap

View file

@ -36,28 +36,16 @@ do { \
/* 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
ClearLineBuffer(PTEXTMODE_SCREEN_BUFFER Buff);
NTSTATUS
CONSOLE_SCREEN_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer,
IN PCONSOLE Console,
IN PCONSOLE_SCREEN_BUFFER_VTBL Vtbl,
IN SIZE_T Size);
CONSOLE_SCREEN_BUFFER_Initialize(
OUT PCONSOLE_SCREEN_BUFFER* Buffer,
IN PCONSOLE Console,
IN CONSOLE_IO_OBJECT_TYPE Type,
IN SIZE_T Size);
VOID
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,
Console,
&TextVtbl,
TEXTMODE_BUFFER,
sizeof(TEXTMODE_SCREEN_BUFFER));
if (!NT_SUCCESS(Status)) return Status;
NewBuffer->Header.Type = TEXTMODE_BUFFER;
NewBuffer->Buffer = ConsoleAllocHeap(HEAP_ZERO_MEMORY,
TextModeInfo->ScreenBufferSize.X *

View file

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

View file

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

View file

@ -51,20 +51,11 @@ typedef struct _CONSOLE_IO_OBJECT
* See conoutput.c for the implementation
*/
typedef struct _CONSOLE_SCREEN_BUFFER CONSOLE_SCREEN_BUFFER,
*PCONSOLE_SCREEN_BUFFER;
#define GetType(This) (((PCONSOLE_SCREEN_BUFFER)(This))->Header.Type)
typedef struct _CONSOLE_SCREEN_BUFFER_VTBL
{
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
typedef struct _CONSOLE_SCREEN_BUFFER
{
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 */
@ -90,7 +81,7 @@ struct _CONSOLE_SCREEN_BUFFER
// USHORT ScreenDefaultAttrib; /* Default screen char attribute */
// USHORT PopupDefaultAttrib; /* Default popup char attribute */
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;
typedef struct _TERMINAL TERMINAL, *PTERMINAL;
/*
* Structure used to hold console information
*/
@ -204,6 +193,8 @@ typedef struct _CONSOLE_INFO
} CONSOLE_INFO, *PCONSOLE_INFO;
typedef struct _TERMINAL TERMINAL, *PTERMINAL;
typedef struct _TERMINAL_VTBL
{
/*