return CsrReleaseObjectByPointer(Object);
}
+NTSTATUS
+WINAPI
+CsrReleaseConsole(
+ 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;
+ ProcessData->HandleTableSize = 0;
+ ProcessData->HandleTable = NULL;
+ ProcessData->Console = NULL;
+ RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
+
+ for (i = 0; i < HandleTableSize; i++)
+ {
+ if (HandleTable[i].Object != NULL)
+ CsrReleaseObjectByPointer(HandleTable[i].Object);
+ }
+ RtlFreeHeap(CsrssApiHeap, 0, HandleTable);
+
+ if (Console != NULL)
+ {
+ RtlEnterCriticalSection((PRTL_CRITICAL_SECTION)&Console->Header.Lock);
+ RemoveEntryList(&ProcessData->ProcessEntry);
+ RtlLeaveCriticalSection((PRTL_CRITICAL_SECTION)&Console->Header.Lock);
+ CsrReleaseObjectByPointer(&Console->Header);
+ return STATUS_SUCCESS;
+ }
+
+ return STATUS_INVALID_PARAMETER;
+}
+
NTSTATUS
WINAPI
CsrInsertObject(
NTSTATUS WINAPI CsrFreeProcessData(HANDLE Pid)
{
ULONG hash;
- UINT c;
PCSRSS_PROCESS_DATA pProcessData, *pPrevLink;
HANDLE Process;
{
DPRINT("CsrFreeProcessData pid: %d\n", Pid);
Process = pProcessData->Process;
- if (pProcessData->HandleTable)
- {
- for (c = 0; c < pProcessData->HandleTableSize; c++)
- {
- if (pProcessData->HandleTable[c].Object)
- {
- CsrReleaseObjectByPointer(pProcessData->HandleTable[c].Object);
- }
- }
- RtlFreeHeap(CsrssApiHeap, 0, pProcessData->HandleTable);
- }
- RtlDeleteCriticalSection(&pProcessData->HandleTableLock);
- if (pProcessData->Console)
- {
- RemoveEntryList(&pProcessData->ProcessEntry);
- CsrReleaseObjectByPointer((Object_t *) pProcessData->Console);
- }
+ CsrReleaseConsole(pProcessData);
if (pProcessData->CsrSectionViewBase)
{
NtUnmapViewOfSection(NtCurrentProcess(), pProcessData->CsrSectionViewBase);
Exports.CsrGetObjectProc = CsrGetObject;
Exports.CsrReleaseObjectByPointerProc = CsrReleaseObjectByPointer;
Exports.CsrReleaseObjectProc = CsrReleaseObject;
+ Exports.CsrReleaseConsoleProc = CsrReleaseConsole;
Exports.CsrEnumProcessesProc = CsrEnumProcesses;
if (! (*InitProc)(&ApiDefinitions, &ObjectDefinitions, &InitCompleteProc,
&HardErrorProc, &Exports, CsrssApiHeap))
NTSTATUS NTAPI CsrServerInitialization(ULONG ArgumentCount, PCHAR Arguments[]);
NTSTATUS WINAPI CsrReleaseObjectByPointer(Object_t *Object);
NTSTATUS WINAPI CsrReleaseObject( PCSRSS_PROCESS_DATA ProcessData, HANDLE Object );
+NTSTATUS WINAPI CsrReleaseConsole(PCSRSS_PROCESS_DATA ProcessData);
NTSTATUS WINAPI CsrVerifyObject( PCSRSS_PROCESS_DATA ProcessData, HANDLE Object );
//hack
typedef NTSTATUS (WINAPI *CSRSS_RELEASE_OBJECT_BY_POINTER_PROC)(Object_t *Object);
typedef NTSTATUS (WINAPI *CSRSS_RELEASE_OBJECT_PROC)(PCSRSS_PROCESS_DATA ProcessData,
HANDLE Object );
+typedef NTSTATUS (WINAPI *CSRSS_RELEASE_CONSOLE_PROC)(PCSRSS_PROCESS_DATA ProcessData);
typedef NTSTATUS (WINAPI *CSRSS_ENUM_PROCESSES_PROC)(CSRSS_ENUM_PROCESS_PROC EnumProc,
PVOID Context);
CSRSS_GET_OBJECT_PROC CsrGetObjectProc;
CSRSS_RELEASE_OBJECT_BY_POINTER_PROC CsrReleaseObjectByPointerProc;
CSRSS_RELEASE_OBJECT_PROC CsrReleaseObjectProc;
+ CSRSS_RELEASE_CONSOLE_PROC CsrReleaseConsoleProc;
CSRSS_ENUM_PROCESSES_PROC CsrEnumProcessesProc;
} CSRSS_EXPORTED_FUNCS, *PCSRSS_EXPORTED_FUNCS;
NTSTATUS FASTCALL Win32CsrReleaseObjectByPointer(Object_t *Object);
NTSTATUS FASTCALL Win32CsrReleaseObject(PCSRSS_PROCESS_DATA ProcessData,
HANDLE Object);
+NTSTATUS FASTCALL Win32CsrReleaseConsole(PCSRSS_PROCESS_DATA ProcessData);
NTSTATUS FASTCALL Win32CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc,
PVOID Context);
CSR_API(CsrFreeConsole)
{
- PCSRSS_CONSOLE Console;
-
-
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
- if (ProcessData->Console == NULL)
- {
- return STATUS_INVALID_PARAMETER;
- }
-
- Console = ProcessData->Console;
- ProcessData->Console = NULL;
- RemoveEntryList(&ProcessData->ProcessEntry);
- if (0 == InterlockedDecrement(&Console->Header.ReferenceCount))
- {
- ConioDeleteConsole((Object_t *) Console);
- }
- return STATUS_SUCCESS;
+ return Win32CsrReleaseConsole(ProcessData);
}
static VOID FASTCALL
return (CsrExports.CsrReleaseObjectProc)(ProcessData, Object);
}
+NTSTATUS FASTCALL
+Win32CsrReleaseConsole(PCSRSS_PROCESS_DATA ProcessData)
+{
+ return (CsrExports.CsrReleaseConsoleProc)(ProcessData);
+}
+
NTSTATUS FASTCALL
Win32CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc,
PVOID Context)