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. Modified: trunk/reactos/subsys/csr/csrsrv/server.c _____
Modified: trunk/reactos/subsys/csr/csrsrv/server.c --- trunk/reactos/subsys/csr/csrsrv/server.c 2005-08-13 13:16:16 UTC (rev 17367) +++ trunk/reactos/subsys/csr/csrsrv/server.c 2005-08-13 13:21:28 UTC (rev 17368) @@ -28,6 +28,8 @@
//#define NDEBUG #include <debug.h>
+typedef NTSTATUS (STDCALL * CSR_SERVER_DLL_INIT_PROC)(ULONG,LPWSTR*); + typedef struct _CSRSRV_SERVER_DLL { USHORT ServerIndex; @@ -96,6 +98,51 @@ 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 */ NTSTATUS STDCALL CsrpCreateObjectDirectory (PUNICODE_STRING pObjectDirectory) @@ -175,7 +222,15 @@ { 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); } } }