mirror of
https://github.com/reactos/reactos.git
synced 2025-04-18 03:34:11 +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;
|
||||
WCHAR szMenuString[255];
|
||||
HMENU hSubMenu;
|
||||
HINSTANCE hInst = GetModuleHandleW(L"win32csr");
|
||||
|
||||
do
|
||||
{
|
||||
if (Items[i].uID != (UINT)-1)
|
||||
{
|
||||
if (LoadStringW(hInst,
|
||||
if (LoadStringW(ConSrvDllInstance,
|
||||
Items[i].uID,
|
||||
szMenuString,
|
||||
sizeof(szMenuString) / sizeof(szMenuString[0])) > 0)
|
||||
|
@ -406,15 +405,16 @@ static VOID
|
|||
GuiConsoleWriteUserSettings(PCSRSS_CONSOLE Console, PGUI_CONSOLE_DATA GuiData)
|
||||
{
|
||||
HKEY hKey;
|
||||
PCSR_PROCESS ProcessData;
|
||||
PCONSOLE_PROCESS_DATA ProcessData;
|
||||
|
||||
if (Console->ProcessList.Flink == &Console->ProcessList)
|
||||
{
|
||||
DPRINT("GuiConsoleWriteUserSettings: No Process!!!\n");
|
||||
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;
|
||||
}
|
||||
|
@ -703,7 +703,7 @@ GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create)
|
|||
HFONT OldFont;
|
||||
TEXTMETRICW Metrics;
|
||||
SIZE CharSize;
|
||||
PCSR_PROCESS ProcessData;
|
||||
PCONSOLE_PROCESS_DATA ProcessData;
|
||||
HKEY hKey;
|
||||
|
||||
Console->hWindow = hWnd;
|
||||
|
@ -717,8 +717,8 @@ GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create)
|
|||
GuiConsoleUseDefaults(Console, GuiData, Console->ActiveBuffer);
|
||||
if (Console->ProcessList.Flink != &Console->ProcessList)
|
||||
{
|
||||
ProcessData = CONTAINING_RECORD(Console->ProcessList.Flink, CSR_PROCESS, ConsoleLink);
|
||||
if (GuiConsoleOpenUserSettings(GuiData, PtrToUlong(ProcessData->ClientId.UniqueProcess), &hKey, KEY_READ, FALSE))
|
||||
ProcessData = CONTAINING_RECORD(Console->ProcessList.Flink, CONSOLE_PROCESS_DATA, ConsoleLink);
|
||||
if (GuiConsoleOpenUserSettings(GuiData, PtrToUlong(ProcessData->Process->ClientId.UniqueProcess), &hKey, KEY_READ, FALSE))
|
||||
{
|
||||
GuiConsoleReadUserSettings(hKey, Console, GuiData, Console->ActiveBuffer);
|
||||
RegCloseKey(hKey);
|
||||
|
@ -801,7 +801,7 @@ GuiConsoleHandleNcCreate(HWND hWnd, CREATESTRUCTW *Create)
|
|||
|
||||
SetEvent(GuiData->hGuiInitEvent);
|
||||
|
||||
return (BOOL) DefWindowProcW(hWnd, WM_NCCREATE, 0, (LPARAM) Create);
|
||||
return (BOOL)DefWindowProcW(hWnd, WM_NCCREATE, 0, (LPARAM)Create);
|
||||
}
|
||||
|
||||
static VOID
|
||||
|
@ -1276,7 +1276,7 @@ GuiConsoleHandleClose(HWND hWnd)
|
|||
PCSRSS_CONSOLE Console;
|
||||
PGUI_CONSOLE_DATA GuiData;
|
||||
PLIST_ENTRY current_entry;
|
||||
PCSR_PROCESS current;
|
||||
PCONSOLE_PROCESS_DATA current;
|
||||
|
||||
GuiConsoleGetDataPointers(hWnd, &Console, &GuiData);
|
||||
|
||||
|
@ -1285,7 +1285,7 @@ GuiConsoleHandleClose(HWND hWnd)
|
|||
current_entry = Console->ProcessList.Flink;
|
||||
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;
|
||||
|
||||
/* FIXME: Windows will wait up to 5 seconds for the thread to exit.
|
||||
|
@ -2194,7 +2194,7 @@ GuiInit(VOID)
|
|||
wc.lpszClassName = L"Win32CsrCreateNotify";
|
||||
wc.lpfnWndProc = GuiConsoleNotifyWndProc;
|
||||
wc.style = 0;
|
||||
wc.hInstance = (HINSTANCE) GetModuleHandleW(NULL);
|
||||
wc.hInstance = (HINSTANCE)GetModuleHandleW(NULL);
|
||||
wc.hIcon = NULL;
|
||||
wc.hCursor = NULL;
|
||||
wc.hbrBackground = NULL;
|
||||
|
@ -2212,14 +2212,14 @@ GuiInit(VOID)
|
|||
wc.lpszClassName = L"ConsoleWindowClass";
|
||||
wc.lpfnWndProc = GuiConsoleWndProc;
|
||||
wc.style = 0;
|
||||
wc.hInstance = (HINSTANCE) GetModuleHandleW(NULL);
|
||||
wc.hIcon = LoadIconW(GetModuleHandleW(L"win32csr"), MAKEINTRESOURCEW(1));
|
||||
wc.hInstance = (HINSTANCE)GetModuleHandleW(NULL);
|
||||
wc.hIcon = LoadIconW(ConSrvDllInstance, MAKEINTRESOURCEW(1));
|
||||
wc.hCursor = LoadCursorW(NULL, (LPCWSTR) IDC_ARROW);
|
||||
wc.hbrBackground = CreateSolidBrush(RGB(0,0,0));
|
||||
wc.lpszMenuName = NULL;
|
||||
wc.cbClsExtra = 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),
|
||||
LR_SHARED);
|
||||
if (RegisterClassExW(&wc) == 0)
|
||||
|
@ -2255,7 +2255,7 @@ GuiChangeTitle(PCSRSS_CONSOLE Console)
|
|||
Title = L"";
|
||||
}
|
||||
|
||||
SendMessageW(Console->hWindow, WM_SETTEXT, 0, (LPARAM) Title);
|
||||
SendMessageW(Console->hWindow, WM_SETTEXT, 0, (LPARAM)Title);
|
||||
|
||||
if (NULL != Buffer)
|
||||
{
|
||||
|
@ -2277,7 +2277,7 @@ GuiChangeIcon(PCSRSS_CONSOLE Console, HICON hWindowIcon)
|
|||
static VOID WINAPI
|
||||
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 =
|
||||
|
@ -2362,7 +2362,7 @@ GuiInitConsole(PCSRSS_CONSOLE Console, int ShowCmd)
|
|||
*/
|
||||
GuiData->hGuiInitEvent = CreateEventW(NULL, FALSE, FALSE, NULL);
|
||||
/* create console */
|
||||
PostMessageW(NotifyWnd, PM_CREATE_CONSOLE, ShowCmd, (LPARAM) Console);
|
||||
PostMessageW(NotifyWnd, PM_CREATE_CONSOLE, ShowCmd, (LPARAM)Console);
|
||||
|
||||
/* wait untill initialization has finished */
|
||||
WaitForSingleObject(GuiData->hGuiInitEvent, INFINITE);
|
||||
|
|
|
@ -15,15 +15,6 @@
|
|||
#include <debug.h>
|
||||
|
||||
|
||||
typedef struct _CSRSS_HANDLE
|
||||
{
|
||||
Object_t *Object;
|
||||
DWORD Access;
|
||||
BOOL Inheritable;
|
||||
DWORD ShareMode;
|
||||
} CSRSS_HANDLE, *PCSRSS_HANDLE;
|
||||
|
||||
|
||||
/* FUNCTIONS *****************************************************************/
|
||||
|
||||
static
|
||||
|
@ -80,7 +71,7 @@ Win32CsrCloseHandleEntry(PCSRSS_HANDLE Entry)
|
|||
|
||||
NTSTATUS
|
||||
FASTCALL
|
||||
Win32CsrReleaseObject(PCSR_PROCESS ProcessData,
|
||||
Win32CsrReleaseObject(PCONSOLE_PROCESS_DATA ProcessData,
|
||||
HANDLE Handle)
|
||||
{
|
||||
ULONG_PTR h = (ULONG_PTR)Handle >> 2;
|
||||
|
@ -100,7 +91,7 @@ Win32CsrReleaseObject(PCSR_PROCESS ProcessData,
|
|||
|
||||
NTSTATUS
|
||||
FASTCALL
|
||||
Win32CsrLockObject(PCSR_PROCESS ProcessData,
|
||||
Win32CsrLockObject(PCONSOLE_PROCESS_DATA ProcessData,
|
||||
HANDLE Handle,
|
||||
Object_t **Object,
|
||||
DWORD Access,
|
||||
|
@ -108,7 +99,7 @@ Win32CsrLockObject(PCSR_PROCESS ProcessData,
|
|||
{
|
||||
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);
|
||||
|
||||
RtlEnterCriticalSection(&ProcessData->HandleTableLock);
|
||||
|
@ -139,10 +130,87 @@ Win32CsrUnlockObject(Object_t *Object)
|
|||
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
|
||||
WINAPI
|
||||
Win32CsrReleaseConsole(PCSR_PROCESS ProcessData)
|
||||
Win32CsrReleaseConsole(PCSR_PROCESS Process)
|
||||
{
|
||||
PCONSOLE_PROCESS_DATA ProcessData = ConsoleGetPerProcessData(Process);
|
||||
PCSRSS_CONSOLE Console;
|
||||
ULONG i;
|
||||
|
||||
|
@ -172,7 +240,7 @@ Win32CsrReleaseConsole(PCSR_PROCESS ProcessData)
|
|||
|
||||
NTSTATUS
|
||||
FASTCALL
|
||||
Win32CsrInsertObject(PCSR_PROCESS ProcessData,
|
||||
Win32CsrInsertObject(PCONSOLE_PROCESS_DATA ProcessData,
|
||||
PHANDLE Handle,
|
||||
Object_t *Object,
|
||||
DWORD Access,
|
||||
|
@ -215,112 +283,22 @@ Win32CsrInsertObject(PCSR_PROCESS ProcessData,
|
|||
Win32CsrCreateHandleEntry(&ProcessData->HandleTable[i]);
|
||||
*Handle = UlongToHandle((i << 2) | 0x3);
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
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;
|
||||
|
||||
Index = (ULONG_PTR)VerifyHandleRequest->Handle >> 2;
|
||||
|
@ -342,7 +320,7 @@ CSR_API(SrvDuplicateHandle)
|
|||
PCSRSS_HANDLE Entry;
|
||||
DWORD DesiredAccess;
|
||||
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;
|
||||
RtlEnterCriticalSection(&ProcessData->HandleTableLock);
|
||||
|
@ -372,11 +350,11 @@ CSR_API(SrvDuplicateHandle)
|
|||
}
|
||||
|
||||
ApiMessage->Status = Win32CsrInsertObject(ProcessData,
|
||||
&DuplicateHandleRequest->Handle,
|
||||
Entry->Object,
|
||||
DesiredAccess,
|
||||
DuplicateHandleRequest->Inheritable,
|
||||
Entry->ShareMode);
|
||||
&DuplicateHandleRequest->Handle,
|
||||
Entry->Object,
|
||||
DesiredAccess,
|
||||
DuplicateHandleRequest->Inheritable,
|
||||
Entry->ShareMode);
|
||||
if (NT_SUCCESS(ApiMessage->Status)
|
||||
&& DuplicateHandleRequest->Options & DUPLICATE_CLOSE_SOURCE)
|
||||
{
|
||||
|
@ -391,7 +369,9 @@ CSR_API(CsrGetInputWaitHandle)
|
|||
{
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -152,21 +152,21 @@ HistoryDeleteBuffer(PHISTORY_BUFFER Hist)
|
|||
CSR_API(SrvGetConsoleCommandHistoryLength)
|
||||
{
|
||||
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;
|
||||
NTSTATUS Status;
|
||||
PHISTORY_BUFFER Hist;
|
||||
ULONG Length = 0;
|
||||
INT i;
|
||||
|
||||
if (!Win32CsrValidateBuffer(ProcessData,
|
||||
if (!Win32CsrValidateBuffer(Process,
|
||||
GetCommandHistoryLength->ExeName.Buffer,
|
||||
GetCommandHistoryLength->ExeName.Length, 1))
|
||||
{
|
||||
return STATUS_ACCESS_VIOLATION;
|
||||
}
|
||||
|
||||
Status = ConioConsoleFromProcessData(ProcessData, &Console);
|
||||
Status = ConioConsoleFromProcessData(ConsoleGetPerProcessData(Process), &Console);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
Hist = HistoryFindBuffer(Console, &GetCommandHistoryLength->ExeName);
|
||||
|
@ -184,7 +184,7 @@ CSR_API(SrvGetConsoleCommandHistoryLength)
|
|||
CSR_API(SrvGetConsoleCommandHistory)
|
||||
{
|
||||
PCSRSS_GET_COMMAND_HISTORY GetCommandHistory = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetCommandHistory;
|
||||
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process;
|
||||
PCSR_PROCESS Process = CsrGetClientThread()->Process;
|
||||
PCSRSS_CONSOLE Console;
|
||||
NTSTATUS Status;
|
||||
PHISTORY_BUFFER Hist;
|
||||
|
@ -192,15 +192,15 @@ CSR_API(SrvGetConsoleCommandHistory)
|
|||
ULONG BufferSize = GetCommandHistory->Length;
|
||||
INT i;
|
||||
|
||||
if (!Win32CsrValidateBuffer(ProcessData, Buffer, BufferSize, 1) ||
|
||||
!Win32CsrValidateBuffer(ProcessData,
|
||||
if (!Win32CsrValidateBuffer(Process, Buffer, BufferSize, 1) ||
|
||||
!Win32CsrValidateBuffer(Process,
|
||||
GetCommandHistory->ExeName.Buffer,
|
||||
GetCommandHistory->ExeName.Length, 1))
|
||||
{
|
||||
return STATUS_ACCESS_VIOLATION;
|
||||
}
|
||||
|
||||
Status = ConioConsoleFromProcessData(ProcessData, &Console);
|
||||
Status = ConioConsoleFromProcessData(ConsoleGetPerProcessData(Process), &Console);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
Hist = HistoryFindBuffer(Console, &GetCommandHistory->ExeName);
|
||||
|
@ -228,19 +228,19 @@ CSR_API(SrvGetConsoleCommandHistory)
|
|||
CSR_API(SrvExpungeConsoleCommandHistory)
|
||||
{
|
||||
PCSRSS_EXPUNGE_COMMAND_HISTORY ExpungeCommandHistory = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.ExpungeCommandHistory;
|
||||
PCSR_PROCESS ProcessData = CsrGetClientThread()->Process;
|
||||
PCSR_PROCESS Process = CsrGetClientThread()->Process;
|
||||
PCSRSS_CONSOLE Console;
|
||||
PHISTORY_BUFFER Hist;
|
||||
NTSTATUS Status;
|
||||
|
||||
if (!Win32CsrValidateBuffer(ProcessData,
|
||||
if (!Win32CsrValidateBuffer(Process,
|
||||
ExpungeCommandHistory->ExeName.Buffer,
|
||||
ExpungeCommandHistory->ExeName.Length, 1))
|
||||
{
|
||||
return STATUS_ACCESS_VIOLATION;
|
||||
}
|
||||
|
||||
Status = ConioConsoleFromProcessData(ProcessData, &Console);
|
||||
Status = ConioConsoleFromProcessData(ConsoleGetPerProcessData(Process), &Console);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
Hist = HistoryFindBuffer(Console, &ExpungeCommandHistory->ExeName);
|
||||
|
@ -253,21 +253,21 @@ CSR_API(SrvExpungeConsoleCommandHistory)
|
|||
CSR_API(SrvSetConsoleNumberOfCommands)
|
||||
{
|
||||
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;
|
||||
PHISTORY_BUFFER Hist;
|
||||
NTSTATUS Status;
|
||||
WORD MaxEntries = SetHistoryNumberCommands->NumCommands;
|
||||
PUNICODE_STRING OldEntryList, NewEntryList;
|
||||
|
||||
if (!Win32CsrValidateBuffer(ProcessData,
|
||||
if (!Win32CsrValidateBuffer(Process,
|
||||
SetHistoryNumberCommands->ExeName.Buffer,
|
||||
SetHistoryNumberCommands->ExeName.Length, 1))
|
||||
{
|
||||
return STATUS_ACCESS_VIOLATION;
|
||||
}
|
||||
|
||||
Status = ConioConsoleFromProcessData(ProcessData, &Console);
|
||||
Status = ConioConsoleFromProcessData(ConsoleGetPerProcessData(Process), &Console);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
Hist = HistoryFindBuffer(Console, &SetHistoryNumberCommands->ExeName);
|
||||
|
@ -304,7 +304,7 @@ CSR_API(SrvGetConsoleHistory)
|
|||
{
|
||||
PCSRSS_GET_HISTORY_INFO GetHistoryInfo = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.GetHistoryInfo;
|
||||
PCSRSS_CONSOLE Console;
|
||||
NTSTATUS Status = ConioConsoleFromProcessData(CsrGetClientThread()->Process, &Console);
|
||||
NTSTATUS Status = ConioConsoleFromProcessData(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
GetHistoryInfo->HistoryBufferSize = Console->HistoryBufferSize;
|
||||
|
@ -319,7 +319,7 @@ CSR_API(SrvSetConsoleHistory)
|
|||
{
|
||||
PCSRSS_SET_HISTORY_INFO SetHistoryInfo = &((PCONSOLE_API_MESSAGE)ApiMessage)->Data.SetHistoryInfo;
|
||||
PCSRSS_CONSOLE Console;
|
||||
NTSTATUS Status = ConioConsoleFromProcessData(CsrGetClientThread()->Process, &Console);
|
||||
NTSTATUS Status = ConioConsoleFromProcessData(ConsoleGetPerProcessData(CsrGetClientThread()->Process), &Console);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
Console->HistoryBufferSize = (WORD)SetHistoryInfo->HistoryBufferSize;
|
||||
|
|
Loading…
Reference in a new issue