NTSTATUS FASTCALL
ConioConsoleFromProcessData(PCSRSS_PROCESS_DATA ProcessData, PCSRSS_CONSOLE *Console)
{
- PCSRSS_CONSOLE ProcessConsole = ProcessData->Console;
+ PCSRSS_CONSOLE ProcessConsole;
+
+ RtlEnterCriticalSection(&ProcessData->HandleTableLock);
+ ProcessConsole = ProcessData->Console;
if (!ProcessConsole)
{
*Console = NULL;
+ RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
return STATUS_INVALID_HANDLE;
}
InterlockedIncrement(&ProcessConsole->Header.ReferenceCount);
+ RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
EnterCriticalSection(&(ProcessConsole->Header.Lock));
*Console = ProcessConsole;
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
+ RtlEnterCriticalSection(&ProcessData->HandleTableLock);
if (ProcessData->Console)
{
DPRINT1("Process already has a console\n");
+ RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
return STATUS_INVALID_PARAMETER;
}
if (!Request->Data.AllocConsoleRequest.ConsoleNeeded)
{
DPRINT("No console needed\n");
+ RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
return STATUS_SUCCESS;
}
if (NULL == Console)
{
DPRINT1("Not enough memory for console\n");
+ RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
return STATUS_NO_MEMORY;
}
/* initialize list head */
{
DPRINT1("Console init failed\n");
HeapFree(Win32CsrApiHeap, 0, Console);
+ RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
return Status;
}
}
DPRINT1("Failed to insert object\n");
ConioDeleteConsole((Object_t *) Console);
ProcessData->Console = 0;
+ RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
return Status;
}
Win32CsrReleaseObject(ProcessData,
Request->Data.AllocConsoleRequest.InputHandle);
ProcessData->Console = 0;
+ RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
return Status;
}
}
Request->Data.AllocConsoleRequest.InputHandle);
}
ProcessData->Console = 0;
+ RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
return Status;
}
InsertHeadList(&ProcessData->Console->ProcessList, &ProcessData->ProcessEntry);
}
+ RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
return STATUS_SUCCESS;
}
DPRINT("CsrCreateScreenBuffer\n");
+ RtlEnterCriticalSection(&ProcessData->HandleTableLock);
Status = ConioConsoleFromProcessData(ProcessData, &Console);
if (! NT_SUCCESS(Status))
{
}
ConioUnlockConsole(Console);
+ RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
return Status;
}
Win32CsrReleaseConsole(
PCSRSS_PROCESS_DATA ProcessData)
{
- ULONG HandleTableSize;
- PCSRSS_HANDLE HandleTable;
PCSRSS_CONSOLE Console;
ULONG i;
/* Close all console handles and detach process from console */
RtlEnterCriticalSection(&ProcessData->HandleTableLock);
- HandleTableSize = ProcessData->HandleTableSize;
- HandleTable = ProcessData->HandleTable;
- Console = ProcessData->Console;
+
+ for (i = 0; i < ProcessData->HandleTableSize; i++)
+ {
+ if (ProcessData->HandleTable[i].Object != NULL)
+ Win32CsrReleaseObjectByPointer(ProcessData->HandleTable[i].Object);
+ }
ProcessData->HandleTableSize = 0;
+ RtlFreeHeap(Win32CsrApiHeap, 0, ProcessData->HandleTable);
ProcessData->HandleTable = NULL;
+
+ Console = ProcessData->Console;
ProcessData->Console = NULL;
RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
- for (i = 0; i < HandleTableSize; i++)
- {
- if (HandleTable[i].Object != NULL)
- Win32CsrReleaseObjectByPointer(HandleTable[i].Object);
- }
- RtlFreeHeap(Win32CsrApiHeap, 0, HandleTable);
-
if (Console != NULL)
{
EnterCriticalSection(&Console->Header.Lock);
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
+ RtlEnterCriticalSection(&ProcessData->HandleTableLock);
if (ProcessData->Console)
{
Request->Status = Win32CsrInsertObject(ProcessData,
Request->Data.GetInputHandleRequest.InputHandle = INVALID_HANDLE_VALUE;
Request->Status = STATUS_SUCCESS;
}
+ RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
return Request->Status;
}
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
+ RtlEnterCriticalSection(&ProcessData->HandleTableLock);
if (ProcessData->Console)
{
Request->Status = Win32CsrInsertObject(ProcessData,
Request->Data.GetOutputHandleRequest.OutputHandle = INVALID_HANDLE_VALUE;
Request->Status = STATUS_SUCCESS;
}
+ RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
return Request->Status;
}