From 991af663dba8d5e4304df2d77455db575fcd23cb Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sun, 23 Nov 2008 22:39:43 +0000 Subject: [PATCH] - Start the RPC-Server from a separate thread so the initial call to the DLL doesn't get blocked. - Ensure the server accepts more than a single call from clients. svn path=/trunk/; revision=37599 --- reactos/dll/win32/lsasrv/lsarpc.c | 69 ++++++++++++++++++++++++------- 1 file changed, 54 insertions(+), 15 deletions(-) diff --git a/reactos/dll/win32/lsasrv/lsarpc.c b/reactos/dll/win32/lsasrv/lsarpc.c index 19d071507ce..679b3219759 100644 --- a/reactos/dll/win32/lsasrv/lsarpc.c +++ b/reactos/dll/win32/lsasrv/lsarpc.c @@ -57,6 +57,7 @@ ReferencePolicyHandle(IN LSAPR_HANDLE ObjectHandle, return Status; } + /*static*/ VOID DereferencePolicyHandle(IN OUT PLSAR_POLICY_HANDLE Policy, IN BOOLEAN Delete) @@ -81,17 +82,13 @@ DereferencePolicyHandle(IN OUT PLSAR_POLICY_HANDLE Policy, RtlLeaveCriticalSection(&PolicyHandleTableLock); } -VOID -LsarStartRpcServer(VOID) + +DWORD STDCALL +LsapRpcThreadRoutine(LPVOID lpParameter) { RPC_STATUS Status; - RtlInitializeCriticalSection(&PolicyHandleTableLock); - RtlInitializeHandleTable(0x1000, - sizeof(LSAR_POLICY_HANDLE), - &PolicyHandleTable); - - TRACE("LsarStartRpcServer() called"); + TRACE("LsapRpcThreadRoutine() called"); Status = RpcServerUseProtseqEpW(L"ncacn_np", 10, @@ -100,7 +97,7 @@ LsarStartRpcServer(VOID) if (Status != RPC_S_OK) { WARN("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status); - return; + return 0; } Status = RpcServerRegisterIf(lsarpc_v0_0_s_ifspec, @@ -109,17 +106,51 @@ LsarStartRpcServer(VOID) if (Status != RPC_S_OK) { WARN("RpcServerRegisterIf() failed (Status %lx)\n", Status); - return; + return 0; } - Status = RpcServerListen(1, 20, TRUE); + Status = RpcServerListen(1, 20, FALSE); if (Status != RPC_S_OK) { WARN("RpcServerListen() failed (Status %lx)\n", Status); - return; + return 0; } - TRACE("LsarStartRpcServer() done\n"); + TRACE("LsapRpcThreadRoutine() done\n"); + + return 0; +} + + +VOID +LsarStartRpcServer(VOID) +{ + HANDLE hThread; + + TRACE("LsarStartRpcServer() called"); + + RtlInitializeCriticalSection(&PolicyHandleTableLock); + RtlInitializeHandleTable(0x1000, + sizeof(LSAR_POLICY_HANDLE), + &PolicyHandleTable); + + hThread = CreateThread(NULL, + 0, + (LPTHREAD_START_ROUTINE) + LsapRpcThreadRoutine, + NULL, + 0, + NULL); + if (!hThread) + { + WARN("Starting LsapRpcThreadRoutine-Thread failed!\n"); + } + else + { + CloseHandle(hThread); + } + + TRACE("LsarStartRpcServer() done"); } @@ -220,8 +251,16 @@ NTSTATUS LsarOpenPolicy( ACCESS_MASK DesiredAccess, LSAPR_HANDLE *PolicyHandle) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + ERR("LsarOpenPolicy called!\n"); + + *PolicyHandle = (LSAPR_HANDLE)0xcafe; + + ERR("LsarOpenPolicy done!\n"); + + return STATUS_SUCCESS; + +// UNIMPLEMENTED; +// return STATUS_NOT_IMPLEMENTED; } -- 2.17.1