From 33d084e11887aab41446841ea77dd9527719dccd Mon Sep 17 00:00:00 2001 From: Emanuele Aliberti Date: Sat, 13 Aug 2005 13:21:28 +0000 Subject: [PATCH] Implement csrsrv!CsrSrvInitializeServerDll based on current code from CsrpInitWin32Csr (partial). Note: it currently works only for servers with 1 ServerDll, because the entrypoint's name is a literal. svn path=/trunk/; revision=17368 --- reactos/subsys/csr/csrsrv/server.c | 57 +++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/reactos/subsys/csr/csrsrv/server.c b/reactos/subsys/csr/csrsrv/server.c index 543aaced35f..0b66dd58cd9 100644 --- a/reactos/subsys/csr/csrsrv/server.c +++ b/reactos/subsys/csr/csrsrv/server.c @@ -28,6 +28,8 @@ //#define NDEBUG #include +typedef NTSTATUS (STDCALL * CSR_SERVER_DLL_INIT_PROC)(ULONG,LPWSTR*); + typedef struct _CSRSRV_SERVER_DLL { USHORT ServerIndex; @@ -95,6 +97,51 @@ NTSTATUS STDCALL CsrSrvRegisterServerDll (PCSR_SERVER_DLL pServerDll) } return STATUS_SUCCESS; } +/********************************************************************** + * CsrSrvInitializeServerDll/1 PRIVATE + * + * NOTE + * Code dapted from CsrpInitWin32Csr. + */ +static NTSTATUS CsrSrvInitializeServerDll (USHORT ServerIndex) +{ + NTSTATUS Status = STATUS_SUCCESS; + HINSTANCE hInst; + ANSI_STRING ProcName; + CSR_SERVER_DLL_INIT_PROC InitProc; + + DPRINT("CSRSRV: %s called\n", __FUNCTION__); + + Status = LdrLoadDll (NULL, 0, & ServerThread[ServerIndex].DllName, (PVOID *) &hInst); + if (!NT_SUCCESS(Status)) + { + DPRINT1("CSRSRV:%s: loading ServerDll '%S' failed (Status=%08lx)\n", + __FUNCTION__, ServerThread[ServerIndex].DllName.Buffer, Status); + return Status; + } + RtlInitAnsiString (& ProcName, "ServerDllInitialization"); + Status = LdrGetProcedureAddress(hInst, &ProcName, 0, (PVOID *) &InitProc); + if (!NT_SUCCESS(Status)) + { + DPRINT1("CSRSRV:%s: ServerDll '%S!%s' not found (Status=%08lx)\n", + __FUNCTION__, + ServerThread[ServerIndex].DllName.Buffer, + "ServerDllInitialization", + Status); + return Status; + } + Status = InitProc (0, NULL); + if (!NT_SUCCESS(Status)) + { + DPRINT1("CSRSRV:%s: %S.%s failed with Status=%08lx\n", + __FUNCTION__, + ServerThread[ServerIndex].DllName.Buffer, + "ServerDllInitialization", + Status); + } + return Status; +} + /********************************************************************** * CsrpCreateObjectDirectory/1 PRIVATE */ @@ -175,7 +222,15 @@ NTSTATUS STDCALL CsrSrvBootstrap (VOID) { if (NULL == ServerThread [ServerIndex].ServerThread) { - //TODO: load DLL and call ServerDllInitialize + Status = CsrSrvInitializeServerDll (ServerIndex); + if (!NT_SUCCESS(Status)) + { + DPRINT1("CSRSRV:%s: server thread #%d init failed!\n", + __FUNCTION__, ServerIndex); + } + } else { + DPRINT1("CSRSRV:%s: server thread #%d initialized more than once!\n", + __FUNCTION__, ServerIndex); } } } -- 2.17.1