- Finish to do the replacements HeapAlloc --> RtlAllocateHeap and Co.
- Finish to UNICODify consrv (it happens that it has been almost done already).
- Modify the way we start BlueScreen driver (in TUI mode): instead of using the SCM which, at that moment, is starting (and is not ready to answer to start/stop services requests), use the NT apis to start the driver (in the same way the SCM performs driver starting).
- Add a note on HAVE_WMEMSET.

svn path=/branches/ros-csrss/; revision=58169
This commit is contained in:
Hermès Bélusca-Maïto 2013-01-13 19:50:52 +00:00
parent bc73176945
commit 9967600abf
7 changed files with 200 additions and 72 deletions

View file

@ -23,7 +23,7 @@ add_library(consrv SHARED ${SOURCE})
target_link_libraries(consrv win32ksys ${PSEH_LIB}) # win32ksys because of NtUser...() target_link_libraries(consrv win32ksys ${PSEH_LIB}) # win32ksys because of NtUser...()
set_module_type(consrv win32dll) set_module_type(consrv win32dll UNICODE)
add_importlibs(consrv psapi msvcrt kernel32 ntdll csrsrv) add_importlibs(consrv psapi msvcrt kernel32 ntdll csrsrv)
add_delay_importlibs(consrv user32 gdi32 advapi32) add_delay_importlibs(consrv user32 gdi32 advapi32)

View file

@ -64,7 +64,7 @@ IntCreateAliasHeader(LPCWSTR lpExeName)
return Entry; return Entry;
Entry->lpExeName = (LPCWSTR)(Entry + 1); Entry->lpExeName = (LPCWSTR)(Entry + 1);
wcscpy((WCHAR*)Entry->lpExeName, lpExeName); wcscpy((PWCHAR)Entry->lpExeName, lpExeName);
Entry->Data = NULL; Entry->Data = NULL;
Entry->Next = NULL; Entry->Next = NULL;
return Entry; return Entry;

View file

