* PURPOSE: Implementation of text-mode consoles
*/
-#include "w32csr.h"
-
#define NDEBUG
+#include "w32csr.h"
#include <debug.h>
CRITICAL_SECTION ActiveConsoleLock;
static LRESULT CALLBACK
TuiConsoleWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
- if (msg == WM_ACTIVATE)
+ if (msg == WM_ACTIVATE)
{
- CHECKPOINT1;
- if (LOWORD(wParam) != WA_INACTIVE)
+ if (LOWORD(wParam) != WA_INACTIVE)
{
- CHECKPOINT1;
- SetFocus(hWnd);
- ConioDrawConsole(ActiveConsole);
+ SetFocus(hWnd);
+ ConioDrawConsole(ActiveConsole);
}
}
- return DefWindowProcW(hWnd, msg, wParam, lParam);
+ return DefWindowProcW(hWnd, msg, wParam, lParam);
+}
+
+static BOOL FASTCALL
+TuiStartService(LPCWSTR lpServiceName)
+{
+ SC_HANDLE hSCManager = NULL;
+ SC_HANDLE hService = NULL;
+ BOOL ret = FALSE;
+
+ hSCManager = OpenSCManagerW(NULL, NULL, 0);
+ if (hSCManager == NULL)
+ goto cleanup;
+
+ hService = OpenServiceW(hSCManager, lpServiceName, SERVICE_START);
+ if (hService == NULL)
+ goto cleanup;
+
+ ret = StartServiceW(hService, 0, NULL);
+ if (!ret)
+ goto cleanup;
+
+ ret = TRUE;
+
+cleanup:
+ if (hSCManager != NULL)
+ CloseServiceHandle(hSCManager);
+ if (hService != NULL)
+ CloseServiceHandle(hService);
+ return ret;
}
static BOOL FASTCALL
-TuiInit(VOID)
+TuiInit(DWORD OemCP)
{
- CONSOLE_SCREEN_BUFFER_INFO ScrInfo;
- DWORD BytesReturned;
- WNDCLASSEXW wc;
+ CONSOLE_SCREEN_BUFFER_INFO ScrInfo;
+ DWORD BytesReturned;
+ WNDCLASSEXW wc;
+ USHORT TextAttribute = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED;
+
+ TuiStartService(L"Blue");
- ConsoleDeviceHandle = CreateFileW(L"\\\\.\\BlueScreen", FILE_ALL_ACCESS, 0, NULL,
- OPEN_EXISTING, 0, NULL);
- if (INVALID_HANDLE_VALUE == ConsoleDeviceHandle)
+ ConsoleDeviceHandle = CreateFileW(L"\\\\.\\BlueScreen", FILE_ALL_ACCESS, 0, NULL,
+ OPEN_EXISTING, 0, NULL);
+ if (INVALID_HANDLE_VALUE == ConsoleDeviceHandle)
{
- DPRINT1("Failed to open BlueScreen.\n");
- return FALSE;
+ DPRINT1("Failed to open BlueScreen.\n");
+ return FALSE;
}
- ActiveConsole = NULL;
- InitializeCriticalSection(&ActiveConsoleLock);
- if (! DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_GET_SCREEN_BUFFER_INFO,
- NULL, 0, &ScrInfo, sizeof(ScrInfo), &BytesReturned, NULL))
+ if (!DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_LOADFONT,
+ &OemCP, sizeof(OemCP), NULL, 0,
+ &BytesReturned, NULL))
{
- DPRINT1("Failed to get console info\n");
- return FALSE;
+ DPRINT1("Failed to load the font for codepage %d\n", OemCP);
+ /* Let's suppose the font is good enough to continue */
}
- PhysicalConsoleSize = ScrInfo.dwSize;
-
- RtlZeroMemory(&wc, sizeof(WNDCLASSEXW));
- wc.cbSize = sizeof(WNDCLASSEXW);
- wc.lpszClassName = L"TuiConsoleWindowClass";
- wc.lpfnWndProc = TuiConsoleWndProc;
- wc.hInstance = (HINSTANCE) GetModuleHandleW(NULL);
- if (RegisterClassExW(&wc) == 0)
+
+ if (!DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_SET_TEXT_ATTRIBUTE,
+ &TextAttribute, sizeof(TextAttribute), NULL, 0,
+ &BytesReturned, NULL))
{
- DPRINT1("Failed to register console wndproc\n");
- return FALSE;
+ DPRINT1("Failed to set text attribute\n");
}
- return TRUE;
+ ActiveConsole = NULL;
+ InitializeCriticalSection(&ActiveConsoleLock);
+ if (! DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_GET_SCREEN_BUFFER_INFO,
+ NULL, 0, &ScrInfo, sizeof(ScrInfo), &BytesReturned, NULL))
+ {
+ DPRINT1("Failed to get console info\n");
+ return FALSE;
+ }
+ PhysicalConsoleSize = ScrInfo.dwSize;
+
+ RtlZeroMemory(&wc, sizeof(WNDCLASSEXW));
+ wc.cbSize = sizeof(WNDCLASSEXW);
+ wc.lpszClassName = L"TuiConsoleWindowClass";
+ wc.lpfnWndProc = TuiConsoleWndProc;
+ wc.hInstance = (HINSTANCE) GetModuleHandleW(NULL);
+ if (RegisterClassExW(&wc) == 0)
+ {
+ DPRINT1("Failed to register console wndproc\n");
+ return FALSE;
+ }
+
+ return TRUE;
}
-static VOID STDCALL
+static VOID WINAPI
TuiInitScreenBuffer(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buffer)
{
- Buffer->DefaultAttrib = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | BACKGROUND_BLUE;
+ Buffer->DefaultAttrib = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED;
}
static void FASTCALL
-TuiCopyRect(char *Dest, PCSRSS_SCREEN_BUFFER Buff, RECT *Region)
+TuiCopyRect(char *Dest, PCSRSS_SCREEN_BUFFER Buff, SMALL_RECT *Region)
{
- UINT SrcDelta, DestDelta;
- LONG i;
- PBYTE Src, SrcEnd;
-
- Src = ConioCoordToPointer(Buff, Region->left, Region->top);
- SrcDelta = Buff->MaxX * 2;
- SrcEnd = Buff->Buffer + Buff->MaxY * Buff->MaxX * 2;
- DestDelta = ConioRectWidth(Region) * 2;
- for (i = Region->top; i <= Region->bottom; i++)
+ UINT SrcDelta, DestDelta;
+ LONG i;
+ PBYTE Src, SrcEnd;
+
+ Src = ConioCoordToPointer(Buff, Region->Left, Region->Top);
+ SrcDelta = Buff->MaxX * 2;
+ SrcEnd = Buff->Buffer + Buff->MaxY * Buff->MaxX * 2;
+ DestDelta = ConioRectWidth(Region) * 2;
+ for (i = Region->Top; i <= Region->Bottom; i++)
{
- memcpy(Dest, Src, DestDelta);
- Src += SrcDelta;
- if (SrcEnd <= Src)
+ memcpy(Dest, Src, DestDelta);
+ Src += SrcDelta;
+ if (SrcEnd <= Src)
{
- Src -= Buff->MaxY * Buff->MaxX * 2;
+ Src -= Buff->MaxY * Buff->MaxX * 2;
}
- Dest += DestDelta;
+ Dest += DestDelta;
}
}
-static VOID STDCALL
-TuiDrawRegion(PCSRSS_CONSOLE Console, RECT *Region)
+static VOID WINAPI
+TuiDrawRegion(PCSRSS_CONSOLE Console, SMALL_RECT *Region)
{
- DWORD BytesReturned;
- PCSRSS_SCREEN_BUFFER Buff = Console->ActiveBuffer;
- PCONSOLE_DRAW ConsoleDraw;
- UINT ConsoleDrawSize;
+ DWORD BytesReturned;
+ PCSRSS_SCREEN_BUFFER Buff = Console->ActiveBuffer;
+ PCONSOLE_DRAW ConsoleDraw;
+ UINT ConsoleDrawSize;
- if (ActiveConsole != Console)
+ if (ActiveConsole != Console)
{
- return;
+ return;
}
- ConsoleDrawSize = sizeof(CONSOLE_DRAW) +
- (ConioRectWidth(Region) * ConioRectHeight(Region)) * 2;
- ConsoleDraw = HeapAlloc(Win32CsrApiHeap, 0, ConsoleDrawSize);
- if (NULL == ConsoleDraw)
+ ConsoleDrawSize = sizeof(CONSOLE_DRAW) +
+ (ConioRectWidth(Region) * ConioRectHeight(Region)) * 2;
+ ConsoleDraw = HeapAlloc(Win32CsrApiHeap, 0, ConsoleDrawSize);
+ if (NULL == ConsoleDraw)
{
- DPRINT1("HeapAlloc failed\n");
- return;
+ DPRINT1("HeapAlloc failed\n");
+ return;
}
- ConsoleDraw->X = Region->left;
- ConsoleDraw->Y = Region->top;
- ConsoleDraw->SizeX = ConioRectWidth(Region);
- ConsoleDraw->SizeY = ConioRectHeight(Region);
- ConsoleDraw->CursorX = Buff->CurrentX;
- ConsoleDraw->CursorY = Buff->CurrentY;
+ ConsoleDraw->X = Region->Left;
+ ConsoleDraw->Y = Region->Top;
+ ConsoleDraw->SizeX = ConioRectWidth(Region);
+ ConsoleDraw->SizeY = ConioRectHeight(Region);
+ ConsoleDraw->CursorX = Buff->CurrentX;
+ ConsoleDraw->CursorY = Buff->CurrentY;
- TuiCopyRect((char *) (ConsoleDraw + 1), Buff, Region);
+ TuiCopyRect((char *) (ConsoleDraw + 1), Buff, Region);
- if (! DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_DRAW,
- NULL, 0, ConsoleDraw, ConsoleDrawSize, &BytesReturned, NULL))
+ if (! DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_DRAW,
+ NULL, 0, ConsoleDraw, ConsoleDrawSize, &BytesReturned, NULL))
{
- DPRINT1("Failed to draw console\n");
- HeapFree(Win32CsrApiHeap, 0, ConsoleDraw);
- return;
+ DPRINT1("Failed to draw console\n");
+ HeapFree(Win32CsrApiHeap, 0, ConsoleDraw);
+ return;
}
- HeapFree(Win32CsrApiHeap, 0, ConsoleDraw);
+ HeapFree(Win32CsrApiHeap, 0, ConsoleDraw);
}
-static VOID STDCALL
-TuiWriteStream(PCSRSS_CONSOLE Console, RECT *Region, LONG CursorStartX, LONG CursorStartY,
+static VOID WINAPI
+TuiWriteStream(PCSRSS_CONSOLE Console, SMALL_RECT *Region, LONG CursorStartX, LONG CursorStartY,
UINT ScrolledLines, CHAR *Buffer, UINT Length)
{
- DWORD BytesWritten;
- PCSRSS_SCREEN_BUFFER Buff = Console->ActiveBuffer;
+ DWORD BytesWritten;
+ PCSRSS_SCREEN_BUFFER Buff = Console->ActiveBuffer;
- if (ActiveConsole->ActiveBuffer != Buff)
+ if (ActiveConsole->ActiveBuffer != Buff)
{
- return;
+ return;
}
- if (! WriteFile(ConsoleDeviceHandle, Buffer, Length, &BytesWritten, NULL))
+ if (! WriteFile(ConsoleDeviceHandle, Buffer, Length, &BytesWritten, NULL))
{
- DPRINT1("Error writing to BlueScreen\n");
+ DPRINT1("Error writing to BlueScreen\n");
}
}
-static BOOL STDCALL
+static BOOL WINAPI
TuiSetCursorInfo(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff)
{
- DWORD BytesReturned;
+ DWORD BytesReturned;
- if (ActiveConsole->ActiveBuffer != Buff)
+ if (ActiveConsole->ActiveBuffer != Buff)
{
- return TRUE;
+ return TRUE;
}
- if (! DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_SET_CURSOR_INFO,
- &Buff->CursorInfo, sizeof(Buff->CursorInfo), NULL, 0,
- &BytesReturned, NULL))
+ if (! DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_SET_CURSOR_INFO,
+ &Buff->CursorInfo, sizeof(Buff->CursorInfo), NULL, 0,
+ &BytesReturned, NULL))
{
- DPRINT1( "Failed to set cursor info\n" );
- return FALSE;
+ DPRINT1( "Failed to set cursor info\n" );
+ return FALSE;
}
- return TRUE;
+ return TRUE;
}
-static BOOL STDCALL
+static BOOL WINAPI
TuiSetScreenInfo(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff, UINT OldCursorX, UINT OldCursorY)
{
- CONSOLE_SCREEN_BUFFER_INFO Info;
- DWORD BytesReturned;
+ CONSOLE_SCREEN_BUFFER_INFO Info;
+ DWORD BytesReturned;
- if (ActiveConsole->ActiveBuffer != Buff)
+ if (ActiveConsole->ActiveBuffer != Buff)
{
- return TRUE;
+ return TRUE;
}
- Info.dwCursorPosition.X = Buff->CurrentX;
- Info.dwCursorPosition.Y = Buff->CurrentY;
- Info.wAttributes = Buff->DefaultAttrib;
+ Info.dwCursorPosition.X = Buff->CurrentX;
+ Info.dwCursorPosition.Y = Buff->CurrentY;
+ Info.wAttributes = Buff->DefaultAttrib;
- if (! DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_SET_SCREEN_BUFFER_INFO,
- &Info, sizeof(CONSOLE_SCREEN_BUFFER_INFO), NULL, 0,
- &BytesReturned, NULL))
+ if (! DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_SET_SCREEN_BUFFER_INFO,
+ &Info, sizeof(CONSOLE_SCREEN_BUFFER_INFO), NULL, 0,
+ &BytesReturned, NULL))
{
- DPRINT1( "Failed to set cursor position\n" );
- return FALSE;
+ DPRINT1( "Failed to set cursor position\n" );
+ return FALSE;
}
- return TRUE;
+ return TRUE;
}
-static BOOL STDCALL
+static BOOL WINAPI
TuiUpdateScreenInfo(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER Buff)
{
return TRUE;
}
-static BOOL STDCALL
+static BOOL WINAPI
TuiChangeTitle(PCSRSS_CONSOLE Console)
{
- return TRUE;
+ return TRUE;
}
-static VOID STDCALL
+static VOID WINAPI
TuiCleanupConsole(PCSRSS_CONSOLE Console)
{
- DestroyWindow(Console->hWindow);
+ DestroyWindow(Console->hWindow);
- EnterCriticalSection(&ActiveConsoleLock);
+ EnterCriticalSection(&ActiveConsoleLock);
- /* Switch to next console */
- if (ActiveConsole == Console)
+ /* Switch to next console */
+ if (ActiveConsole == Console)
{
- ActiveConsole = Console->Next != Console ? Console->Next : NULL;
+ ActiveConsole = Console->Next != Console ? Console->Next : NULL;
}
- if (Console->Next != Console)
+ if (Console->Next != Console)
{
- Console->Prev->Next = Console->Next;
- Console->Next->Prev = Console->Prev;
+ Console->Prev->Next = Console->Next;
+ Console->Next->Prev = Console->Prev;
}
- LeaveCriticalSection(&ActiveConsoleLock);
+ LeaveCriticalSection(&ActiveConsoleLock);
- if (NULL != ActiveConsole)
+ if (NULL != ActiveConsole)
{
- ConioDrawConsole(ActiveConsole);
+ ConioDrawConsole(ActiveConsole);
}
}
-DWORD STDCALL
+static BOOL WINAPI
+TuiChangeIcon(PCSRSS_CONSOLE Console, HICON hWindowIcon)
+{
+ return TRUE;
+}
+
+static NTSTATUS WINAPI
+TuiResizeBuffer(PCSRSS_CONSOLE Console, PCSRSS_SCREEN_BUFFER ScreenBuffer, COORD Size)
+{
+ UNIMPLEMENTED;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+DWORD WINAPI
TuiConsoleThread (PVOID Data)
{
- PCSRSS_CONSOLE Console = (PCSRSS_CONSOLE) Data;
- HWND NewWindow;
- MSG msg;
-
- NewWindow = CreateWindowW(L"TuiConsoleWindowClass",
- Console->Title.Buffer,
- 0,
- -32000, -32000, 0, 0,
- NULL, NULL,
- (HINSTANCE) GetModuleHandleW(NULL),
- (PVOID) Console);
- Console->hWindow = NewWindow;
- if (NULL == NewWindow)
+ PCSRSS_CONSOLE Console = (PCSRSS_CONSOLE) Data;
+ HWND NewWindow;
+ MSG msg;
+
+ NewWindow = CreateWindowW(L"TuiConsoleWindowClass",
+ Console->Title.Buffer,
+ 0,
+ -32000, -32000, 0, 0,
+ NULL, NULL,
+ (HINSTANCE) GetModuleHandleW(NULL),
+ (PVOID) Console);
+ Console->hWindow = NewWindow;
+ if (NULL == NewWindow)
{
- DPRINT1("CSR: Unable to create console window\n");
- return 1;
+ DPRINT1("CSR: Unable to create console window\n");
+ return 1;
}
- SetForegroundWindow(Console->hWindow);
+ SetForegroundWindow(Console->hWindow);
- while (TRUE)
+ while (TRUE)
{
- GetMessageW(&msg, 0, 0, 0);
- DispatchMessage(&msg);
- TranslateMessage(&msg);
+ GetMessageW(&msg, 0, 0, 0);
+ DispatchMessage(&msg);
+ TranslateMessage(&msg);
- if (msg.message == WM_CHAR || msg.message == WM_SYSCHAR ||
- msg.message == WM_KEYDOWN || msg.message == WM_KEYUP ||
- msg.message == WM_SYSKEYDOWN || msg.message == WM_SYSKEYUP)
+ if (msg.message == WM_CHAR || msg.message == WM_SYSCHAR ||
+ msg.message == WM_KEYDOWN || msg.message == WM_KEYUP ||
+ msg.message == WM_SYSKEYDOWN || msg.message == WM_SYSKEYUP)
{
- ConioProcessKey(&msg, Console, TRUE);
+ ConioProcessKey(&msg, Console, TRUE);
}
}
- return 0;
+ return 0;
}
static CSRSS_CONSOLE_VTBL TuiVtbl =
{
- TuiInitScreenBuffer,
- TuiWriteStream,
- TuiDrawRegion,
- TuiSetCursorInfo,
- TuiSetScreenInfo,
- TuiUpdateScreenInfo,
- TuiChangeTitle,
- TuiCleanupConsole
+ TuiInitScreenBuffer,
+ TuiWriteStream,
+ TuiDrawRegion,
+ TuiSetCursorInfo,
+ TuiSetScreenInfo,
+ TuiUpdateScreenInfo,
+ TuiChangeTitle,
+ TuiCleanupConsole,
+ TuiChangeIcon,
+ TuiResizeBuffer,
};
NTSTATUS FASTCALL
TuiInitConsole(PCSRSS_CONSOLE Console)
{
- HANDLE ThreadHandle;
+ HANDLE ThreadHandle;
- if (! ConsInitialized)
+ if (! ConsInitialized)
{
- ConsInitialized = TRUE;
- if (! TuiInit())
+ ConsInitialized = TRUE;
+ if (! TuiInit(Console->CodePage))
{
- ConsInitialized = FALSE;
- return STATUS_UNSUCCESSFUL;
+ ConsInitialized = FALSE;
+ return STATUS_UNSUCCESSFUL;
}
}
- Console->Vtbl = &TuiVtbl;
- Console->hWindow = NULL;
- Console->Size = PhysicalConsoleSize;
- Console->ActiveBuffer->MaxX = PhysicalConsoleSize.X;
- Console->ActiveBuffer->MaxY = PhysicalConsoleSize.Y;
+ Console->Vtbl = &TuiVtbl;
+ Console->hWindow = NULL;
+ Console->Size = PhysicalConsoleSize;
+ Console->ActiveBuffer->MaxX = PhysicalConsoleSize.X;
+ Console->ActiveBuffer->MaxY = PhysicalConsoleSize.Y;
- ThreadHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) TuiConsoleThread,
- Console, 0, NULL);
- if (NULL == ThreadHandle)
+ ThreadHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) TuiConsoleThread,
+ Console, 0, NULL);
+ if (NULL == ThreadHandle)
{
- DPRINT1("CSR: Unable to create console thread\n");
- return STATUS_UNSUCCESSFUL;
+ DPRINT1("CSR: Unable to create console thread\n");
+ return STATUS_UNSUCCESSFUL;
}
- CloseHandle(ThreadHandle);
+ CloseHandle(ThreadHandle);
- EnterCriticalSection(&ActiveConsoleLock);
- if (NULL != ActiveConsole)
+ EnterCriticalSection(&ActiveConsoleLock);
+ if (NULL != ActiveConsole)
{
- Console->Prev = ActiveConsole;
- Console->Next = ActiveConsole->Next;
- ActiveConsole->Next->Prev = Console;
- ActiveConsole->Next = Console;
+ Console->Prev = ActiveConsole;
+ Console->Next = ActiveConsole->Next;
+ ActiveConsole->Next->Prev = Console;
+ ActiveConsole->Next = Console;
}
- else
+ else
{
- Console->Prev = Console;
- Console->Next = Console;
+ Console->Prev = Console;
+ Console->Next = Console;
}
- ActiveConsole = Console;
- LeaveCriticalSection(&ActiveConsoleLock);
+ ActiveConsole = Console;
+ LeaveCriticalSection(&ActiveConsoleLock);
- return STATUS_SUCCESS;
+ return STATUS_SUCCESS;
}
PCSRSS_CONSOLE FASTCALL
TuiGetFocusConsole(VOID)
{
- return ActiveConsole;
+ return ActiveConsole;
}
BOOL FASTCALL
TuiSwapConsole(int Next)
{
- static PCSRSS_CONSOLE SwapConsole = NULL; /* console we are thinking about swapping with */
- DWORD BytesReturned;
- ANSI_STRING Title;
- void * Buffer;
- COORD *pos;
+ static PCSRSS_CONSOLE SwapConsole = NULL; /* console we are thinking about swapping with */
+ DWORD BytesReturned;
+ ANSI_STRING Title;
+ void * Buffer;
+ COORD *pos;
- if (0 != Next)
+ if (0 != Next)
{
- /* alt-tab, swap consoles */
- /* move SwapConsole to next console, and print its title */
- EnterCriticalSection(&ActiveConsoleLock);
- if (! SwapConsole)
+ /* alt-tab, swap consoles */
+ /* move SwapConsole to next console, and print its title */
+ EnterCriticalSection(&ActiveConsoleLock);
+ if (! SwapConsole)
{
- SwapConsole = ActiveConsole;
+ SwapConsole = ActiveConsole;
}
- SwapConsole = (0 < Next ? SwapConsole->Next : SwapConsole->Prev);
- Title.MaximumLength = RtlUnicodeStringToAnsiSize(&SwapConsole->Title);
- Title.Length = 0;
- Buffer = HeapAlloc(Win32CsrApiHeap,
- 0,
- sizeof(COORD) + Title.MaximumLength);
- pos = (COORD *)Buffer;
- Title.Buffer = (PVOID)((ULONG_PTR)Buffer + sizeof( COORD ));
-
- RtlUnicodeStringToAnsiString(&Title, &SwapConsole->Title, FALSE);
- pos->Y = PhysicalConsoleSize.Y / 2;
- pos->X = (PhysicalConsoleSize.X - Title.Length) / 2;
- /* redraw the console to clear off old title */
- ConioDrawConsole(ActiveConsole);
- if (! DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER,
- NULL, 0, Buffer, sizeof(COORD) + Title.Length,
- &BytesReturned, NULL))
+ SwapConsole = (0 < Next ? SwapConsole->Next : SwapConsole->Prev);
+ Title.MaximumLength = RtlUnicodeStringToAnsiSize(&SwapConsole->Title);
+ Title.Length = 0;
+ Buffer = HeapAlloc(Win32CsrApiHeap,
+ 0,
+ sizeof(COORD) + Title.MaximumLength);
+ pos = (COORD *)Buffer;
+ Title.Buffer = (PVOID)((ULONG_PTR)Buffer + sizeof( COORD ));
+
+ RtlUnicodeStringToAnsiString(&Title, &SwapConsole->Title, FALSE);
+ pos->Y = PhysicalConsoleSize.Y / 2;
+ pos->X = (PhysicalConsoleSize.X - Title.Length) / 2;
+ /* redraw the console to clear off old title */
+ ConioDrawConsole(ActiveConsole);
+ if (! DeviceIoControl(ConsoleDeviceHandle, IOCTL_CONSOLE_WRITE_OUTPUT_CHARACTER,
+ NULL, 0, Buffer, sizeof(COORD) + Title.Length,
+ &BytesReturned, NULL))
{
- DPRINT1( "Error writing to console\n" );
+ DPRINT1( "Error writing to console\n" );
}
- HeapFree(Win32CsrApiHeap, 0, Buffer);
- LeaveCriticalSection(&ActiveConsoleLock);
+ HeapFree(Win32CsrApiHeap, 0, Buffer);
+ LeaveCriticalSection(&ActiveConsoleLock);
- return TRUE;
+ return TRUE;
}
- else if (NULL != SwapConsole)
+ else if (NULL != SwapConsole)
{
- EnterCriticalSection(&ActiveConsoleLock);
- if (SwapConsole != ActiveConsole)
+ EnterCriticalSection(&ActiveConsoleLock);
+ if (SwapConsole != ActiveConsole)
{
- /* first remove swapconsole from the list */
- SwapConsole->Prev->Next = SwapConsole->Next;
- SwapConsole->Next->Prev = SwapConsole->Prev;
- /* now insert before activeconsole */
- SwapConsole->Next = ActiveConsole;
- SwapConsole->Prev = ActiveConsole->Prev;
- ActiveConsole->Prev->Next = SwapConsole;
- ActiveConsole->Prev = SwapConsole;
+ /* first remove swapconsole from the list */
+ SwapConsole->Prev->Next = SwapConsole->Next;
+ SwapConsole->Next->Prev = SwapConsole->Prev;
+ /* now insert before activeconsole */
+ SwapConsole->Next = ActiveConsole;
+ SwapConsole->Prev = ActiveConsole->Prev;
+ ActiveConsole->Prev->Next = SwapConsole;
+ ActiveConsole->Prev = SwapConsole;
}
- ActiveConsole = SwapConsole;
- SwapConsole = NULL;
- ConioDrawConsole(ActiveConsole);
- LeaveCriticalSection(&ActiveConsoleLock);
- return TRUE;
+ ActiveConsole = SwapConsole;
+ SwapConsole = NULL;
+ ConioDrawConsole(ActiveConsole);
+ LeaveCriticalSection(&ActiveConsoleLock);
+ return TRUE;
}
- else
+ else
{
- return FALSE;
+ return FALSE;
}
}