#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;
}
+
+
+
VOID
LsarStartRpcServer(VOID)
{
RPC_STATUS Status;
RtlInitializeCriticalSection(&PolicyHandleTableLock);
- RtlInitializeHandleTable(0x1000,
- sizeof(LSAR_POLICY_HANDLE),
- &PolicyHandleTable);
TRACE("LsarStartRpcServer() called");
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;
+
+// RtlLeaveCriticalSection(&PolicyHandleTableLock);
return Status;
-#endif
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
}
/* 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)
{
- UNIMPLEMENTED;
- return STATUS_NOT_IMPLEMENTED;
+ NTSTATUS Status = STATUS_SUCCESS;
+
+ TRACE("LsarOpenPolicy called!\n");
+
+ RtlEnterCriticalSection(&PolicyHandleTableLock);
+
+ *PolicyHandle = LsapCreateDbHandle(0);
+ if (*PolicyHandle == NULL)
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+
+ RtlLeaveCriticalSection(&PolicyHandleTableLock);
+
+ TRACE("LsarOpenPolicy done!\n");
+
+ 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 */