@ -394,7 +394,7 @@ ConioDrawConsole(PCONSOLE Console)
} }
static VOID FASTCALL static VOID FASTCALL
ConioComputeUpdateRect(PCONSOLE_SCREEN_BUFFER Buff, SMALL_RECT *UpdateRect, COORD *Start, UINT Length) ConioComputeUpdateRect(PCONSOLE_SCREEN_BUFFER Buff, SMALL_RECT* UpdateRect, PCOORD Start, UINT Length)
{ {
if (Buff->MaxX <= Start->X + Length) if (Buff->MaxX <= Start->X + Length)
{ {

View file

@ -15,6 +15,11 @@
#define NDEBUG #define NDEBUG
#include <debug.h> #include <debug.h>
/*
// Define wmemset(...)
#include <wchar.h>
#define HAVE_WMEMSET
*/
/* GUI Console Window Class name */ /* GUI Console Window Class name */
#define GUI_CONSOLE_WINDOW_CLASS L"ConsoleWindowClass" #define GUI_CONSOLE_WINDOW_CLASS L"ConsoleWindowClass"
@ -1519,7 +1524,7 @@ GuiConsoleShowConsoleProperties(HWND hWnd, BOOL Defaults, PGUI_CONSOLE_DATA GuiD
{ {
PCONSOLE Console; PCONSOLE Console;
APPLET_PROC CPLFunc; APPLET_PROC CPLFunc;
TCHAR szBuffer[MAX_PATH]; WCHAR szBuffer[MAX_PATH];
ConsoleInfo SharedInfo; ConsoleInfo SharedInfo;
DPRINT("GuiConsoleShowConsoleProperties entered\n"); DPRINT("GuiConsoleShowConsoleProperties entered\n");
@ -1534,9 +1539,9 @@ GuiConsoleShowConsoleProperties(HWND hWnd, BOOL Defaults, PGUI_CONSOLE_DATA GuiD
if (GuiData->ConsoleLibrary == NULL) if (GuiData->ConsoleLibrary == NULL)
{ {
GetWindowsDirectory(szBuffer,MAX_PATH); GetWindowsDirectoryW(szBuffer, MAX_PATH);
_tcscat(szBuffer, _T("\\system32\\console.dll")); wcscat(szBuffer, L"\\system32\\console.dll");
GuiData->ConsoleLibrary = LoadLibrary(szBuffer); GuiData->ConsoleLibrary = LoadLibraryW(szBuffer);
if (GuiData->ConsoleLibrary == NULL) if (GuiData->ConsoleLibrary == NULL)
{ {
@ -1545,7 +1550,7 @@ GuiConsoleShowConsoleProperties(HWND hWnd, BOOL Defaults, PGUI_CONSOLE_DATA GuiD
} }
} }
CPLFunc = (APPLET_PROC) GetProcAddress(GuiData->ConsoleLibrary, _T("CPlApplet")); CPLFunc = (APPLET_PROC)GetProcAddress(GuiData->ConsoleLibrary, "CPlApplet");
if (!CPLFunc) if (!CPLFunc)
{ {
DPRINT("Error: Console.dll misses CPlApplet export\n"); DPRINT("Error: Console.dll misses CPlApplet export\n");
@ -1755,11 +1760,12 @@ GuiResizeBuffer(PCONSOLE Console, PCONSOLE_SCREEN_BUFFER ScreenBuffer, COORD Siz
BYTE * OldPtr; BYTE * OldPtr;
USHORT CurrentY; USHORT CurrentY;
BYTE * OldBuffer; BYTE * OldBuffer;
#if HAVE_WMEMSET #ifdef HAVE_WMEMSET
USHORT value = MAKEWORD(' ', ScreenBuffer->DefaultAttrib); USHORT value = MAKEWORD(' ', ScreenBuffer->DefaultAttrib);
#else
DWORD i;
#endif #endif
DWORD diff; DWORD diff;
DWORD i;
/* Buffer size is not allowed to be smaller than window size */ /* Buffer size is not allowed to be smaller than window size */
if (Size.X < Console->Size.X || Size.Y < Console->Size.Y) if (Size.X < Console->Size.X || Size.Y < Console->Size.Y)
@ -1792,8 +1798,8 @@ GuiResizeBuffer(PCONSOLE Console, PCONSOLE_SCREEN_BUFFER ScreenBuffer, COORD Siz
diff = Size.X - ScreenBuffer->MaxX; diff = Size.X - ScreenBuffer->MaxX;
/* zero new part of it */ /* zero new part of it */
#if HAVE_WMEMSET #ifdef HAVE_WMEMSET
wmemset((WCHAR*)&Buffer[Offset], value, diff); wmemset((PWCHAR)&Buffer[Offset], value, diff);
#else #else
for (i = 0; i < diff; i++) for (i = 0; i < diff; i++)
{ {
@ -1807,8 +1813,8 @@ GuiResizeBuffer(PCONSOLE Console, PCONSOLE_SCREEN_BUFFER ScreenBuffer, COORD Siz
if (Size.Y > ScreenBuffer->MaxY) if (Size.Y > ScreenBuffer->MaxY)
{ {
diff = Size.X * (Size.Y - ScreenBuffer->MaxY); diff = Size.X * (Size.Y - ScreenBuffer->MaxY);
#if HAVE_WMEMSET #ifdef HAVE_WMEMSET
wmemset((WCHAR*)&Buffer[Offset], value, diff); wmemset((PWCHAR)&Buffer[Offset], value, diff);
#else #else
for (i = 0; i < diff; i++) for (i = 0; i < diff; i++)
{ {

View file

@ -25,6 +25,157 @@ static PCONSOLE ActiveConsole;
static BOOL ConsInitialized = FALSE; static BOOL ConsInitialized = FALSE;
/******************************************************************************\
|** BlueScreen Driver management **|
\**/
/* Code taken and adapted from base/system/services/driver.c */
static DWORD EnablePrivilege(LPCWSTR lpszPrivilegeName, BOOL bEnablePrivilege)
{
DWORD dwRet = ERROR_SUCCESS;
HANDLE hToken = NULL;
if (OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES,
&hToken))
{
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
tp.Privileges[0].Attributes = (bEnablePrivilege ? SE_PRIVILEGE_ENABLED : 0);
if (LookupPrivilegeValueW(NULL,
lpszPrivilegeName,
&tp.Privileges[0].Luid))
{
if (AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL))
{
if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
dwRet = ERROR_NOT_ALL_ASSIGNED;
}
else
{
dwRet = GetLastError();
}
}
else
{
dwRet = GetLastError();
}
CloseHandle(hToken);
}
else
{
dwRet = GetLastError();
}
return dwRet;
}
static DWORD
ScmLoadDriver(LPCWSTR lpServiceName)
{
PWSTR pszDriverPath;
UNICODE_STRING DriverPath;
NTSTATUS Status;
DWORD dwError = ERROR_SUCCESS;
/* Build the driver path */
/* 52 = wcslen(L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\") */
pszDriverPath = RtlAllocateHeap(ConSrvHeap,
HEAP_ZERO_MEMORY,
(52 + wcslen(lpServiceName) + 1) * sizeof(WCHAR));
if (pszDriverPath == NULL)
return ERROR_NOT_ENOUGH_MEMORY;
wcscpy(pszDriverPath,
L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\");
wcscat(pszDriverPath,
lpServiceName);
RtlInitUnicodeString(&DriverPath,
pszDriverPath);
DPRINT(" Path: %wZ\n", &DriverPath);
/* Acquire driver-loading privilege */
dwError = EnablePrivilege(SE_LOAD_DRIVER_NAME, TRUE);
if (dwError != ERROR_SUCCESS)
{
/* We encountered a failure, exit properly */
DPRINT1("CONSRV: Cannot acquire driver-loading privilege, error = %lu\n", dwError);
goto done;
}
Status = NtLoadDriver(&DriverPath);
/* Release driver-loading privilege */
EnablePrivilege(SE_LOAD_DRIVER_NAME, FALSE);
if (!NT_SUCCESS(Status))
{
dwError = RtlNtStatusToDosError(Status);
}
done:
RtlFreeHeap(ConSrvHeap, 0, pszDriverPath);
return dwError;
}
#ifdef BLUESCREEN_DRIVER_UNLOADING
static DWORD
ScmUnloadDriver(LPCWSTR lpServiceName)
{
PWSTR pszDriverPath;
UNICODE_STRING DriverPath;
NTSTATUS Status;
DWORD dwError = ERROR_SUCCESS;
/* Build the driver path */
/* 52 = wcslen(L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\") */
pszDriverPath = RtlAllocateHeap(ConSrvHeap,
HEAP_ZERO_MEMORY,
(52 + wcslen(lpServiceName) + 1) * sizeof(WCHAR));
if (pszDriverPath == NULL)
return ERROR_NOT_ENOUGH_MEMORY;
wcscpy(pszDriverPath,
L"\\Registry\\Machine\\System\\CurrentControlSet\\Services\\");
wcscat(pszDriverPath,
lpServiceName);
RtlInitUnicodeString(&DriverPath,
pszDriverPath);
/* Acquire driver-unloading privilege */
dwError = EnablePrivilege(SE_LOAD_DRIVER_NAME, TRUE);
if (dwError != ERROR_SUCCESS)
{
/* We encountered a failure, exit properly */
DPRINT1("CONSRV: Cannot acquire driver-unloading privilege, error = %lu\n", dwError);
goto done;
}
Status = NtUnloadDriver(&DriverPath);
/* Release driver-unloading privilege */
EnablePrivilege(SE_LOAD_DRIVER_NAME, FALSE);
if (!NT_SUCCESS(Status))
{
dwError = RtlNtStatusToDosError(Status);
}
done:
RtlFreeHeap(ConSrvHeap, 0, pszDriverPath);
return dwError;
}
#endif
/**\
\******************************************************************************/
static LRESULT CALLBACK static LRESULT CALLBACK
TuiConsoleWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) TuiConsoleWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{ {
@ -39,35 +190,6 @@ TuiConsoleWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
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 static BOOL FASTCALL
TuiInit(DWORD OemCP) TuiInit(DWORD OemCP)
{ {
@ -77,7 +199,7 @@ TuiInit(DWORD OemCP)
ATOM ConsoleClassAtom; ATOM ConsoleClassAtom;
USHORT TextAttribute = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED; USHORT TextAttribute = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED;
TuiStartService(L"Blue"); ScmLoadDriver(L"Blue");
ConsoleDeviceHandle = CreateFileW(L"\\\\.\\BlueScreen", FILE_ALL_ACCESS, 0, NULL, ConsoleDeviceHandle = CreateFileW(L"\\\\.\\BlueScreen", FILE_ALL_ACCESS, 0, NULL,
OPEN_EXISTING, 0, NULL); OPEN_EXISTING, 0, NULL);
@ -177,10 +299,10 @@ TuiDrawRegion(PCONSOLE Console, SMALL_RECT *Region)
ConsoleDrawSize = sizeof(CONSOLE_DRAW) + ConsoleDrawSize = sizeof(CONSOLE_DRAW) +
(ConioRectWidth(Region) * ConioRectHeight(Region)) * 2; (ConioRectWidth(Region) * ConioRectHeight(Region)) * 2;
ConsoleDraw = HeapAlloc(ConSrvHeap, 0, ConsoleDrawSize); ConsoleDraw = RtlAllocateHeap(ConSrvHeap, 0, ConsoleDrawSize);
if (NULL == ConsoleDraw) if (NULL == ConsoleDraw)
{ {
DPRINT1("HeapAlloc failed\n"); DPRINT1("RtlAllocateHeap failed\n");
return; return;
} }
ConsoleDraw->X = Region->Left; ConsoleDraw->X = Region->Left;
@ -196,11 +318,11 @@ TuiDrawRegion(PCONSOLE Console, SMALL_RECT *Region)
NULL, 0, ConsoleDraw, ConsoleDrawSize, &BytesReturned, NULL)) NULL, 0, ConsoleDraw, ConsoleDrawSize, &BytesReturned, NULL))
{ {
DPRINT1("Failed to draw console\n"); DPRINT1("Failed to draw console\n");
HeapFree(ConSrvHeap, 0, ConsoleDraw); RtlFreeHeap(ConSrvHeap, 0, ConsoleDraw);
return; return;
} }
HeapFree(ConSrvHeap, 0, ConsoleDraw); RtlFreeHeap(ConSrvHeap, 0, ConsoleDraw);
} }
static VOID WINAPI static VOID WINAPI
@ -437,13 +559,13 @@ TuiGetFocusConsole(VOID)
} }
BOOL FASTCALL BOOL FASTCALL
TuiSwapConsole(int Next) TuiSwapConsole(INT Next)
{ {
static PCONSOLE SwapConsole = NULL; /* console we are thinking about swapping with */ static PCONSOLE SwapConsole = NULL; /* console we are thinking about swapping with */
DWORD BytesReturned; DWORD BytesReturned;
ANSI_STRING Title; ANSI_STRING Title;
void * Buffer; PVOID Buffer;
COORD *pos; PCOORD pos;
if (0 != Next) if (0 != Next)
{ {
@ -458,10 +580,10 @@ TuiSwapConsole(int Next)
SwapConsole = (0 < Next ? SwapConsole->Next : SwapConsole->Prev); SwapConsole = (0 < Next ? SwapConsole->Next : SwapConsole->Prev);
Title.MaximumLength = RtlUnicodeStringToAnsiSize(&SwapConsole->Title); Title.MaximumLength = RtlUnicodeStringToAnsiSize(&SwapConsole->Title);
Title.Length = 0; Title.Length = 0;
Buffer = HeapAlloc(ConSrvHeap, Buffer = RtlAllocateHeap(ConSrvHeap,
0, 0,
sizeof(COORD) + Title.MaximumLength); sizeof(COORD) + Title.MaximumLength);
pos = (COORD *)Buffer; pos = (PCOORD )Buffer;
Title.Buffer = (PVOID)((ULONG_PTR)Buffer + sizeof( COORD )); Title.Buffer = (PVOID)((ULONG_PTR)Buffer + sizeof( COORD ));
RtlUnicodeStringToAnsiString(&Title, &SwapConsole->Title, FALSE); RtlUnicodeStringToAnsiString(&Title, &SwapConsole->Title, FALSE);
@ -475,7 +597,7 @@ TuiSwapConsole(int Next)
{ {
DPRINT1( "Error writing to console\n" ); DPRINT1( "Error writing to console\n" );
} }
HeapFree(ConSrvHeap, 0, Buffer); RtlFreeHeap(ConSrvHeap, 0, Buffer);
LeaveCriticalSection(&ActiveConsoleLock); LeaveCriticalSection(&ActiveConsoleLock);
return TRUE; return TRUE;

View file

@ -10,6 +10,6 @@
extern NTSTATUS FASTCALL TuiInitConsole(PCONSOLE Console); extern NTSTATUS FASTCALL TuiInitConsole(PCONSOLE Console);
extern PCONSOLE FASTCALL TuiGetFocusConsole(VOID); extern PCONSOLE FASTCALL TuiGetFocusConsole(VOID);
extern BOOL FASTCALL TuiSwapConsole(int Next); extern BOOL FASTCALL TuiSwapConsole(INT Next);
/* EOF */ /* EOF */