[WIN32CSR/CSRSRV]: Make the outdated CSR_PLUGIN architecture as close to the CSR_SERVER_DLL architecture as possible for easier migration later. Main changes are return values/number of parameters, importing csrsrv functions instead of using a manual export table, and other similar small changes. Also, add win32csr.dll to the registry command-line for CSRSS, but still load it hard-coded for now.

svn path=/trunk/; revision=55665
This commit is contained in:
Alex Ionescu
2012-02-17 05:15:13 +00:00
parent 03166cbd75
commit 7cb7765a31
16 changed files with 73 additions and 66 deletions
+1 -1
View File
@@ -1077,7 +1077,7 @@ HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Kmode",0x000
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Optional",0x00010000,"Posix"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Posix",0x00020000,"%SystemRoot%\system32\psxss.exe"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Required",0x00010000,"Debug","Windows"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Windows",0x00020000,"%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,12288,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=16"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Windows",0x00020000,"%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,12288,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=win32csr:Win32CsrInitialization,2 ProfileControl=Off MaxRequestThreads=16"
; WOW Support
HKLM,"SYSTEM\CurrentControlSet\Control\Wow","",0x00000000,""
+1 -1
View File
@@ -793,7 +793,7 @@ HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Kmode",0x000
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Optional",0x00010000,"Posix"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Posix",0x00020000,"%SystemRoot%\system32\psxss.exe"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Required",0x00010000,"Debug","Windows"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Windows",0x00020000,"%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,12288,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=16"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Windows",0x00020000,"%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,12288,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=win32csr:Win32CsrInitialization,2 ProfileControl=Off MaxRequestThreads=16"
; WOW Support
HKLM,"SYSTEM\CurrentControlSet\Control\Wow","",0x00000000,""
+1 -1
View File
@@ -1228,7 +1228,7 @@ HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Kmode",0x000
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Optional",0x00010000,"Posix"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Posix",0x00020000,"%SystemRoot%\system32\psxss.exe"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Required",0x00010000,"Debug","Windows"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Windows",0x00020000,"%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,12288,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=winsrv:UserServerDllInitialization,3 ServerDll=winsrv:ConServerDllInitialization,2 ProfileControl=Off MaxRequestThreads=16"
HKLM,"SYSTEM\CurrentControlSet\Control\Session Manager\Subsystems","Windows",0x00020000,"%SystemRoot%\system32\csrss.exe ObjectDirectory=\Windows SharedSection=1024,12288,512 Windows=On SubSystemType=Windows ServerDll=basesrv,1 ServerDll=win32csr:Win32CsrInitialization,2 ProfileControl=Off MaxRequestThreads=16"
; WOW Support
HKLM,"SYSTEM\CurrentControlSet\Control\Wow","",0x00000000,""
@@ -13,7 +13,7 @@
#define NDEBUG
#include <debug.h>
extern NTSTATUS CallProcessInherit(PCSR_PROCESS, PCSR_PROCESS);
extern NTSTATUS CallProcessCreated(PCSR_PROCESS, PCSR_PROCESS);
extern NTSTATUS CallProcessDeleted(PCSR_PROCESS);
/* GLOBALS *******************************************************************/
@@ -154,11 +154,9 @@ CSR_API(CsrCreateProcess)
{
NewProcessData->ParentConsole = ProcessData->Console;
NewProcessData->bInheritHandles = Request->Data.CreateProcessRequest.bInheritHandles;
if (Request->Data.CreateProcessRequest.bInheritHandles)
{
CallProcessInherit(ProcessData, NewProcessData);
}
}
CallProcessCreated(ProcessData, NewProcessData);
if (Request->Data.CreateProcessRequest.Flags & CREATE_NEW_PROCESS_GROUP)
{
@@ -97,20 +97,20 @@ CsrApiCallHandler(PCSR_PROCESS ProcessData,
Request->Status = STATUS_INVALID_SYSTEM_SERVICE;
}
BOOL
CallHardError(IN PCSR_PROCESS ProcessData,
VOID
CallHardError(IN PCSR_THREAD ThreadData,
IN PHARDERROR_MSG HardErrorMessage);
static
VOID
NTAPI
CsrHandleHardError(IN PCSR_PROCESS ProcessData,
CsrHandleHardError(IN PCSR_THREAD ThreadData,
IN OUT PHARDERROR_MSG Message)
{
DPRINT1("CSR: received hard error %lx\n", Message->Status);
/* Call the hard error handler in win32csr */
(VOID)CallHardError(ProcessData, Message);
CallHardError(ThreadData, Message);
}
/*++
@@ -935,7 +935,9 @@ ClientConnectionThread(IN PVOID Parameter)
if (MessageType == LPC_ERROR_EVENT)
{
/* Call the Handler */
CsrHandleHardError(ProcessData, (PHARDERROR_MSG)Request);
PCSR_THREAD Thread;
Thread = CsrLocateThreadByClientId(NULL, &Request->Header.ClientId);
CsrHandleHardError(Thread, (PHARDERROR_MSG)Request);
}
else
{
@@ -12,6 +12,7 @@
;@ stdcall CsrDereferenceWait(ptr)
;@ stdcall CsrDestroyProcess(ptr long)
;@ stdcall CsrDestroyThread(ptr)
@ stdcall CsrEnumProcesses(ptr ptr) ; Temporary hack
;@ stdcall CsrExecServerThread(ptr long)
@ stdcall CsrGetProcessLuid(ptr ptr)
@ stdcall CsrImpersonateClient(ptr)
+16 -18
View File
@@ -64,26 +64,22 @@ CsrpAddServerProcs(CSRPLUGIN_SERVER_PROCS *Procs)
return STATUS_SUCCESS;
}
BOOL
CallHardError(IN PCSR_PROCESS ProcessData,
VOID
CallHardError(IN PCSR_THREAD ThreadData,
IN PHARDERROR_MSG HardErrorMessage)
{
BOOL Ok;
unsigned i;
DPRINT("CSR: %s called\n", __FUNCTION__);
Ok = TRUE;
for (i = 0; i < ServerProcCount && Ok; i++)
for (i = 0; i < ServerProcCount; i++)
{
Ok = (*ServerProcs[i].HardErrorProc)(ProcessData, HardErrorMessage);
ServerProcs[i].HardErrorProc(ThreadData, HardErrorMessage);
}
return Ok;
}
NTSTATUS
CallProcessInherit(IN PCSR_PROCESS SourceProcessData,
CallProcessCreated(IN PCSR_PROCESS SourceProcessData,
IN PCSR_PROCESS TargetProcessData)
{
NTSTATUS Status = STATUS_SUCCESS;
@@ -91,8 +87,11 @@ CallProcessInherit(IN PCSR_PROCESS SourceProcessData,
DPRINT("CSR: %s called\n", __FUNCTION__);
for (i = 0; i < ServerProcCount && NT_SUCCESS(Status); i++)
Status = (*ServerProcs[i].ProcessInheritProc)(SourceProcessData, TargetProcessData);
for (i = 0; i < ServerProcCount; i++)
{
Status = ServerProcs[i].ProcessInheritProc(SourceProcessData, TargetProcessData);
if (!NT_SUCCESS(Status)) break;
}
return Status;
}
@@ -100,15 +99,15 @@ CallProcessInherit(IN PCSR_PROCESS SourceProcessData,
NTSTATUS
CallProcessDeleted(IN PCSR_PROCESS ProcessData)
{
NTSTATUS Status = STATUS_SUCCESS;
ULONG Result = 0;
unsigned i;
DPRINT("CSR: %s called\n", __FUNCTION__);
for (i = 0; i < ServerProcCount && NT_SUCCESS(Status); i++)
Status = (*ServerProcs[i].ProcessDeletedProc)(ProcessData);
for (i = 0; i < ServerProcCount; i++)
Result = ServerProcs[i].ProcessDeletedProc(ProcessData, 0, FALSE);
return Status;
return Result;
}
/**********************************************************************
@@ -131,7 +130,6 @@ CsrpInitWin32Csr (VOID)
HINSTANCE hInst;
ANSI_STRING ProcName;
CSRPLUGIN_INITIALIZE_PROC InitProc;
CSRSS_EXPORTED_FUNCS Exports;
PCSRSS_API_DEFINITION ApiDefinitions;
CSRPLUGIN_SERVER_PROCS ServerProcs;
@@ -149,8 +147,8 @@ CsrpInitWin32Csr (VOID)
{
return Status;
}
Exports.CsrEnumProcessesProc = CsrEnumProcesses;
if (! (*InitProc)(&ApiDefinitions, &ServerProcs, &Exports, CsrHeap))
if (! (*InitProc)(&ApiDefinitions, &ServerProcs))
{
return STATUS_UNSUCCESSFUL;
}
@@ -312,6 +312,7 @@ extern SYSTEM_BASIC_INFORMATION CsrNtSysInfo;
extern PVOID CsrSrvSharedSectionHeap;
extern PVOID *CsrSrvSharedStaticServerData;
extern HANDLE CsrInitializationEvent;
extern PCSR_SERVER_DLL CsrLoadedServerDll[CSR_SERVER_DLL_MAX];
NTSTATUS
NTAPI
@@ -31,13 +31,13 @@ typedef struct tagCSRSS_EXPORTED_FUNCS
typedef BOOL (WINAPI *CSRPLUGIN_INIT_COMPLETE_PROC)(void);
typedef BOOL (WINAPI *CSRPLUGIN_HARDERROR_PROC)(IN PCSR_PROCESS ProcessData,
typedef VOID (WINAPI *CSRPLUGIN_HARDERROR_PROC)(IN PCSR_THREAD ThreadData,
IN PHARDERROR_MSG HardErrorMessage);
typedef NTSTATUS (WINAPI *CSRPLUGIN_PROCESS_INHERIT_PROC)(IN PCSR_PROCESS SourceProcessData,
IN PCSR_PROCESS TargetProcessData);
typedef NTSTATUS (WINAPI *CSRPLUGIN_PROCESS_DELETED_PROC)(IN PCSR_PROCESS ProcessData);
typedef ULONG (WINAPI *CSRPLUGIN_PROCESS_DELETED_PROC)(IN PCSR_PROCESS ProcessData, IN ULONG Unused, IN BOOLEAN Flag);
typedef struct tagCSRSS_SERVER_PROCS
{
@@ -48,8 +48,6 @@ typedef struct tagCSRSS_SERVER_PROCS
} CSRPLUGIN_SERVER_PROCS, *PCSRPLUGIN_SERVER_PROCS;
typedef BOOL (WINAPI *CSRPLUGIN_INITIALIZE_PROC)(PCSRSS_API_DEFINITION *ApiDefinitions,
PCSRPLUGIN_SERVER_PROCS ServerProcs,
PCSRSS_EXPORTED_FUNCS Exports,
HANDLE CsrssApiHeap);
PCSRPLUGIN_SERVER_PROCS ServerProcs);
/* EOF */
@@ -319,7 +319,7 @@ CSR_API(CsrFreeConsole)
Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE);
Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE);
return Win32CsrReleaseConsole(ProcessData);
return Win32CsrReleaseConsole(ProcessData, 0, 0);
}
VOID WINAPI
@@ -21,7 +21,6 @@ extern RTL_CRITICAL_SECTION Win32CsrDefineDosDeviceCritSec;
HANDLE Win32CsrApiHeap;
HINSTANCE Win32CsrDllHandle = NULL;
static CSRSS_EXPORTED_FUNCS CsrExports;
static CSRSS_API_DEFINITION Win32CsrApiDefinitions[] =
{
@@ -306,13 +305,7 @@ NTSTATUS FASTCALL
Win32CsrEnumProcesses(CSRSS_ENUM_PROCESS_PROC EnumProc,
PVOID Context)
{
return (CsrExports.CsrEnumProcessesProc)(EnumProc, Context);
}
static BOOL WINAPI
Win32CsrInitComplete(void)
{
return TRUE;
return CsrEnumProcesses(EnumProc, Context);
}
VOID
@@ -331,18 +324,20 @@ CreateSystemThreads(PVOID pParam)
return 0;
}
BOOL WINAPI
NTSTATUS
WINAPI
#if 0
Win32CsrInitialization(IN PCSR_SERVER_DLL ServerDll)
#else
Win32CsrInitialization(PCSRSS_API_DEFINITION *ApiDefinitions,
PCSRPLUGIN_SERVER_PROCS ServerProcs,
PCSRSS_EXPORTED_FUNCS Exports,
HANDLE CsrHeap)
PCSRPLUGIN_SERVER_PROCS ServerProcs)
#endif
{
HANDLE ServerThread;
CLIENT_ID ClientId;
NTSTATUS Status;
CsrExports = *Exports;
Win32CsrApiHeap = CsrHeap;
Win32CsrApiHeap = RtlGetProcessHeap();
CsrpInitVideo();
@@ -351,11 +346,20 @@ Win32CsrInitialization(PCSRSS_API_DEFINITION *ApiDefinitions,
PrivateCsrssManualGuiCheck(0);
CsrInitConsoleSupport();
/* HACK */
#if 0
ServerDll->DispatchTable = (PVOID)Win32CsrApiDefinitions;
ServerDll->HighestApiSupported = 0xDEADBABE;
ServerDll->HardErrorCallback = Win32CsrHardError;
ServerDll->NewProcessCallback = Win32CsrDuplicateHandleTable;
ServerDll->ShutdownProcessCallback = Win32CsrReleaseConsole;
#else
*ApiDefinitions = Win32CsrApiDefinitions;
ServerProcs->InitCompleteProc = Win32CsrInitComplete;
ServerProcs->HardErrorProc = Win32CsrHardError;
ServerProcs->ProcessInheritProc = Win32CsrDuplicateHandleTable;
ServerProcs->ProcessDeletedProc = Win32CsrReleaseConsole;
#endif
RtlInitializeCriticalSection(&Win32CsrDefineDosDeviceCritSec);
InitializeListHead(&DosDeviceHistory);
@@ -132,10 +132,10 @@ Win32CsrUnlockObject(Object_t *Object)
ConioDeleteConsole(&Console->Header);
}
NTSTATUS
ULONG
WINAPI
Win32CsrReleaseConsole(
PCSR_PROCESS ProcessData)
PCSR_PROCESS ProcessData, ULONG Flags, BOOLEAN First)
{
PCSRSS_CONSOLE Console;
ULONG i;
@@ -161,10 +161,10 @@ Win32CsrReleaseConsole(
//CloseHandle(ProcessData->ConsoleEvent);
//ProcessData->ConsoleEvent = NULL;
RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
return STATUS_SUCCESS;
return 0;
}
RtlLeaveCriticalSection(&ProcessData->HandleTableLock);
return STATUS_INVALID_PARAMETER;
return -1;
}
NTSTATUS
@@ -223,6 +223,9 @@ Win32CsrDuplicateHandleTable(
PCSR_PROCESS TargetProcessData)
{
ULONG i;
/* Only inherit if the flag was set */
if (!TargetProcessData->bInheritHandles) return STATUS_SUCCESS;
if (TargetProcessData->HandleTableSize)
{
@@ -500,12 +500,13 @@ CsrpMessageBox(
return ResponseNotHandled;
}
BOOL
VOID
WINAPI
Win32CsrHardError(
IN PCSR_PROCESS ProcessData,
IN PCSR_THREAD ThreadData,
IN PHARDERROR_MSG Message)
{
PCSR_PROCESS ProcessData = ThreadData->Process;
ULONG_PTR Parameters[MAXIMUM_HARDERROR_PARAMETERS];
OBJECT_ATTRIBUTES ObjectAttributes;
UNICODE_STRING TextU, CaptionU;
@@ -514,6 +515,7 @@ Win32CsrHardError(
ULONG Size;
/* Default to not handled */
ASSERT(ProcessData != NULL);
Message->Response = ResponseNotHandled;
/* Make sure we don't have too many parameters */
@@ -532,7 +534,7 @@ Win32CsrHardError(
if (!NT_SUCCESS(Status))
{
DPRINT1("NtOpenProcess failed with code: %lx\n", Status);
return FALSE;
return;
}
/* Capture all string parameters from the process memory */
@@ -540,7 +542,7 @@ Win32CsrHardError(
if (!NT_SUCCESS(Status))
{
NtClose(hProcess);
return FALSE;
return;
}
/* Format the caption and message box text */
@@ -557,7 +559,7 @@ Win32CsrHardError(
if (!NT_SUCCESS(Status))
{
return FALSE;
return;
}
/* Display the message box */
@@ -569,6 +571,6 @@ Win32CsrHardError(
RtlFreeUnicodeString(&TextU);
RtlFreeUnicodeString(&CaptionU);
return TRUE;
return;
}
@@ -23,10 +23,10 @@
/* shared header with console.dll */
#include "console.h"
BOOL
VOID
WINAPI
Win32CsrHardError(
IN PCSR_PROCESS ProcessData,
IN PCSR_THREAD ThreadData,
IN PHARDERROR_MSG Message);
/* EOF */
@@ -54,7 +54,7 @@ NTSTATUS FASTCALL Win32CsrLockObject(PCSR_PROCESS ProcessData,
VOID FASTCALL Win32CsrUnlockObject(Object_t *Object);
NTSTATUS FASTCALL Win32CsrReleaseObject(PCSR_PROCESS ProcessData,
HANDLE Object);
NTSTATUS WINAPI Win32CsrReleaseConsole(PCSR_PROCESS ProcessData);
ULONG WINAPI Win32CsrReleaseConsole(PCSR_PROCESS ProcessData, ULONG Flags, BOOLEAN First);
NTSTATUS WINAPI Win32CsrDuplicateHandleTable(PCSR_PROCESS SourceProcessData,
PCSR_PROCESS TargetProcessData);
CSR_API(CsrGetHandle);
@@ -1 +1 @@
@ stdcall Win32CsrInitialization(ptr ptr ptr ptr)
@ stdcall Win32CsrInitialization(ptr ptr)