[WIN32CSR] Make CsrFreeConsole close the process's console handles.

svn path=/trunk/; revision=47313
This commit is contained in:
Jeffrey Morlan 2010-05-22 21:40:20 +00:00
parent 6a0342f830
commit a2c5273653
8 changed files with 52 additions and 34 deletions

View file

@ -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(

View file

@ -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);

View file

@ -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))

View file

@ -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

View file

@ -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;

View file

@ -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);

View file

@ -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

View file

@ -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)