mirror of
https://github.com/reactos/reactos.git
synced 2025-06-30 19:41:22 +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);
|
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
|
NTSTATUS
|
||||||
WINAPI
|
WINAPI
|
||||||
CsrInsertObject(
|
CsrInsertObject(
|
||||||
|
|
|
@ -140,7 +140,6 @@ PCSRSS_PROCESS_DATA WINAPI CsrCreateProcessData(HANDLE ProcessId)
|
||||||
NTSTATUS WINAPI CsrFreeProcessData(HANDLE Pid)
|
NTSTATUS WINAPI CsrFreeProcessData(HANDLE Pid)
|
||||||
{
|
{
|
||||||
ULONG hash;
|
ULONG hash;
|
||||||
UINT c;
|
|
||||||
PCSRSS_PROCESS_DATA pProcessData, *pPrevLink;
|
PCSRSS_PROCESS_DATA pProcessData, *pPrevLink;
|
||||||
HANDLE Process;
|
HANDLE Process;
|
||||||
|
|
||||||
|
@ -158,23 +157,7 @@ NTSTATUS WINAPI CsrFreeProcessData(HANDLE Pid)
|
||||||
{
|
{
|
||||||
DPRINT("CsrFreeProcessData pid: %d\n", Pid);
|
DPRINT("CsrFreeProcessData pid: %d\n", Pid);
|
||||||
Process = pProcessData->Process;
|
Process = pProcessData->Process;
|
||||||
if (pProcessData->HandleTable)
|
CsrReleaseConsole(pProcessData);
|
||||||
{
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
if (pProcessData->CsrSectionViewBase)
|
if (pProcessData->CsrSectionViewBase)
|
||||||
{
|
{
|
||||||
NtUnmapViewOfSection(NtCurrentProcess(), pProcessData->CsrSectionViewBase);
|
NtUnmapViewOfSection(NtCurrentProcess(), pProcessData->CsrSectionViewBase);
|
||||||
|
|
|
@ -335,6 +335,7 @@ CsrpInitWin32Csr (int argc, char ** argv, char ** envp)
|
||||||
Exports.CsrGetObjectProc = CsrGetObject;
|
Exports.CsrGetObjectProc = CsrGetObject;
|
||||||
Exports.CsrReleaseObjectByPointerProc = CsrReleaseObjectByPointer;
|
Exports.CsrReleaseObjectByPointerProc = CsrReleaseObjectByPointer;
|
||||||
Exports.CsrReleaseObjectProc = CsrReleaseObject;
|
Exports.CsrReleaseObjectProc = CsrReleaseObject;
|
||||||
|
Exports.CsrReleaseConsoleProc = CsrReleaseConsole;
|
||||||
Exports.CsrEnumProcessesProc = CsrEnumProcesses;
|
Exports.CsrEnumProcessesProc = CsrEnumProcesses;
|
||||||
if (! (*InitProc)(&ApiDefinitions, &ObjectDefinitions, &InitCompleteProc,
|
if (! (*InitProc)(&ApiDefinitions, &ObjectDefinitions, &InitCompleteProc,
|
||||||
&HardErrorProc, &Exports, CsrssApiHeap))
|
&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 NTAPI CsrServerInitialization(ULONG ArgumentCount, PCHAR Arguments[]);
|
||||||
NTSTATUS WINAPI CsrReleaseObjectByPointer(Object_t *Object);
|
NTSTATUS WINAPI CsrReleaseObjectByPointer(Object_t *Object);
|
||||||
NTSTATUS WINAPI CsrReleaseObject( PCSRSS_PROCESS_DATA ProcessData, HANDLE 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 );
|
NTSTATUS WINAPI CsrVerifyObject( PCSRSS_PROCESS_DATA ProcessData, HANDLE Object );
|
||||||
|
|
||||||
//hack
|
//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_BY_POINTER_PROC)(Object_t *Object);
|
||||||
typedef NTSTATUS (WINAPI *CSRSS_RELEASE_OBJECT_PROC)(PCSRSS_PROCESS_DATA ProcessData,
|
typedef NTSTATUS (WINAPI *CSRSS_RELEASE_OBJECT_PROC)(PCSRSS_PROCESS_DATA ProcessData,
|
||||||
HANDLE Object );
|
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,
|
typedef NTSTATUS (WINAPI *CSRSS_ENUM_PROCESSES_PROC)(CSRSS_ENUM_PROCESS_PROC EnumProc,
|
||||||
PVOID Context);
|
PVOID Context);
|
||||||
|
|
||||||
|
@ -42,6 +43,7 @@ typedef struct tagCSRSS_EXPORTED_FUNCS
|
||||||
CSRSS_GET_OBJECT_PROC CsrGetObjectProc;
|
CSRSS_GET_OBJECT_PROC CsrGetObjectProc;
|
||||||
CSRSS_RELEASE_OBJECT_BY_POINTER_PROC CsrReleaseObjectByPointerProc;
|
CSRSS_RELEASE_OBJECT_BY_POINTER_PROC CsrReleaseObjectByPointerProc;
|
||||||
CSRSS_RELEASE_OBJECT_PROC CsrReleaseObjectProc;
|
CSRSS_RELEASE_OBJECT_PROC CsrReleaseObjectProc;
|
||||||
|
CSRSS_RELEASE_CONSOLE_PROC CsrReleaseConsoleProc;
|
||||||
CSRSS_ENUM_PROCESSES_PROC CsrEnumProcessesProc;
|
CSRSS_ENUM_PROCESSES_PROC CsrEnumProcessesProc;
|
||||||
} CSRSS_EXPORTED_FUNCS, *PCSRSS_EXPORTED_FUNCS;
|
} 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 Win32CsrReleaseObjectByPointer(Object_t *Object);
|
||||||
NTSTATUS FASTCALL Win32CsrReleaseObject(PCSRSS_PROCESS_DATA ProcessData,
|
NTSTATUS FASTCALL Win32CsrReleaseObject(PCSRSS_PROCESS_DATA ProcessData,
|
||||||
HANDLE Object);
|
HANDLE Object);
|
||||||
|
NTSTATUS FASTCALL Win32CsrReleaseConsole(PCSRSS_PROCESS_DATA ProcessData);
|
||||||
NTSTATUS FASTCALL Win32CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc,
|
NTSTATUS FASTCALL Win32CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc,
|
||||||
PVOID Context);
|
PVOID Context);
|
||||||
|
|
||||||
|
|
|
@ -369,25 +369,10 @@ CSR_API(CsrAllocConsole)
|
||||||
|
|
||||||
CSR_API(CsrFreeConsole)
|
CSR_API(CsrFreeConsole)
|
||||||
{
|
{
|
||||||
PCSRSS_CONSOLE Console;
|
|
||||||
|
|
||||||
|
|
||||||
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
|
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
|
||||||
Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
|
Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
|
||||||
|
|
||||||
if (ProcessData->Console == NULL)
|
return Win32CsrReleaseConsole(ProcessData);
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static VOID FASTCALL
|
static VOID FASTCALL
|
||||||
|
|
|
@ -166,6 +166,12 @@ Win32CsrReleaseObject(PCSRSS_PROCESS_DATA ProcessData,
|
||||||
return (CsrExports.CsrReleaseObjectProc)(ProcessData, Object);
|
return (CsrExports.CsrReleaseObjectProc)(ProcessData, Object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NTSTATUS FASTCALL
|
||||||
|
Win32CsrReleaseConsole(PCSRSS_PROCESS_DATA ProcessData)
|
||||||
|
{
|
||||||
|
return (CsrExports.CsrReleaseConsoleProc)(ProcessData);
|
||||||
|
}
|
||||||
|
|
||||||
NTSTATUS FASTCALL
|
NTSTATUS FASTCALL
|
||||||
Win32CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc,
|
Win32CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc,
|
||||||
PVOID Context)
|
PVOID Context)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue