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