#define NTOS_MODE_USER
#include <ndk/ntndk.h>
-#include "lsasrv.h"
#include "lsa_s.h"
#include <wine/debug.h>
-#define POLICY_DELETE (RTL_HANDLE_VALID << 1)
-typedef struct _LSAR_POLICY_HANDLE
+typedef struct _LSA_DB_HANDLE
{
- ULONG Flags;
+ ULONG Signature;
+ ULONG Type;
LONG RefCount;
ACCESS_MASK AccessGranted;
-} LSAR_POLICY_HANDLE, *PLSAR_POLICY_HANDLE;
+} LSA_DB_HANDLE, *PLSA_DB_HANDLE;
+
+#define LSAP_DB_SIGNATURE 0x12345678
static RTL_CRITICAL_SECTION PolicyHandleTableLock;
-static RTL_HANDLE_TABLE PolicyHandleTable;
WINE_DEFAULT_DEBUG_CHANNEL(lsasrv);
+
/* FUNCTIONS ***************************************************************/
-/*static*/ NTSTATUS
-ReferencePolicyHandle(IN LSAPR_HANDLE ObjectHandle,
- IN ACCESS_MASK DesiredAccess,
- OUT PLSAR_POLICY_HANDLE *Policy)
+static LSAPR_HANDLE
+LsapCreateDbHandle(ULONG Type)
{
- PLSAR_POLICY_HANDLE ReferencedPolicy;
- NTSTATUS Status = STATUS_SUCCESS;
+ PLSA_DB_HANDLE DbHandle;
- RtlEnterCriticalSection(&PolicyHandleTableLock);
+// RtlEnterCriticalSection(&PolicyHandleTableLock);
- if (RtlIsValidIndexHandle(&PolicyHandleTable,
- (ULONG)ObjectHandle,
- (PRTL_HANDLE_TABLE_ENTRY*)&ReferencedPolicy) &&
- !(ReferencedPolicy->Flags & POLICY_DELETE))
+ DbHandle = (PLSA_DB_HANDLE)RtlAllocateHeap(RtlGetProcessHeap(),
+ 0,
+ sizeof(LSA_DB_HANDLE));
+ if (DbHandle != NULL)
{
- if (RtlAreAllAccessesGranted(ReferencedPolicy->AccessGranted,
- DesiredAccess))
- {
- ReferencedPolicy->RefCount++;
- *Policy = ReferencedPolicy;
- }
- else
- Status = STATUS_ACCESS_DENIED;
+ DbHandle->Signature = LSAP_DB_SIGNATURE;
+ DbHandle->RefCount = 1;
+ DbHandle->Type = Type;
}
- else
- Status = STATUS_INVALID_HANDLE;
- RtlLeaveCriticalSection(&PolicyHandleTableLock);
+// RtlLeaveCriticalSection(&PolicyHandleTableLock);
- return Status;
+ return (LSAPR_HANDLE)DbHandle;
}
-/*static*/ VOID
-DereferencePolicyHandle(IN OUT PLSAR_POLICY_HANDLE Policy,
- IN BOOLEAN Delete)
+static BOOL
+LsapValidateDbHandle(LSAPR_HANDLE Handle)
{
- RtlEnterCriticalSection(&PolicyHandleTableLock);
+ PLSA_DB_HANDLE DbHandle = (PLSA_DB_HANDLE)Handle;
+ BOOL bValid = FALSE;
- if (Delete)
+ _SEH2_TRY
{
- Policy->Flags |= POLICY_DELETE;
- Policy->RefCount--;
-
- ASSERT(Policy->RefCount != 0);
+ if (DbHandle->Signature == LSAP_DB_SIGNATURE)
+ bValid = TRUE;
}
-
- if (--Policy->RefCount == 0)
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
- ASSERT(Policy->Flags & POLICY_DELETE);
- RtlFreeHandle(&PolicyHandleTable,
- (PRTL_HANDLE_TABLE_ENTRY)Policy);
+ bValid = FALSE;
}
+ _SEH2_END;
- RtlLeaveCriticalSection(&PolicyHandleTableLock);
+
+ return bValid;
}
-DWORD WINAPI
-LsapRpcThreadRoutine(LPVOID lpParameter)
+
+
+VOID
+LsarStartRpcServer(VOID)
{
RPC_STATUS Status;
- TRACE("LsapRpcThreadRoutine() called");
+ RtlInitializeCriticalSection(&PolicyHandleTableLock);
+
+ TRACE("LsarStartRpcServer() called");
Status = RpcServerUseProtseqEpW(L"ncacn_np",
10,
if (Status != RPC_S_OK)
{
WARN("RpcServerUseProtseqEpW() failed (Status %lx)\n", Status);
- return 0;
+ return;
}
Status = RpcServerRegisterIf(lsarpc_v0_0_s_ifspec,
if (Status != RPC_S_OK)
{
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)
{
WARN("RpcServerListen() failed (Status %lx)\n", Status);
- return 0;
+ return;
}
- 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");
+ TRACE("LsarStartRpcServer() done\n");
}
/* Function 0 */
-NTSTATUS
-LsarClose(LSAPR_HANDLE *ObjectHandle)
+NTSTATUS LsarClose(
+ LSAPR_HANDLE *ObjectHandle)
{
-#if 0
- PLSAR_POLICY_HANDLE Policy = NULL;
- NTSTATUS Status;
+ NTSTATUS Status = STATUS_SUCCESS;
TRACE("0x%p\n", ObjectHandle);
- Status = ReferencePolicyHandle(*ObjectHandle,
- 0,
- &Policy);
- if (NT_SUCCESS(Status))
+// RtlEnterCriticalSection(&PolicyHandleTableLock);
+
+ if (LsapValidateDbHandle(*ObjectHandle))
{
- /* delete the handle */
- DereferencePolicyHandle(Policy,
- TRUE);
+ RtlFreeHeap(RtlGetProcessHeap(), 0, *ObjectHandle);
+ *ObjectHandle = NULL;
}
+ else
+ Status = STATUS_INVALID_HANDLE;
- 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)
- Status = STATUS_SUCCESS;
-
-
- TRACE("LsarClose done (Status: 0x%08lx)!\n", Status);
+// RtlLeaveCriticalSection(&PolicyHandleTableLock);
return Status;
}
/* Function 1 */
-NTSTATUS
-LsarDelete(LSAPR_HANDLE ObjectHandle)
+NTSTATUS LsarDelete(
+ LSAPR_HANDLE ObjectHandle)
{
/* Deprecated */
return STATUS_NOT_SUPPORTED;
/* Function 5 */
NTSTATUS LsarChangePassword(
- handle_t hBinding, /* FIXME */
+ handle_t IDL_handle,
PRPC_UNICODE_STRING String1,
PRPC_UNICODE_STRING String2,
PRPC_UNICODE_STRING String3,
ACCESS_MASK DesiredAccess,
LSAPR_HANDLE *PolicyHandle)
{
+ NTSTATUS Status = STATUS_SUCCESS;
+
TRACE("LsarOpenPolicy called!\n");
- *PolicyHandle = (LSAPR_HANDLE)0xcafe;
+ RtlEnterCriticalSection(&PolicyHandleTableLock);
+
+ *PolicyHandle = LsapCreateDbHandle(0);
+ if (*PolicyHandle == NULL)
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+
+ RtlLeaveCriticalSection(&PolicyHandleTableLock);
TRACE("LsarOpenPolicy done!\n");
- return STATUS_SUCCESS;
+ return Status;
}
/* Function 33 */
NTSTATUS LsarLookupPrivilegeDisplayName(
- LSAPR_HANDLE PolicyHandle, /* FIXME */
+ LSAPR_HANDLE PolicyHandle,
+ PRPC_UNICODE_STRING Name,
+ USHORT ClientLanguage,
+ USHORT ClientSystemDefaultLanguage,
+ PRPC_UNICODE_STRING *DisplayName,
USHORT *LanguageReturned)
{
UNIMPLEMENTED;
PRPC_SID AccountSid,
PLSAPR_USER_RIGHT_SET UserRights)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ FIXME("(%p,%p,%p) stub\n", PolicyHandle, AccountSid, UserRights);
+
+ if (!LsapValidateDbHandle(PolicyHandle))
+ return STATUS_INVALID_HANDLE;
+
+ UserRights->Entries = 0;
+ UserRights->UserRights = NULL;
+ return STATUS_OBJECT_NAME_NOT_FOUND;
}
/* Function 76 */
NTSTATUS LsarLookupSids3(
- handle_t hBinding,
+ LSAPR_HANDLE PolicyHandle,
PLSAPR_SID_ENUM_BUFFER SidEnumBuffer,
PLSAPR_REFERENCED_DOMAIN_LIST *ReferencedDomains,
PLSAPR_TRANSLATED_NAMES_EX TranslatedNames,
/* Function 77 */
NTSTATUS LsarLookupNames4(
- handle_t hBinding,
handle_t RpcHandle,
DWORD Count,
PRPC_UNICODE_STRING Names,
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 */