[lsasrv] Do not launch a thread to listen for incoming calls, but do it directly

Better LsarClose stub, which tries to do the right thing
Fix a few prototypes
See issue #4689 for more details.

svn path=/trunk/; revision=42495
This commit is contained in:
Hervé Poussineau 2009-08-08 07:27:37 +00:00
parent ac25f23e18
commit 2a10e77d03
2 changed files with 170 additions and 85 deletions

View file

@ -6,7 +6,6 @@
#define NTOS_MODE_USER #define NTOS_MODE_USER
#include <ndk/ntndk.h> #include <ndk/ntndk.h>
#include "lsasrv.h"
#include "lsa_s.h" #include "lsa_s.h"
#include <wine/debug.h> #include <wine/debug.h>
@ -26,10 +25,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(lsasrv);
/* FUNCTIONS ***************************************************************/ /* FUNCTIONS ***************************************************************/
/*static*/ NTSTATUS static NTSTATUS
ReferencePolicyHandle(IN LSAPR_HANDLE ObjectHandle, ReferencePolicyHandle(
IN ACCESS_MASK DesiredAccess, IN LSA_HANDLE ObjectHandle,
OUT PLSAR_POLICY_HANDLE *Policy) IN ACCESS_MASK DesiredAccess,
OUT PLSAR_POLICY_HANDLE *Policy)
{ {
PLSAR_POLICY_HANDLE ReferencedPolicy; PLSAR_POLICY_HANDLE ReferencedPolicy;
NTSTATUS Status = STATUS_SUCCESS; NTSTATUS Status = STATUS_SUCCESS;
@ -58,10 +58,10 @@ ReferencePolicyHandle(IN LSAPR_HANDLE ObjectHandle,
return Status; return Status;
} }
static VOID
/*static*/ VOID DereferencePolicyHandle(
DereferencePolicyHandle(IN OUT PLSAR_POLICY_HANDLE Policy, IN OUT PLSAR_POLICY_HANDLE Policy,
IN BOOLEAN Delete) IN BOOLEAN Delete)
{ {
RtlEnterCriticalSection(&PolicyHandleTableLock); RtlEnterCriticalSection(&PolicyHandleTableLock);
@ -83,13 +83,17 @@ DereferencePolicyHandle(IN OUT PLSAR_POLICY_HANDLE Policy,
RtlLeaveCriticalSection(&PolicyHandleTableLock); RtlLeaveCriticalSection(&PolicyHandleTableLock);
} }
VOID
DWORD WINAPI LsarStartRpcServer(VOID)
LsapRpcThreadRoutine(LPVOID lpParameter)
{ {
RPC_STATUS Status; RPC_STATUS Status;
TRACE("LsapRpcThreadRoutine() called"); RtlInitializeCriticalSection(&PolicyHandleTableLock);
RtlInitializeHandleTable(0x1000,
sizeof(LSAR_POLICY_HANDLE),
&PolicyHandleTable);
TRACE("LsarStartRpcServer() called");
Status = RpcServerUseProtseqEpW(L"ncacn_np", Status = RpcServerUseProtseqEpW(L"ncacn_np",
10, 10,
@ -98,7 +102,7 @@ LsapRpcThreadRoutine(LPVOID lpParameter)
if (Status != RPC_S_OK) if (Status != RPC_S_OK)
{ {
WARN("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status); WARN("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status);
return 0; return;
} }
Status = RpcServerRegisterIf(lsarpc_v0_0_s_ifspec, Status = RpcServerRegisterIf(lsarpc_v0_0_s_ifspec,
@ -107,51 +111,17 @@ LsapRpcThreadRoutine(LPVOID lpParameter)
if (Status != RPC_S_OK) if (Status != RPC_S_OK)
{ {
WARN("RpcServerRegisterIf() failed (Status %lx)\n", Status); WARN("RpcServerRegisterIf() failed (Status %lx)\n", Status);
return 0; return;
} }
Status = RpcServerListen(1, 20, FALSE); Status = RpcServerListen(1, 20, TRUE);
if (Status != RPC_S_OK) if (Status != RPC_S_OK)
{ {
WARN("RpcServerListen() failed (Status %lx)\n", Status); WARN("RpcServerListen() failed (Status %lx)\n", Status);
return 0; return;
} }
TRACE("LsapRpcThreadRoutine() done\n"); TRACE("LsarStartRpcServer() 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");
} }
@ -162,16 +132,24 @@ void __RPC_USER LSAPR_HANDLE_rundown(LSAPR_HANDLE hHandle)
/* Function 0 */ /* Function 0 */
NTSTATUS NTSTATUS LsarClose(
LsarClose(LSAPR_HANDLE *ObjectHandle) LSAPR_HANDLE *ObjectHandle)
{ {
#if 0
PLSAR_POLICY_HANDLE Policy = NULL; PLSAR_POLICY_HANDLE Policy = NULL;
NTSTATUS Status; NTSTATUS Status;
TRACE("0x%p\n", ObjectHandle); TRACE("0x%p\n", ObjectHandle);
Status = ReferencePolicyHandle(*ObjectHandle, #if 1
/* This is our fake handle, don't go too much long way */
if (*ObjectHandle == (LSA_HANDLE)0xcafe)
{
*ObjectHandle = NULL;
Status = STATUS_SUCCESS;
}
#endif
Status = ReferencePolicyHandle((LSA_HANDLE)*ObjectHandle,
0, 0,
&Policy); &Policy);
if (NT_SUCCESS(Status)) if (NT_SUCCESS(Status))
@ -181,29 +159,13 @@ LsarClose(LSAPR_HANDLE *ObjectHandle)
TRUE); TRUE);
} }
return Status;
#endif
NTSTATUS Status = STATUS_NOT_IMPLEMENTED;
TRACE("LsarClose called!\n");
/* This is our fake handle, don't go too much long way */
if (*ObjectHandle == (LSA_HANDLE)0xcafe)
{
*ObjectHandle = NULL;
Status = STATUS_SUCCESS;
}
TRACE("LsarClose done (Status: 0x%08lx)!\n", Status);
return Status; return Status;
} }
/* Function 1 */ /* Function 1 */
NTSTATUS NTSTATUS LsarDelete(
LsarDelete(LSAPR_HANDLE ObjectHandle) LSAPR_HANDLE ObjectHandle)
{ {
/* Deprecated */ /* Deprecated */
return STATUS_NOT_SUPPORTED; return STATUS_NOT_SUPPORTED;
@ -246,7 +208,7 @@ NTSTATUS LsarSetSecurityObject(
/* Function 5 */ /* Function 5 */
NTSTATUS LsarChangePassword( NTSTATUS LsarChangePassword(
handle_t hBinding, /* FIXME */ handle_t IDL_handle,
PRPC_UNICODE_STRING String1, PRPC_UNICODE_STRING String1,
PRPC_UNICODE_STRING String2, PRPC_UNICODE_STRING String2,
PRPC_UNICODE_STRING String3, PRPC_UNICODE_STRING String3,
@ -265,6 +227,7 @@ NTSTATUS LsarOpenPolicy(
ACCESS_MASK DesiredAccess, ACCESS_MASK DesiredAccess,
LSAPR_HANDLE *PolicyHandle) LSAPR_HANDLE *PolicyHandle)
{ {
#if 1
TRACE("LsarOpenPolicy called!\n"); TRACE("LsarOpenPolicy called!\n");
*PolicyHandle = (LSAPR_HANDLE)0xcafe; *PolicyHandle = (LSAPR_HANDLE)0xcafe;
@ -272,6 +235,10 @@ NTSTATUS LsarOpenPolicy(
TRACE("LsarOpenPolicy done!\n"); TRACE("LsarOpenPolicy done!\n");
return STATUS_SUCCESS; return STATUS_SUCCESS;
#else
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
#endif
} }
@ -572,7 +539,11 @@ NTSTATUS LsarLookupPrivilegeName(
/* Function 33 */ /* Function 33 */
NTSTATUS LsarLookupPrivilegeDisplayName( NTSTATUS LsarLookupPrivilegeDisplayName(
LSAPR_HANDLE PolicyHandle, /* FIXME */ LSAPR_HANDLE PolicyHandle,
PRPC_UNICODE_STRING Name,
USHORT ClientLanguage,
USHORT ClientSystemDefaultLanguage,
PRPC_UNICODE_STRING *DisplayName,
USHORT *LanguageReturned) USHORT *LanguageReturned)
{ {
UNIMPLEMENTED; UNIMPLEMENTED;
@ -1044,7 +1015,7 @@ NTSTATUS CredrRename(
/* Function 76 */ /* Function 76 */
NTSTATUS LsarLookupSids3( NTSTATUS LsarLookupSids3(
handle_t hBinding, LSAPR_HANDLE PolicyHandle,
PLSAPR_SID_ENUM_BUFFER SidEnumBuffer, PLSAPR_SID_ENUM_BUFFER SidEnumBuffer,
PLSAPR_REFERENCED_DOMAIN_LIST *ReferencedDomains, PLSAPR_REFERENCED_DOMAIN_LIST *ReferencedDomains,
PLSAPR_TRANSLATED_NAMES_EX TranslatedNames, PLSAPR_TRANSLATED_NAMES_EX TranslatedNames,
@ -1060,7 +1031,6 @@ NTSTATUS LsarLookupSids3(
/* Function 77 */ /* Function 77 */
NTSTATUS LsarLookupNames4( NTSTATUS LsarLookupNames4(
handle_t hBinding,
handle_t RpcHandle, handle_t RpcHandle,
DWORD Count, DWORD Count,
PRPC_UNICODE_STRING Names, PRPC_UNICODE_STRING Names,
@ -1111,4 +1081,121 @@ NTSTATUS LsarAdtReportSecurityEvent(
return STATUS_NOT_IMPLEMENTED; return STATUS_NOT_IMPLEMENTED;
} }
/* Function 82 */
NTSTATUS CredrFindBestCredential(
handle_t hBinding)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
}
/* Function 83 */
NTSTATUS LsarSetAuditPolicy(
handle_t hBinding)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
}
/* Function 84 */
NTSTATUS LsarQueryAuditPolicy(
handle_t hBinding)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
}
/* Function 85 */
NTSTATUS LsarEnumerateAuditPolicy(
handle_t hBinding)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
}
/* Function 86 */
NTSTATUS LsarEnumerateAuditCategories(
handle_t hBinding)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
}
/* Function 87 */
NTSTATUS LsarEnumerateAuditSubCategories(
handle_t hBinding)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
}
/* Function 88 */
NTSTATUS LsarLookupAuditCategoryName(
handle_t hBinding)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
}
/* Function 89 */
NTSTATUS LsarLookupAuditSubCategoryName(
handle_t hBinding)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
}
/* Function 90 */
NTSTATUS LsarSetAuditSecurity(
handle_t hBinding)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
}
/* Function 91 */
NTSTATUS LsarQueryAuditSecurity(
handle_t hBinding)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
}
/* Function 92 */
NTSTATUS CredReadByTokenHandle(
handle_t hBinding)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
}
/* Function 93 */
NTSTATUS CredrRestoreCredentials(
handle_t hBinding)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
}
/* Function 94 */
NTSTATUS CredrBackupCredentials(
handle_t hBinding)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
}
/* EOF */ /* EOF */

View file

@ -622,7 +622,6 @@ interface lsarpc
/* Function 5 */ /* Function 5 */
NTSTATUS LsarChangePassword( NTSTATUS LsarChangePassword(
[in] handle_t hBinding, /* FIXME */
[in] PRPC_UNICODE_STRING String1, [in] PRPC_UNICODE_STRING String1,
[in] PRPC_UNICODE_STRING String2, [in] PRPC_UNICODE_STRING String2,
[in] PRPC_UNICODE_STRING String3, [in] PRPC_UNICODE_STRING String3,
@ -805,11 +804,11 @@ interface lsarpc
/* Function 33 */ /* Function 33 */
NTSTATUS LsarLookupPrivilegeDisplayName( NTSTATUS LsarLookupPrivilegeDisplayName(
[in] LSAPR_HANDLE PolicyHandle, /* FIXME */ [in] LSAPR_HANDLE PolicyHandle,
/*[in] PRPC_UNICODE_STRING Name, [in] PRPC_UNICODE_STRING Name,
[in] USHORT ClientLanguage, [in] USHORT ClientLanguage,
[in] USHORT ClientSystemDefaultLanguage, [in] USHORT ClientSystemDefaultLanguage,
[out] PRPC_UNICODE_STRING *DisplayName,*/ [out] PRPC_UNICODE_STRING *DisplayName,
[out] USHORT *LanguageReturned); [out] USHORT *LanguageReturned);
/* Function 34 */ /* Function 34 */
@ -1078,7 +1077,7 @@ cpp_quote("#if _WIN32_WINNT >= 0x0501")
/* Function 76 */ /* Function 76 */
NTSTATUS LsarLookupSids3( NTSTATUS LsarLookupSids3(
[in] handle_t hBinding, /* FIXME */ [in] LSAPR_HANDLE PolicyHandle,
[in] PLSAPR_SID_ENUM_BUFFER SidEnumBuffer, [in] PLSAPR_SID_ENUM_BUFFER SidEnumBuffer,
[out] PLSAPR_REFERENCED_DOMAIN_LIST *ReferencedDomains, [out] PLSAPR_REFERENCED_DOMAIN_LIST *ReferencedDomains,
[in, out] PLSAPR_TRANSLATED_NAMES_EX TranslatedNames, [in, out] PLSAPR_TRANSLATED_NAMES_EX TranslatedNames,
@ -1089,8 +1088,7 @@ cpp_quote("#if _WIN32_WINNT >= 0x0501")
/* Function 77 */ /* Function 77 */
NTSTATUS LsarLookupNames4( NTSTATUS LsarLookupNames4(
[in] handle_t hBinding, /* FIXME */ [in] LSAPR_HANDLE PolicyHandle,
[in] handle_t RpcHandle,
[in] DWORD Count, [in] DWORD Count,
[in, size_is(Count)] PRPC_UNICODE_STRING Names, [in, size_is(Count)] PRPC_UNICODE_STRING Names,
[out] PLSAPR_REFERENCED_DOMAIN_LIST *ReferencedDomains, [out] PLSAPR_REFERENCED_DOMAIN_LIST *ReferencedDomains,