mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 00:12:57 +00:00
[CONSRV]
- Use the DLL instance for getting its win23 resources. - Use the CONSOLE_PROCESS_DATA structure (see r57686) for accessing console-specific fields of the processes (instead of using them implemented in the CSR_PROCESS structure). - Win32CsrDuplicateHandleTable --> ConsoleNewProcess since it's the callback function called when a new process is created, and start to move some hacks currently present in BaseSrvCreateProcess. TODO: suppress the starting-application-related hacks in BaseSrvCreateProcess (in basesrv). svn path=/branches/ros-csrss/; revision=57689
This commit is contained in:
parent
b5dc23b4a0
commit
2970f8652b
3 changed files with 128 additions and 148 deletions
|
@ -130,13 +130,12 @@ GuiConsoleAppendMenuItems(HMENU hMenu,
|
||||||
UINT i = 0;
|
UINT i = 0;
|
||||||
WCHAR szMenuString[255];
|
WCHAR szMenuString[255];
|
||||||
HMENU hSubMenu;
|
HMENU hSubMenu;
|
||||||
HINSTANCE hInst = GetModuleHandleW(L"win32csr");
|
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
if (Items[i].uID != (UINT)-1)
|
if (Items[i].uID != (UINT)-1)
|
||||||
{
|
{
|
||||||
if (LoadStringW(hInst,
|
if (LoadStringW(ConSrvDllInstance,
|
||||||
Items[i].uID,
|
Items[i].uID,
|
||||||
szMenuString,
|
szMenuString,
|
||||||
sizeof(szMenuString) / sizeof(szMenuString[0])) > 0)
|
sizeof(szMenuString) / sizeof(szMenuString[0])) > 0)
|
||||||
|
@ -406,15 +405,16 @@ static VOID
|
||||||
GuiConsoleWriteUserSettings(PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData)
|
GuiConsoleWriteUserSettings(PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData)
|
||||||
{
|
{
|
||||||
HKEY hKey;
|
HKEY hKey;
|
||||||
PCSR_PROCESS ProcessData;
|
PCONSOLE_PROCESS_DATA ProcessData;
|
||||||
|
|
||||||
if (Console->ProcessList.Flink == &Console->ProcessList)
|
if (Console->ProcessList.Flink == &Console->ProcessList)
|
||||||
{
|
{
|
||||||
DPRINT("GuiConsoleWriteUserSettings: No Process!!!\n");
|
DPRINT("GuiConsoleWriteUserSettings: No Process!!!\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ProcessData = CONTAINING_RECORD(Console->ProcessList.Flink, CSR_PROCESS, ConsoleLink);
|
|
||||||
if (!GuiConsoleOpenUserSettings(GuiData, PtrToUlong(ProcessData->ClientId.UniqueProcess), &hKey, KEY_READ | KEY_WRITE, TRUE))
|
ProcessData = CONTAINING_RECORD(Console->ProcessList.Flink, CONSOLE_PROCESS_DATA, ConsoleLink);
|
||||||
|
if (!GuiConsoleOpenUserSettings(GuiData, PtrToUlong(ProcessData->Process->ClientId.UniqueProcess), &hKey, KEY_READ | KEY_WRITE, TRUE))
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -703,7 +703,7 @@ GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create)
|
||||||
HFONT OldFont;
|
HFONT OldFont;
|
||||||
TEXTMETRICW Metrics;
|
TEXTMETRICW Metrics;
|
||||||
SIZE CharSize;
|
SIZE CharSize;
|
||||||
PCSR_PROCESS ProcessData;
|
PCONSOLE_PROCESS_DATA ProcessData;
|
||||||
HKEY hKey;
|
HKEY hKey;
|
||||||
|
|
||||||
Console->hWindow = hWnd;
|
Console->hWindow = hWnd;
|
||||||
|
@ -717,8 +717,8 @@ GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create)
|
||||||
GuiConsoleUseDefaults(Console, GuiData, Console->ActiveBuffer);
|
GuiConsoleUseDefaults(Console, GuiData, Console->ActiveBuffer);
|
||||||
if (Console->ProcessList.Flink != &Console->ProcessList)
|
if (Console->ProcessList.Flink != &Console->ProcessList)
|
||||||
{
|
{
|
||||||
ProcessData = CONTAINING_RECORD(Console->ProcessList.Flink, CSR_PROCESS, ConsoleLink);
|
ProcessData = CONTAINING_RECORD(Console->ProcessList.Flink, CONSOLE_PROCESS_DATA, ConsoleLink);
|
||||||
if (GuiConsoleOpenUserSettings(GuiData, PtrToUlong(ProcessData->ClientId.UniqueProcess), &hKey, KEY_READ, FALSE))
|
if (GuiConsoleOpenUserSettings(GuiData, PtrToUlong(ProcessData->Process->ClientId.UniqueProcess), &hKey, KEY_READ, FALSE))
|
||||||
{
|
{
|
||||||
GuiConsoleReadUserSettings(hKey, Console, GuiData, Console->ActiveBuffer);
|
GuiConsoleReadUserSettings(hKey, Console, GuiData, Console->ActiveBuffer);
|
||||||
RegCloseKey(hKey);
|
RegCloseKey(hKey);
|
||||||
|
@ -801,7 +801,7 @@ GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create)
|
||||||
|
|
||||||
SetEvent(GuiData->hGuiInitEvent);
|
SetEvent(GuiData->hGuiInitEvent);
|
||||||
|
|
||||||
return (BOOL) DefWindowProcW(hWnd, WM_NCCREATE, 0, (LPARAM) Create);
|
return (BOOL)DefWindowProcW(hWnd, WM_NCCREATE, 0, (LPARAM)Create);
|
||||||
}
|
}
|
||||||
|
|
||||||
static VOID
|
static VOID
|
||||||
|
@ -1276,7 +1276,7 @@ GuiConsoleHandleClose(HWND hWnd)
|
||||||
PCSRSS_CONSOLE Console;
|
PCSRSS_CONSOLE Console;
|
||||||
PGUI_CONSOLE_DATA GuiData;
|
PGUI_CONSOLE_DATA GuiData;
|
||||||
PLIST_ENTRY current_entry;
|
PLIST_ENTRY current_entry;
|
||||||
PCSR_PROCESS current;
|
PCONSOLE_PROCESS_DATA current;
|
||||||
|
|
||||||
GuiConsoleGetDataPointers(hWnd, &Console, &GuiData);
|
GuiConsoleGetDataPointers(hWnd, &Console, &GuiData);
|
||||||
|
|
||||||
|
@ -1285,7 +1285,7 @@ GuiConsoleHandleClose(HWND hWnd)
|
||||||
current_entry = Console->ProcessList.Flink;
|
current_entry = Console->ProcessList.Flink;
|
||||||
while (current_entry != &Console->ProcessList)
|
while (current_entry != &Console->ProcessList)
|
||||||
{
|
{
|
||||||
current = CONTAINING_RECORD(current_entry, CSR_PROCESS, ConsoleLink);
|
current = CONTAINING_RECORD(current_entry, CONSOLE_PROCESS_DATA, ConsoleLink);
|
||||||
current_entry = current_entry->Flink;
|
current_entry = current_entry->Flink;
|
||||||
|
|
||||||
/* FIXME: Windows will wait up to 5 seconds for the thread to exit.
|
/* FIXME: Windows will wait up to 5 seconds for the thread to exit.
|
||||||
|
@ -2194,7 +2194,7 @@ GuiInit(VOID)
|
||||||
wc.lpszClassName = L"Win32CsrCreateNotify";
|
wc.lpszClassName = L"Win32CsrCreateNotify";
|
||||||
wc.lpfnWndProc = GuiConsoleNotifyWndProc;
|
wc.lpfnWndProc = GuiConsoleNotifyWndProc;
|
||||||
wc.style = 0;
|
wc.style = 0;
|
||||||
wc.hInstance = (HINSTANCE) GetModuleHandleW(NULL);
|
wc.hInstance = (HINSTANCE)GetModuleHandleW(NULL);
|
||||||
wc.hIcon = NULL;
|
wc.hIcon = NULL;
|
||||||
wc.hCursor = NULL;
|
wc.hCursor = NULL;
|
||||||
wc.hbrBackground = NULL;
|
wc.hbrBackground = NULL;
|
||||||
|
@ -2212,14 +2212,14 @@ GuiInit(VOID)
|
||||||
wc.lpszClassName = L"ConsoleWindowClass";
|
wc.lpszClassName = L"ConsoleWindowClass";
|
||||||
wc.lpfnWndProc = GuiConsoleWndProc;
|
wc.lpfnWndProc = GuiConsoleWndProc;
|
||||||
wc.style = 0;
|
wc.style = 0;
|
||||||
wc.hInstance = (HINSTANCE) GetModuleHandleW(NULL);
|
wc.hInstance = (HINSTANCE)GetModuleHandleW(NULL);
|
||||||
wc.hIcon = LoadIconW(GetModuleHandleW(L"win32csr"), MAKEINTRESOURCEW(1));
|
wc.hIcon = LoadIconW(ConSrvDllInstance, MAKEINTRESOURCEW(1));
|
||||||
wc.hCursor = LoadCursorW(NULL, (LPCWSTR) IDC_ARROW);
|
wc.hCursor = LoadCursorW(NULL, (LPCWSTR) IDC_ARROW);
|
||||||
wc.hbrBackground = CreateSolidBrush(RGB(0,0,0));
|
wc.hbrBackground = CreateSolidBrush(RGB(0,0,0));
|
||||||
wc.lpszMenuName = NULL;
|
wc.lpszMenuName = NULL;
|
||||||
wc.cbClsExtra = 0;
|
wc.cbClsExtra = 0;
|
||||||
wc.cbWndExtra = 0;
|
wc.cbWndExtra = 0;
|
||||||
wc.hIconSm = LoadImageW(GetModuleHandleW(L"win32csr"), MAKEINTRESOURCEW(1), IMAGE_ICON,
|
wc.hIconSm = LoadImageW(ConSrvDllInstance, MAKEINTRESOURCEW(1), IMAGE_ICON,
|
||||||
GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON),
|
GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON),
|
||||||
LR_SHARED);
|
LR_SHARED);
|
||||||
if (RegisterClassExW(&wc) == 0)
|
if (RegisterClassExW(&wc) == 0)
|
||||||
|
@ -2255,7 +2255,7 @@ GuiChangeTitle(PCSRSS_CONSOLE Console)
|
||||||
Title = L"";
|
Title = L"";
|
||||||
}
|
}
|
||||||
|
|
||||||
SendMessageW(Console->hWindow, WM_SETTEXT, 0, (LPARAM) Title);
|
SendMessageW(Console->hWindow, WM_SETTEXT, 0, (LPARAM)Title);
|
||||||
|
|
||||||
if (NULL != Buffer)
|
if (NULL != Buffer)
|
||||||
{
|
{
|
||||||
|
@ -2277,7 +2277,7 @@ GuiChangeIcon(PCSRSS_CONSOLE Console, HICON hWindowIcon)
|
||||||
static VOID WINAPI
|
static VOID WINAPI
|
||||||
GuiCleanupConsole(PCSRSS_CONSOLE Console)
|
GuiCleanupConsole(PCSRSS_CONSOLE Console)
|
||||||
{
|
{
|
||||||
SendMessageW(NotifyWnd, PM_DESTROY_CONSOLE, 0, (LPARAM) Console);
|
SendMessageW(NotifyWnd, PM_DESTROY_CONSOLE, 0, (LPARAM)Console);
|
||||||
}
|
}
|
||||||
|
|
||||||
static CSRSS_CONSOLE_VTBL GuiVtbl =
|
static CSRSS_CONSOLE_VTBL GuiVtbl =
|
||||||
|
@ -2362,7 +2362,7 @@ GuiInitConsole(PCSRSS_CONSOLE Console, int ShowCmd)
|
||||||
*/
|
*/
|
||||||
GuiData->hGuiInitEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
|
GuiData->hGuiInitEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
|
||||||
/* create console */
|
/* create console */
|
||||||
PostMessageW(NotifyWnd, PM_CREATE_CONSOLE, ShowCmd, (LPARAM) Console);
|
PostMessageW(NotifyWnd, PM_CREATE_CONSOLE, ShowCmd, (LPARAM)Console);
|
||||||
|
|
||||||
/* wait untill initialization has finished */
|
/* wait untill initialization has finished */
|
||||||
WaitForSingleObject(GuiData->hGuiInitEvent, INFINITE);
|
WaitForSingleObject(GuiData->hGuiInitEvent, INFINITE);
|
||||||
|
|
|
@ -15,15 +15,6 @@
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
|
|
||||||
typedef struct _CSRSS_HANDLE
|
|
||||||
{
|
|
||||||
Object_t *Object;
|
|
||||||
DWORD Access;
|
|
||||||
BOOL Inheritable;
|
|
||||||
DWORD ShareMode;
|
|
||||||
} CSRSS_HANDLE, *PCSRSS_HANDLE;
|
|
||||||
|
|
||||||
|
|
||||||
/* FUNCTIONS *****************************************************************/
|
/* FUNCTIONS *****************************************************************/
|
||||||
|
|
||||||
static
|
static
|
||||||
|
@ -80,7 +71,7 @@ Win32CsrCloseHandleEntry(PCSRSS_HANDLE Entry)
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
FASTCALL
|
FASTCALL
|
||||||
Win32CsrReleaseObject(PCSR_PROCESS ProcessData,
|
Win32CsrReleaseObject(PCONSOLE_PROCESS_DATA ProcessData,
|
||||||
HANDLE Handle)
|
HANDLE Handle)
|
||||||
{
|
{
|
||||||
ULONG_PTR h = (ULONG_PTR)Handle >> 2;
|
ULONG_PTR h = (ULONG_PTR)Handle >> 2;
|
||||||
|
@ -100,7 +91,7 @@ Win32CsrReleaseObject(PCSR_PROCESS ProcessData,
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
FASTCALL
|
FASTCALL
|
||||||
Win32CsrLockObject(PCSR_PROCESS ProcessData,
|
Win32CsrLockObject(PCONSOLE_PROCESS_DATA ProcessData,
|
||||||
HANDLE Handle,
|
HANDLE Handle,
|
||||||
Object_t **Object,
|
Object_t **Object,
|
||||||
DWORD Access,
|
DWORD Access,
|
||||||
|
@ -108,7 +99,7 @@ Win32CsrLockObject(PCSR_PROCESS ProcessData,
|
||||||
{
|
{
|
||||||
ULONG_PTR h = (ULONG_PTR)Handle >> 2;
|
ULONG_PTR h = (ULONG_PTR)Handle >> 2;
|
||||||
|
|
||||||
DPRINT("CsrGetObject, Object: %x, %x, %x\n",
|
DPRINT("Win32CsrLockObject, Object: %x, %x, %x\n",
|
||||||
Object, Handle, ProcessData ? ProcessData->HandleTableSize : 0);
|
Object, Handle, ProcessData ? ProcessData->HandleTableSize : 0);
|
||||||
|
|
||||||
RtlEnterCriticalSection(&ProcessData->HandleTableLock);
|
RtlEnterCriticalSection(&ProcessData->HandleTableLock);
|
||||||
|
@ -139,10 +130,87 @@ Win32CsrUnlockObject(Object_t *Object)
|
||||||
ConioDeleteConsole(&Console->Header);
|
ConioDeleteConsole(&Console->Header);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
ConsoleNewProcess(PCSR_PROCESS SourceProcess,
|
||||||
|
PCSR_PROCESS TargetProcess)
|
||||||
|
{
|
||||||
|
PCONSOLE_PROCESS_DATA SourceProcessData, TargetProcessData;
|
||||||
|
ULONG i;
|
||||||
|
|
||||||
|
DPRINT1("ConsoleNewProcess inside\n");
|
||||||
|
DPRINT1("SourceProcess = 0x%p ; TargetProcess = 0x%p\n", SourceProcess, TargetProcess);
|
||||||
|
|
||||||
|
/* An empty target process is invalid */
|
||||||
|
if (!TargetProcess)
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
DPRINT1("ConsoleNewProcess - OK\n");
|
||||||
|
|
||||||
|
TargetProcessData = ConsoleGetPerProcessData(TargetProcess);
|
||||||
|
|
||||||
|
/* Initialize the new (target) process */
|
||||||
|
TargetProcessData->Process = TargetProcess;
|
||||||
|
RtlInitializeCriticalSection(&TargetProcessData->HandleTableLock);
|
||||||
|
|
||||||
|
/* Do nothing if the source process is NULL */
|
||||||
|
if (!SourceProcess)
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
|
||||||
|
SourceProcessData = ConsoleGetPerProcessData(SourceProcess);
|
||||||
|
|
||||||
|
// TODO: Check if one of the processes is really a CONSOLE.
|
||||||
|
/*
|
||||||
|
if (!(CreateProcessRequest->CreationFlags & (CREATE_NEW_CONSOLE | DETACHED_PROCESS)))
|
||||||
|
{
|
||||||
|
// NewProcess == TargetProcess.
|
||||||
|
NewProcess->ParentConsole = Process->Console;
|
||||||
|
NewProcess->bInheritHandles = CreateProcessRequest->bInheritHandles;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Only inherit if the if the flag was set */
|
||||||
|
if (!TargetProcessData->bInheritHandles) return STATUS_SUCCESS;
|
||||||
|
|
||||||
|
if (TargetProcessData->HandleTableSize)
|
||||||
|
{
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
RtlEnterCriticalSection(&SourceProcessData->HandleTableLock);
|
||||||
|
|
||||||
|
TargetProcessData->HandleTable = RtlAllocateHeap(ConSrvHeap,
|
||||||
|
HEAP_ZERO_MEMORY,
|
||||||
|
SourceProcessData->HandleTableSize
|
||||||
|
* sizeof(CSRSS_HANDLE));
|
||||||
|
if (TargetProcessData->HandleTable == NULL)
|
||||||
|
{
|
||||||
|
RtlLeaveCriticalSection(&SourceProcessData->HandleTableLock);
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
TargetProcessData->HandleTableSize = SourceProcessData->HandleTableSize;
|
||||||
|
|
||||||
|
for (i = 0; i < SourceProcessData->HandleTableSize; i++)
|
||||||
|
{
|
||||||
|
if (SourceProcessData->HandleTable[i].Object != NULL &&
|
||||||
|
SourceProcessData->HandleTable[i].Inheritable)
|
||||||
|
{
|
||||||
|
TargetProcessData->HandleTable[i] = SourceProcessData->HandleTable[i];
|
||||||
|
Win32CsrCreateHandleEntry(&TargetProcessData->HandleTable[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
RtlLeaveCriticalSection(&SourceProcessData->HandleTableLock);
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
VOID
|
VOID
|
||||||
WINAPI
|
WINAPI
|
||||||
Win32CsrReleaseConsole(PCSR_PROCESS ProcessData)
|
Win32CsrReleaseConsole(PCSR_PROCESS Process)
|
||||||
{
|
{
|
||||||
|
PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(Process);
|
||||||
PCSRSS_CONSOLE Console;
|
PCSRSS_CONSOLE Console;
|
||||||
ULONG i;
|
ULONG i;
|
||||||
|
|
||||||
|
@ -172,7 +240,7 @@ Win32CsrReleaseConsole(PCSR_PROCESS ProcessData)
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
FASTCALL
|
FASTCALL
|
||||||
Win32CsrInsertObject(PCSR_PROCESS ProcessData,
|
Win32CsrInsertObject(PCONSOLE_PROCESS_DATA ProcessData,
|
||||||
PHANDLE Handle,
|
PHANDLE Handle,
|
||||||
Object_t *Object,
|
Object_t *Object,
|
||||||
DWORD Access,
|
DWORD Access,
|
||||||
|
@ -215,112 +283,22 @@ Win32CsrInsertObject(PCSR_PROCESS ProcessData,
|
||||||
Win32CsrCreateHandleEntry(&ProcessData->HandleTable[i]);
|
Win32CsrCreateHandleEntry(&ProcessData->HandleTable[i]);
|
||||||
*Handle = UlongToHandle((i << 2) | 0x3);
|
*Handle = UlongToHandle((i << 2) | 0x3);
|
||||||
RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
|
RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
|
||||||
return(STATUS_SUCCESS);
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS
|
|
||||||
WINAPI
|
|
||||||
Win32CsrDuplicateHandleTable(PCSR_PROCESS SourceProcessData,
|
|
||||||
PCSR_PROCESS TargetProcessData)
|
|
||||||
{
|
|
||||||
ULONG i;
|
|
||||||
|
|
||||||
/* Only inherit if the flag was set */
|
|
||||||
if (!TargetProcessData->bInheritHandles) return STATUS_SUCCESS;
|
|
||||||
|
|
||||||
if (TargetProcessData->HandleTableSize)
|
|
||||||
{
|
|
||||||
return STATUS_INVALID_PARAMETER;
|
|
||||||
}
|
|
||||||
|
|
||||||
RtlEnterCriticalSection(&SourceProcessData->HandleTableLock);
|
|
||||||
|
|
||||||
/* we are called from CreateProcessData, it isn't necessary to lock the target process data */
|
|
||||||
|
|
||||||
TargetProcessData->HandleTable = RtlAllocateHeap(ConSrvHeap,
|
|
||||||
HEAP_ZERO_MEMORY,
|
|
||||||
SourceProcessData->HandleTableSize
|
|
||||||
* sizeof(CSRSS_HANDLE));
|
|
||||||
if (TargetProcessData->HandleTable == NULL)
|
|
||||||
{
|
|
||||||
RtlLeaveCriticalSection(&SourceProcessData->HandleTableLock);
|
|
||||||
return(STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
|
||||||
TargetProcessData->HandleTableSize = SourceProcessData->HandleTableSize;
|
|
||||||
for (i = 0; i < SourceProcessData->HandleTableSize; i++)
|
|
||||||
{
|
|
||||||
if (SourceProcessData->HandleTable[i].Object != NULL &&
|
|
||||||
SourceProcessData->HandleTable[i].Inheritable)
|
|
||||||
{
|
|
||||||
TargetProcessData->HandleTable[i] = SourceProcessData->HandleTable[i];
|
|
||||||
Win32CsrCreateHandleEntry(&TargetProcessData->HandleTable[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
RtlLeaveCriticalSection(&SourceProcessData->HandleTableLock);
|
|
||||||
return(STATUS_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
CSR_API(CsrGetHandle)
|
|
||||||
{
|
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
|
||||||
PCSRSS_GET_INPUT_HANDLE GetInputHandleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetInputHandleRequest;
|
|
||||||
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process;
|
|
||||||
|
|
||||||
GetInputHandleRequest->Handle = INVALID_HANDLE_VALUE;
|
|
||||||
|
|
||||||
RtlEnterCriticalSection(&ProcessData->HandleTableLock);
|
|
||||||
if (ProcessData->Console)
|
|
||||||
{
|
|
||||||
DWORD DesiredAccess = GetInputHandleRequest->Access;
|
|
||||||
DWORD ShareMode = GetInputHandleRequest->ShareMode;
|
|
||||||
|
|
||||||
PCSRSS_CONSOLE Console = ProcessData->Console;
|
|
||||||
Object_t *Object;
|
|
||||||
|
|
||||||
EnterCriticalSection(&Console->Lock);
|
|
||||||
if (ApiMessage->ApiNumber == ConsolepGetHandleInformation)
|
|
||||||
Object = &Console->ActiveBuffer->Header;
|
|
||||||
else
|
|
||||||
Object = &Console->Header;
|
|
||||||
|
|
||||||
if (((DesiredAccess & GENERIC_READ) && Object->ExclusiveRead != 0) ||
|
|
||||||
((DesiredAccess & GENERIC_WRITE) && Object->ExclusiveWrite != 0) ||
|
|
||||||
(!(ShareMode & FILE_SHARE_READ) && Object->AccessRead != 0) ||
|
|
||||||
(!(ShareMode & FILE_SHARE_WRITE) && Object->AccessWrite != 0))
|
|
||||||
{
|
|
||||||
DPRINT1("Sharing violation\n");
|
|
||||||
Status = STATUS_SHARING_VIOLATION;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Status = Win32CsrInsertObject(ProcessData,
|
|
||||||
&GetInputHandleRequest->Handle,
|
|
||||||
Object,
|
|
||||||
DesiredAccess,
|
|
||||||
GetInputHandleRequest->Inheritable,
|
|
||||||
ShareMode);
|
|
||||||
}
|
|
||||||
LeaveCriticalSection(&Console->Lock);
|
|
||||||
}
|
|
||||||
RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
|
|
||||||
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
// CSR_API(CsrSetHandle) ??
|
|
||||||
|
|
||||||
CSR_API(SrvCloseHandle)
|
CSR_API(SrvCloseHandle)
|
||||||
{
|
{
|
||||||
PCSRSS_CLOSE_HANDLE CloseHandleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.CloseHandleRequest;
|
PCSRSS_CLOSE_HANDLE CloseHandleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.CloseHandleRequest;
|
||||||
|
|
||||||
return Win32CsrReleaseObject(CsrGetClientThread()->Process, CloseHandleRequest->Handle);
|
return Win32CsrReleaseObject(ConsoleGetPerProcessData(CsrGetClientThread()->Process),
|
||||||
|
CloseHandleRequest->Handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
CSR_API(SrvVerifyConsoleIoHandle)
|
CSR_API(SrvVerifyConsoleIoHandle)
|
||||||
{
|
{
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
PCSRSS_VERIFY_HANDLE VerifyHandleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.VerifyHandleRequest;
|
PCSRSS_VERIFY_HANDLE VerifyHandleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.VerifyHandleRequest;
|
||||||
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process;
|
PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrGetClientThread()->Process);
|
||||||
ULONG_PTR Index;
|
ULONG_PTR Index;
|
||||||
|
|
||||||
Index = (ULONG_PTR)VerifyHandleRequest->Handle >> 2;
|
Index = (ULONG_PTR)VerifyHandleRequest->Handle >> 2;
|
||||||
|
@ -342,7 +320,7 @@ CSR_API(SrvDuplicateHandle)
|
||||||
PCSRSS_HANDLE Entry;
|
PCSRSS_HANDLE Entry;
|
||||||
DWORD DesiredAccess;
|
DWORD DesiredAccess;
|
||||||
PCSRSS_DUPLICATE_HANDLE DuplicateHandleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.DuplicateHandleRequest;
|
PCSRSS_DUPLICATE_HANDLE DuplicateHandleRequest = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.DuplicateHandleRequest;
|
||||||
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process;
|
PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(CsrGetClientThread()->Process);
|
||||||
|
|
||||||
Index = (ULONG_PTR)DuplicateHandleRequest->Handle >> 2;
|
Index = (ULONG_PTR)DuplicateHandleRequest->Handle >> 2;
|
||||||
RtlEnterCriticalSection(&ProcessData->HandleTableLock);
|
RtlEnterCriticalSection(&ProcessData->HandleTableLock);
|
||||||
|
@ -372,11 +350,11 @@ CSR_API(SrvDuplicateHandle)
|
||||||
}
|
}
|
||||||
|
|
||||||
ApiMessage->Status = Win32CsrInsertObject(ProcessData,
|
ApiMessage->Status = Win32CsrInsertObject(ProcessData,
|
||||||
&DuplicateHandleRequest->Handle,
|
&DuplicateHandleRequest->Handle,
|
||||||
Entry->Object,
|
Entry->Object,
|
||||||
DesiredAccess,
|
DesiredAccess,
|
||||||
DuplicateHandleRequest->Inheritable,
|
DuplicateHandleRequest->Inheritable,
|
||||||
Entry->ShareMode);
|
Entry->ShareMode);
|
||||||
if (NT_SUCCESS(ApiMessage->Status)
|
if (NT_SUCCESS(ApiMessage->Status)
|
||||||
&& DuplicateHandleRequest->Options & DUPLICATE_CLOSE_SOURCE)
|
&& DuplicateHandleRequest->Options & DUPLICATE_CLOSE_SOURCE)
|
||||||
{
|
{
|
||||||
|
@ -391,7 +369,9 @@ CSR_API(CsrGetInputWaitHandle)
|
||||||
{
|
{
|
||||||
PCSRSS_GET_INPUT_WAIT_HANDLE GetConsoleInputWaitHandle = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetConsoleInputWaitHandle;
|
PCSRSS_GET_INPUT_WAIT_HANDLE GetConsoleInputWaitHandle = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetConsoleInputWaitHandle;
|
||||||
|
|
||||||
GetConsoleInputWaitHandle->InputWaitHandle = CsrGetClientThread()->Process->ConsoleEvent;
|
GetConsoleInputWaitHandle->InputWaitHandle =
|
||||||
|
ConsoleGetPerProcessData(CsrGetClientThread()->Process)->ConsoleEvent;
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -152,21 +152,21 @@ HistoryDeleteBuffer(PHISTORY_BUFFER Hist)
|
||||||
CSR_API(SrvGetConsoleCommandHistoryLength)
|
CSR_API(SrvGetConsoleCommandHistoryLength)
|
||||||
{
|
{
|
||||||
PCSRSS_GET_COMMAND_HISTORY_LENGTH GetCommandHistoryLength = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetCommandHistoryLength;
|
PCSRSS_GET_COMMAND_HISTORY_LENGTH GetCommandHistoryLength = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetCommandHistoryLength;
|
||||||
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process;
|
PCSR_PROCESS Process = CsrGetClientThread()->Process;
|
||||||
PCSRSS_CONSOLE Console;
|
PCSRSS_CONSOLE Console;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PHISTORY_BUFFER Hist;
|
PHISTORY_BUFFER Hist;
|
||||||
ULONG Length = 0;
|
ULONG Length = 0;
|
||||||
INT i;
|
INT i;
|
||||||
|
|
||||||
if (!Win32CsrValidateBuffer(ProcessData,
|
if (!Win32CsrValidateBuffer(Process,
|
||||||
GetCommandHistoryLength->ExeName.Buffer,
|
GetCommandHistoryLength->ExeName.Buffer,
|
||||||
GetCommandHistoryLength->ExeName.Length, 1))
|
GetCommandHistoryLength->ExeName.Length, 1))
|
||||||
{
|
{
|
||||||
return STATUS_ACCESS_VIOLATION;
|
return STATUS_ACCESS_VIOLATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConioConsoleFromProcessData(ProcessData, &Console);
|
Status = ConioConsoleFromProcessData(ConsoleGetPerProcessData(Process), &Console);
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
Hist = HistoryFindBuffer(Console, &GetCommandHistoryLength->ExeName);
|
Hist = HistoryFindBuffer(Console, &GetCommandHistoryLength->ExeName);
|
||||||
|
@ -184,7 +184,7 @@ CSR_API(SrvGetConsoleCommandHistoryLength)
|
||||||
CSR_API(SrvGetConsoleCommandHistory)
|
CSR_API(SrvGetConsoleCommandHistory)
|
||||||
{
|
{
|
||||||
PCSRSS_GET_COMMAND_HISTORY GetCommandHistory = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetCommandHistory;
|
PCSRSS_GET_COMMAND_HISTORY GetCommandHistory = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetCommandHistory;
|
||||||
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process;
|
PCSR_PROCESS Process = CsrGetClientThread()->Process;
|
||||||
PCSRSS_CONSOLE Console;
|
PCSRSS_CONSOLE Console;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
PHISTORY_BUFFER Hist;
|
PHISTORY_BUFFER Hist;
|
||||||
|
@ -192,15 +192,15 @@ CSR_API(SrvGetConsoleCommandHistory)
|
||||||
ULONG BufferSize = GetCommandHistory->Length;
|
ULONG BufferSize = GetCommandHistory->Length;
|
||||||
INT i;
|
INT i;
|
||||||
|
|
||||||
if (!Win32CsrValidateBuffer(ProcessData, Buffer, BufferSize, 1) ||
|
if (!Win32CsrValidateBuffer(Process, Buffer, BufferSize, 1) ||
|
||||||
!Win32CsrValidateBuffer(ProcessData,
|
!Win32CsrValidateBuffer(Process,
|
||||||
GetCommandHistory->ExeName.Buffer,
|
GetCommandHistory->ExeName.Buffer,
|
||||||
GetCommandHistory->ExeName.Length, 1))
|
GetCommandHistory->ExeName.Length, 1))
|
||||||
{
|
{
|
||||||
return STATUS_ACCESS_VIOLATION;
|
return STATUS_ACCESS_VIOLATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConioConsoleFromProcessData(ProcessData, &Console);
|
Status = ConioConsoleFromProcessData(ConsoleGetPerProcessData(Process), &Console);
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
Hist = HistoryFindBuffer(Console, &GetCommandHistory->ExeName);
|
Hist = HistoryFindBuffer(Console, &GetCommandHistory->ExeName);
|
||||||
|
@ -228,19 +228,19 @@ CSR_API(SrvGetConsoleCommandHistory)
|
||||||
CSR_API(SrvExpungeConsoleCommandHistory)
|
CSR_API(SrvExpungeConsoleCommandHistory)
|
||||||
{
|
{
|
||||||
PCSRSS_EXPUNGE_COMMAND_HISTORY ExpungeCommandHistory = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ExpungeCommandHistory;
|
PCSRSS_EXPUNGE_COMMAND_HISTORY ExpungeCommandHistory = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ExpungeCommandHistory;
|
||||||
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process;
|
PCSR_PROCESS Process = CsrGetClientThread()->Process;
|
||||||
PCSRSS_CONSOLE Console;
|
PCSRSS_CONSOLE Console;
|
||||||
PHISTORY_BUFFER Hist;
|
PHISTORY_BUFFER Hist;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
||||||
if (!Win32CsrValidateBuffer(ProcessData,
|
if (!Win32CsrValidateBuffer(Process,
|
||||||
ExpungeCommandHistory->ExeName.Buffer,
|
ExpungeCommandHistory->ExeName.Buffer,
|
||||||
ExpungeCommandHistory->ExeName.Length, 1))
|
ExpungeCommandHistory->ExeName.Length, 1))
|
||||||
{
|
{
|
||||||
return STATUS_ACCESS_VIOLATION;
|
return STATUS_ACCESS_VIOLATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConioConsoleFromProcessData(ProcessData, &Console);
|
Status = ConioConsoleFromProcessData(ConsoleGetPerProcessData(Process), &Console);
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
Hist = HistoryFindBuffer(Console, &ExpungeCommandHistory->ExeName);
|
Hist = HistoryFindBuffer(Console, &ExpungeCommandHistory->ExeName);
|
||||||
|
@ -253,21 +253,21 @@ CSR_API(SrvExpungeConsoleCommandHistory)
|
||||||
CSR_API(SrvSetConsoleNumberOfCommands)
|
CSR_API(SrvSetConsoleNumberOfCommands)
|
||||||
{
|
{
|
||||||
PCSRSS_SET_HISTORY_NUMBER_COMMANDS SetHistoryNumberCommands = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetHistoryNumberCommands;
|
PCSRSS_SET_HISTORY_NUMBER_COMMANDS SetHistoryNumberCommands = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetHistoryNumberCommands;
|
||||||
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process;
|
PCSR_PROCESS Process = CsrGetClientThread()->Process;
|
||||||
PCSRSS_CONSOLE Console;
|
PCSRSS_CONSOLE Console;
|
||||||
PHISTORY_BUFFER Hist;
|
PHISTORY_BUFFER Hist;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
WORD MaxEntries = SetHistoryNumberCommands->NumCommands;
|
WORD MaxEntries = SetHistoryNumberCommands->NumCommands;
|
||||||
PUNICODE_STRING OldEntryList, NewEntryList;
|
PUNICODE_STRING OldEntryList, NewEntryList;
|
||||||
|
|
||||||
if (!Win32CsrValidateBuffer(ProcessData,
|
if (!Win32CsrValidateBuffer(Process,
|
||||||
SetHistoryNumberCommands->ExeName.Buffer,
|
SetHistoryNumberCommands->ExeName.Buffer,
|
||||||
SetHistoryNumberCommands->ExeName.Length, 1))
|
SetHistoryNumberCommands->ExeName.Length, 1))
|
||||||
{
|
{
|
||||||
return STATUS_ACCESS_VIOLATION;
|
return STATUS_ACCESS_VIOLATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = ConioConsoleFromProcessData(ProcessData, &Console);
|
Status = ConioConsoleFromProcessData(ConsoleGetPerProcessData(Process), &Console);
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
Hist = HistoryFindBuffer(Console, &SetHistoryNumberCommands->ExeName);
|
Hist = HistoryFindBuffer(Console, &SetHistoryNumberCommands->ExeName);
|
||||||
|
@ -304,7 +304,7 @@ CSR_API(SrvGetConsoleHistory)
|
||||||
{
|
{
|
||||||
PCSRSS_GET_HISTORY_INFO GetHistoryInfo = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetHistoryInfo;
|
PCSRSS_GET_HISTORY_INFO GetHistoryInfo = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetHistoryInfo;
|
||||||
PCSRSS_CONSOLE Console;
|
PCSRSS_CONSOLE Console;
|
||||||
NTSTATUS Status = ConioConsoleFromProcessData(CsrGetClientThread()->Process, &Console);
|
NTSTATUS Status = ConioConsoleFromProcessData(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console);
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
GetHistoryInfo->HistoryBufferSize = Console->HistoryBufferSize;
|
GetHistoryInfo->HistoryBufferSize = Console->HistoryBufferSize;
|
||||||
|
@ -319,7 +319,7 @@ CSR_API(SrvSetConsoleHistory)
|
||||||
{
|
{
|
||||||
PCSRSS_SET_HISTORY_INFO SetHistoryInfo = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetHistoryInfo;
|
PCSRSS_SET_HISTORY_INFO SetHistoryInfo = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetHistoryInfo;
|
||||||
PCSRSS_CONSOLE Console;
|
PCSRSS_CONSOLE Console;
|
||||||
NTSTATUS Status = ConioConsoleFromProcessData(CsrGetClientThread()->Process, &Console);
|
NTSTATUS Status = ConioConsoleFromProcessData(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console);
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
Console->HistoryBufferSize = (WORD)SetHistoryInfo->HistoryBufferSize;
|
Console->HistoryBufferSize = (WORD)SetHistoryInfo->HistoryBufferSize;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue