mirror of
https://github.com/reactos/reactos.git
synced 2025-04-22 13:10:39 +00:00
[CONSRV]
- 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:
parent
bc73176945
commit
9967600abf
7 changed files with 200 additions and 72 deletions
|
@ -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)
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -107,9 +107,9 @@ do { \
|
||||||
typedef struct _CONSOLE_VTBL
|
typedef struct _CONSOLE_VTBL
|
||||||
{
|
{
|
||||||
VOID (WINAPI *InitScreenBuffer)(PCONSOLE Console, PCONSOLE_SCREEN_BUFFER ScreenBuffer);
|
VOID (WINAPI *InitScreenBuffer)(PCONSOLE Console, PCONSOLE_SCREEN_BUFFER ScreenBuffer);
|
||||||
VOID (WINAPI *WriteStream)(PCONSOLE Console, SMALL_RECT *Block, LONG CursorStartX, LONG CursorStartY,
|
VOID (WINAPI *WriteStream)(PCONSOLE Console, SMALL_RECT* Block, LONG CursorStartX, LONG CursorStartY,
|
||||||
UINT ScrolledLines, CHAR *Buffer, UINT Length);
|
UINT ScrolledLines, CHAR *Buffer, UINT Length);
|
||||||
VOID (WINAPI *DrawRegion)(PCONSOLE Console, SMALL_RECT *Region);
|
VOID (WINAPI *DrawRegion)(PCONSOLE Console, SMALL_RECT* Region);
|
||||||
BOOL (WINAPI *SetCursorInfo)(PCONSOLE Console, PCONSOLE_SCREEN_BUFFER ScreenBuffer);
|
BOOL (WINAPI *SetCursorInfo)(PCONSOLE Console, PCONSOLE_SCREEN_BUFFER ScreenBuffer);
|
||||||
BOOL (WINAPI *SetScreenInfo)(PCONSOLE Console, PCONSOLE_SCREEN_BUFFER ScreenBuffer,
|
BOOL (WINAPI *SetScreenInfo)(PCONSOLE Console, PCONSOLE_SCREEN_BUFFER ScreenBuffer,
|
||||||
UINT OldCursorX, UINT OldCursorY);
|
UINT OldCursorX, UINT OldCursorY);
|
||||||
|
|
|
@ -89,7 +89,7 @@ CsrInitConsoleScreenBuffer(PCONSOLE Console,
|
||||||
}
|
}
|
||||||
|
|
||||||
static VOID FASTCALL
|
static VOID FASTCALL
|
||||||
ConioNextLine(PCONSOLE_SCREEN_BUFFER Buff, SMALL_RECT *UpdateRect, UINT *ScrolledLines)
|
ConioNextLine(PCONSOLE_SCREEN_BUFFER Buff, SMALL_RECT* UpdateRect, UINT *ScrolledLines)
|
||||||
{
|
{
|
||||||
/* If we hit bottom, slide the viewable screen */
|
/* If we hit bottom, slide the viewable screen */
|
||||||
if (++Buff->CurrentY == Buff->MaxY)
|
if (++Buff->CurrentY == Buff->MaxY)
|
||||||
|
@ -240,9 +240,9 @@ ConioWriteConsole(PCONSOLE Console, PCONSOLE_SCREEN_BUFFER Buff,
|
||||||
}
|
}
|
||||||
|
|
||||||
__inline BOOLEAN ConioGetIntersection(
|
__inline BOOLEAN ConioGetIntersection(
|
||||||
SMALL_RECT *Intersection,
|
SMALL_RECT* Intersection,
|
||||||
SMALL_RECT *Rect1,
|
SMALL_RECT* Rect1,
|
||||||
SMALL_RECT *Rect2)
|
SMALL_RECT* Rect2)
|
||||||
{
|
{
|
||||||
if (ConioIsRectEmpty(Rect1) ||
|
if (ConioIsRectEmpty(Rect1) ||
|
||||||
(ConioIsRectEmpty(Rect2)) ||
|
(ConioIsRectEmpty(Rect2)) ||
|
||||||
|
@ -266,9 +266,9 @@ __inline BOOLEAN ConioGetIntersection(
|
||||||
}
|
}
|
||||||
|
|
||||||
__inline BOOLEAN ConioGetUnion(
|
__inline BOOLEAN ConioGetUnion(
|
||||||
SMALL_RECT *Union,
|
SMALL_RECT* Union,
|
||||||
SMALL_RECT *Rect1,
|
SMALL_RECT* Rect1,
|
||||||
SMALL_RECT *Rect2)
|
SMALL_RECT* Rect2)
|
||||||
{
|
{
|
||||||
if (ConioIsRectEmpty(Rect1))
|
if (ConioIsRectEmpty(Rect1))
|
||||||
{
|
{
|
||||||
|
@ -304,9 +304,9 @@ __inline BOOLEAN ConioGetUnion(
|
||||||
*/
|
*/
|
||||||
static VOID FASTCALL
|
static VOID FASTCALL
|
||||||
ConioMoveRegion(PCONSOLE_SCREEN_BUFFER ScreenBuffer,
|
ConioMoveRegion(PCONSOLE_SCREEN_BUFFER ScreenBuffer,
|
||||||
SMALL_RECT *SrcRegion,
|
SMALL_RECT* SrcRegion,
|
||||||
SMALL_RECT *DstRegion,
|
SMALL_RECT* DstRegion,
|
||||||
SMALL_RECT *ClipRegion,
|
SMALL_RECT* ClipRegion,
|
||||||
WORD Fill)
|
WORD Fill)
|
||||||
{
|
{
|
||||||
int Width = ConioRectWidth(SrcRegion);
|
int Width = ConioRectWidth(SrcRegion);
|
||||||
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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"
|
||||||
|
@ -1074,7 +1079,7 @@ GuiConsoleHandleKey(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
|
||||||
}
|
}
|
||||||
|
|
||||||
static VOID WINAPI
|
static VOID WINAPI
|
||||||
GuiDrawRegion(PCONSOLE Console, SMALL_RECT *Region)
|
GuiDrawRegion(PCONSOLE Console, SMALL_RECT* Region)
|
||||||
{
|
{
|
||||||
RECT RegionRect;
|
RECT RegionRect;
|
||||||
SmallRectToRect(Console, &RegionRect, Region);
|
SmallRectToRect(Console, &RegionRect, Region);
|
||||||
|
@ -1089,7 +1094,7 @@ GuiInvalidateCell(PCONSOLE Console, UINT x, UINT y)
|
||||||
}
|
}
|
||||||
|
|
||||||
static VOID WINAPI
|
static VOID WINAPI
|
||||||
GuiWriteStream(PCONSOLE Console, SMALL_RECT *Region, LONG CursorStartX, LONG CursorStartY,
|
GuiWriteStream(PCONSOLE Console, SMALL_RECT* Region, LONG CursorStartX, LONG CursorStartY,
|
||||||
UINT ScrolledLines, CHAR *Buffer, UINT Length)
|
UINT ScrolledLines, CHAR *Buffer, UINT Length)
|
||||||
{
|
{
|
||||||
PGUI_CONSOLE_DATA GuiData = (PGUI_CONSOLE_DATA) Console->PrivateData;
|
PGUI_CONSOLE_DATA GuiData = (PGUI_CONSOLE_DATA) Console->PrivateData;
|
||||||
|
@ -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++)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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);
|
||||||
|
@ -140,7 +262,7 @@ TuiInitScreenBuffer(PCONSOLE Console, PCONSOLE_SCREEN_BUFFER Buffer)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void FASTCALL
|
static void FASTCALL
|
||||||
TuiCopyRect(char *Dest, PCONSOLE_SCREEN_BUFFER Buff, SMALL_RECT *Region)
|
TuiCopyRect(char *Dest, PCONSOLE_SCREEN_BUFFER Buff, SMALL_RECT* Region)
|
||||||
{
|
{
|
||||||
UINT SrcDelta, DestDelta;
|
UINT SrcDelta, DestDelta;
|
||||||
LONG i;
|
LONG i;
|
||||||
|
@ -163,7 +285,7 @@ TuiCopyRect(char *Dest, PCONSOLE_SCREEN_BUFFER Buff, SMALL_RECT *Region)
|
||||||
}
|
}
|
||||||
|
|
||||||
static VOID WINAPI
|
static VOID WINAPI
|
||||||
TuiDrawRegion(PCONSOLE Console, SMALL_RECT *Region)
|
TuiDrawRegion(PCONSOLE Console, SMALL_RECT* Region)
|
||||||
{
|
{
|
||||||
DWORD BytesReturned;
|
DWORD BytesReturned;
|
||||||
PCONSOLE_SCREEN_BUFFER Buff = Console->ActiveBuffer;
|
PCONSOLE_SCREEN_BUFFER Buff = Console->ActiveBuffer;
|
||||||
|
@ -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,15 +318,15 @@ 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
|
||||||
TuiWriteStream(PCONSOLE Console, SMALL_RECT *Region, LONG CursorStartX, LONG CursorStartY,
|
TuiWriteStream(PCONSOLE Console, SMALL_RECT* Region, LONG CursorStartX, LONG CursorStartY,
|
||||||
UINT ScrolledLines, CHAR *Buffer, UINT Length)
|
UINT ScrolledLines, CHAR *Buffer, UINT Length)
|
||||||
{
|
{
|
||||||
DWORD BytesWritten;
|
DWORD BytesWritten;
|
||||||
|
@ -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;
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in a new issue