NTSTATUS
TEXTMODE_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer,
- IN OUT PCONSOLE Console,
+ IN PCONSOLE Console,
+ IN HANDLE ProcessHandle,
IN PTEXTMODE_BUFFER_INFO TextModeInfo);
NTSTATUS
GRAPHICS_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer,
- IN OUT PCONSOLE Console,
+ IN PCONSOLE Console,
+ IN HANDLE ProcessHandle,
IN PGRAPHICS_BUFFER_INFO GraphicsInfo);
VOID
NTSTATUS
CONSOLE_SCREEN_BUFFER_Initialize(OUT PCONSOLE_SCREEN_BUFFER* Buffer,
- IN OUT PCONSOLE Console,
+ IN PCONSOLE Console,
+ IN PCONSOLE_SCREEN_BUFFER_VTBL Vtbl,
IN SIZE_T Size)
{
if (Buffer == NULL || Console == NULL)
/* Initialize the header with the default type */
ConSrvInitObject(&(*Buffer)->Header, SCREEN_BUFFER, Console);
- (*Buffer)->Vtbl = NULL;
+ (*Buffer)->Vtbl = Vtbl;
return STATUS_SUCCESS;
}
}
// ConDrvCreateConsoleScreenBuffer
-NTSTATUS FASTCALL
+NTSTATUS
ConDrvCreateScreenBuffer(OUT PCONSOLE_SCREEN_BUFFER* Buffer,
- IN OUT PCONSOLE Console,
+ IN PCONSOLE Console,
+ IN HANDLE ProcessHandle OPTIONAL,
IN ULONG BufferType,
IN PVOID ScreenBufferInfo)
{
return STATUS_INVALID_PARAMETER;
}
+ /* Use the current process if ProcessHandle is NULL */
+ if (ProcessHandle == NULL)
+ ProcessHandle = NtCurrentProcess();
+
if (BufferType == CONSOLE_TEXTMODE_BUFFER)
{
- Status = TEXTMODE_BUFFER_Initialize(Buffer, Console,
+ Status = TEXTMODE_BUFFER_Initialize(Buffer, Console, ProcessHandle,
(PTEXTMODE_BUFFER_INFO)ScreenBufferInfo);
}
else if (BufferType == CONSOLE_GRAPHICS_BUFFER)
{
- Status = GRAPHICS_BUFFER_Initialize(Buffer, Console,
+ Status = GRAPHICS_BUFFER_Initialize(Buffer, Console, ProcessHandle,
(PGRAPHICS_BUFFER_INFO)ScreenBufferInfo);
}
else
ConioSetActiveScreenBuffer(PCONSOLE_SCREEN_BUFFER Buffer);
VOID NTAPI
-ConioDeleteScreenBuffer(PCONSOLE_SCREEN_BUFFER Buffer)
+ConDrvDeleteScreenBuffer(PCONSOLE_SCREEN_BUFFER Buffer)
{
PCONSOLE Console = Buffer->Header.Console;
PCONSOLE_SCREEN_BUFFER NewBuffer;
CONSOLE_SCREEN_BUFFER_Destroy(Buffer);
}
-VOID FASTCALL
+VOID
ConioDrawConsole(PCONSOLE Console)
{
SMALL_RECT Region;
if (ActiveBuffer)
{
- ConioInitRect(&Region, 0, 0, ActiveBuffer->ViewSize.Y - 1, ActiveBuffer->ViewSize.X - 1);
+ ConioInitRect(&Region, 0, 0,
+ ActiveBuffer->ViewSize.Y - 1, ActiveBuffer->ViewSize.X - 1);
TermDrawRegion(Console, &Region);
}
}
if (Buffer == Console->ActiveBuffer) return STATUS_SUCCESS;
/* If old buffer has no handles, it's now unreferenced */
- if (Console->ActiveBuffer->Header.HandleCount == 0)
+ if (Console->ActiveBuffer->Header.ReferenceCount == 0)
{
- ConioDeleteScreenBuffer(Console->ActiveBuffer);
+ ConDrvDeleteScreenBuffer(Console->ActiveBuffer);
}
/* Tie console to new buffer and signal the change to the frontend */