mirror of
https://github.com/reactos/reactos.git
synced 2025-06-30 04:21:21 +00:00
[WIN32CSR] Make CsrFreeConsole close the process's console handles.
svn path=/trunk/; revision=47313
This commit is contained in:
parent
6a0342f830
commit
a2c5273653
8 changed files with 52 additions and 34 deletions
|
@ -146,6 +146,45 @@ CsrReleaseObject(
|
|||
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(
|
||||
|
|
|
@ -140,7 +140,6 @@ PCSRSS_PROCESS_DATA WINAPI CsrCreateProcessData(HANDLE ProcessId)
|
|||
NTSTATUS WINAPI CsrFreeProcessData(HANDLE Pid)
|
||||
{
|
||||
ULONG hash;
|
||||
UINT c;
|
||||
PCSRSS_PROCESS_DATA pProcessData, *pPrevLink;
|
||||
HANDLE Process;
|
||||
|
||||
|
@ -158,23 +157,7 @@ NTSTATUS WINAPI CsrFreeProcessData(HANDLE Pid)
|
|||
{
|
||||
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);
|
||||
|
|
|
@ -335,6 +335,7 @@ CsrpInitWin32Csr (int argc, char ** argv, char ** envp)
|
|||
Exports.CsrGetObjectProc = CsrGetObject;
|
||||
Exports.CsrReleaseObjectByPointerProc = CsrReleaseObjectByPointer;
|
||||
Exports.CsrReleaseObjectProc = CsrReleaseObject;
|
||||
Exports.CsrReleaseConsoleProc = CsrReleaseConsole;
|
||||
Exports.CsrEnumProcessesProc = CsrEnumProcesses;
|
||||
if (! (*InitProc)(&ApiDefinitions, &ObjectDefinitions, &InitCompleteProc,
|
||||
&HardErrorProc, &Exports, CsrssApiHeap))
|
||||
|
|
|
@ -193,6 +193,7 @@ NTSTATUS WINAPI CsrGetObject( PCSRSS_PROCESS_DATA ProcessData, HANDLE Handle, Ob
|
|||
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
|
||||
|
|
|
@ -33,6 +33,7 @@ typedef NTSTATUS (WINAPI *CSRSS_GET_OBJECT_PROC)(PCSRSS_PROCESS_DATA ProcessData
|
|||
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);
|
||||
|
||||
|
@ -42,6 +43,7 @@ typedef struct tagCSRSS_EXPORTED_FUNCS
|
|||
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;
|
||||
|
||||
|
|
|
@ -33,6 +33,7 @@ NTSTATUS FASTCALL Win32CsrGetObject(PCSRSS_PROCESS_DATA ProcessData,
|
|||
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);
|
||||
|
||||
|
|
|
@ -369,25 +369,10 @@ CSR_API(CsrAllocConsole)
|
|||
|
||||
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
|
||||
|
|
|
@ -166,6 +166,12 @@ Win32CsrReleaseObject(PCSRSS_PROCESS_DATA ProcessData,
|
|||
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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue