[LSASRV]
authorEric Kohl <eric.kohl@reactos.org>
Sun, 30 Sep 2012 23:50:30 +0000 (23:50 +0000)
committerEric Kohl <eric.kohl@reactos.org>
Sun, 30 Sep 2012 23:50:30 +0000 (23:50 +0000)
Get rid of the ugly container object code. Let LsapCreateDbObject and LsapOpenDbObject handle container objects instead.

svn path=/trunk/; revision=57449

reactos/dll/win32/lsasrv/database.c
reactos/dll/win32/lsasrv/lsarpc.c
reactos/dll/win32/lsasrv/lsasrv.h

index de113c5..6251a0e 100644 (file)
@@ -283,6 +283,7 @@ LsapCreateDatabaseObjects(VOID)
 
     /* Open the 'Policy' object */
     Status = LsapOpenDbObject(NULL,
+                              NULL,
                               L"Policy",
                               LsaDbPolicyObject,
                               0,
@@ -427,6 +428,7 @@ LsapInitDatabase(VOID)
 
 NTSTATUS
 LsapCreateDbObject(IN PLSA_DB_OBJECT ParentObject,
+                   IN LPWSTR ContainerName,
                    IN LPWSTR ObjectName,
                    IN LSA_DB_OBJECT_TYPE ObjectType,
                    IN ACCESS_MASK DesiredAccess,
@@ -436,7 +438,8 @@ LsapCreateDbObject(IN PLSA_DB_OBJECT ParentObject,
     OBJECT_ATTRIBUTES ObjectAttributes;
     UNICODE_STRING KeyName;
     HANDLE ParentKeyHandle;
-    HANDLE ObjectKeyHandle;
+    HANDLE ContainerKeyHandle = NULL;
+    HANDLE ObjectKeyHandle = NULL;
     NTSTATUS Status;
 
     if (DbObject == NULL)
@@ -447,25 +450,73 @@ LsapCreateDbObject(IN PLSA_DB_OBJECT ParentObject,
     else
         ParentKeyHandle = ParentObject->KeyHandle;
 
-    RtlInitUnicodeString(&KeyName,
-                         ObjectName);
+    if (ContainerName != NULL)
+    {
+        /* Open the container key */
+        RtlInitUnicodeString(&KeyName,
+                             ContainerName);
+
+        InitializeObjectAttributes(&ObjectAttributes,
+                                   &KeyName,
+                                   OBJ_CASE_INSENSITIVE,
+                                   ParentKeyHandle,
+                                   NULL);
+
+        Status = NtOpenKey(&ContainerKeyHandle,
+                           KEY_ALL_ACCESS,
+                           &ObjectAttributes);
+        if (!NT_SUCCESS(Status))
+        {
+            return Status;
+        }
 
-    InitializeObjectAttributes(&ObjectAttributes,
-                               &KeyName,
-                               OBJ_CASE_INSENSITIVE,
-                               ParentKeyHandle,
-                               NULL);
+        /* Open the object key */
+        RtlInitUnicodeString(&KeyName,
+                             ObjectName);
 
-    Status = NtCreateKey(&ObjectKeyHandle,
-                         KEY_ALL_ACCESS,
-                         &ObjectAttributes,
-                         0,
-                         NULL,
-                         0,
-                         NULL);
-    if (!NT_SUCCESS(Status))
+        InitializeObjectAttributes(&ObjectAttributes,
+                                   &KeyName,
+                                   OBJ_CASE_INSENSITIVE,
+                                   ContainerKeyHandle,
+                                   NULL);
+
+        Status = NtCreateKey(&ObjectKeyHandle,
+                             KEY_ALL_ACCESS,
+                             &ObjectAttributes,
+                             0,
+                             NULL,
+                             0,
+                             NULL);
+
+        NtClose(ContainerKeyHandle);
+
+        if (!NT_SUCCESS(Status))
+        {
+            return Status;
+        }
+    }
+    else
     {
-        return Status;
+        RtlInitUnicodeString(&KeyName,
+                             ObjectName);
+
+        InitializeObjectAttributes(&ObjectAttributes,
+                                   &KeyName,
+                                   OBJ_CASE_INSENSITIVE,
+                                   ParentKeyHandle,
+                                   NULL);
+
+        Status = NtCreateKey(&ObjectKeyHandle,
+                             KEY_ALL_ACCESS,
+                             &ObjectAttributes,
+                             0,
+                             NULL,
+                             0,
+                             NULL);
+        if (!NT_SUCCESS(Status))
+        {
+            return Status;
+        }
     }
 
     NewObject = RtlAllocateHeap(RtlGetProcessHeap(),
@@ -495,6 +546,7 @@ LsapCreateDbObject(IN PLSA_DB_OBJECT ParentObject,
 
 NTSTATUS
 LsapOpenDbObject(IN PLSA_DB_OBJECT ParentObject,
+                 IN LPWSTR ContainerName,
                  IN LPWSTR ObjectName,
                  IN LSA_DB_OBJECT_TYPE ObjectType,
                  IN ACCESS_MASK DesiredAccess,
@@ -504,7 +556,8 @@ LsapOpenDbObject(IN PLSA_DB_OBJECT ParentObject,
     OBJECT_ATTRIBUTES ObjectAttributes;
     UNICODE_STRING KeyName;
     HANDLE ParentKeyHandle;
-    HANDLE ObjectKeyHandle;
+    HANDLE ContainerKeyHandle = NULL;
+    HANDLE ObjectKeyHandle = NULL;
     NTSTATUS Status;
 
     if (DbObject == NULL)
@@ -515,26 +568,71 @@ LsapOpenDbObject(IN PLSA_DB_OBJECT ParentObject,
     else
         ParentKeyHandle = ParentObject->KeyHandle;
 
-    RtlInitUnicodeString(&KeyName,
-                         ObjectName);
+    if (ContainerName != NULL)
+    {
+        /* Open the container key */
+        RtlInitUnicodeString(&KeyName,
+                             ContainerName);
+
+        InitializeObjectAttributes(&ObjectAttributes,
+                                   &KeyName,
+                                   OBJ_CASE_INSENSITIVE,
+                                   ParentKeyHandle,
+                                   NULL);
+
+        Status = NtOpenKey(&ContainerKeyHandle,
+                           KEY_ALL_ACCESS,
+                           &ObjectAttributes);
+        if (!NT_SUCCESS(Status))
+        {
+            return Status;
+        }
 
-    InitializeObjectAttributes(&ObjectAttributes,
-                               &KeyName,
-                               OBJ_CASE_INSENSITIVE,
-                               ParentKeyHandle,
-                               NULL);
+        /* Open the object key */
+        RtlInitUnicodeString(&KeyName,
+                             ObjectName);
 
-    Status = NtOpenKey(&ObjectKeyHandle,
-                       KEY_ALL_ACCESS,
-                       &ObjectAttributes);
-    if (!NT_SUCCESS(Status))
+        InitializeObjectAttributes(&ObjectAttributes,
+                                   &KeyName,
+                                   OBJ_CASE_INSENSITIVE,
+                                   ContainerKeyHandle,
+                                   NULL);
+
+        Status = NtOpenKey(&ObjectKeyHandle,
+                           KEY_ALL_ACCESS,
+                           &ObjectAttributes);
+
+        NtClose(ContainerKeyHandle);
+
+        if (!NT_SUCCESS(Status))
+        {
+            return Status;
+        }
+    }
+    else
     {
-        return Status;
+        /* Open the object key */
+        RtlInitUnicodeString(&KeyName,
+                             ObjectName);
+
+        InitializeObjectAttributes(&ObjectAttributes,
+                                   &KeyName,
+                                   OBJ_CASE_INSENSITIVE,
+                                   ParentKeyHandle,
+                                   NULL);
+
+        Status = NtOpenKey(&ObjectKeyHandle,
+                           KEY_ALL_ACCESS,
+                           &ObjectAttributes);
+        if (!NT_SUCCESS(Status))
+        {
+            return Status;
+        }
     }
 
     NewObject = RtlAllocateHeap(RtlGetProcessHeap(),
-                                  0,
-                                  sizeof(LSA_DB_OBJECT));
+                                0,
+                                sizeof(LSA_DB_OBJECT));
     if (NewObject == NULL)
     {
         NtClose(ObjectKeyHandle);
index aef0c4b..ce9d481 100644 (file)
@@ -183,6 +183,7 @@ NTSTATUS WINAPI LsarOpenPolicy(
     RtlEnterCriticalSection(&PolicyHandleTableLock);
 
     Status = LsapOpenDbObject(NULL,
+                              NULL,
                               L"Policy",
                               LsaDbPolicyObject,
                               DesiredAccess,
@@ -435,7 +436,6 @@ NTSTATUS WINAPI LsarCreateAccount(
     LSAPR_HANDLE *AccountHandle)
 {
     PLSA_DB_OBJECT PolicyObject;
-    PLSA_DB_OBJECT AccountsObject = NULL;
     PLSA_DB_OBJECT AccountObject = NULL;
     LPWSTR SidString = NULL;
     NTSTATUS Status = STATUS_SUCCESS;
@@ -455,18 +455,6 @@ NTSTATUS WINAPI LsarCreateAccount(
         return Status;
     }
 
-    /* Open the Accounts object */
-    Status = LsapOpenDbObject(PolicyObject,
-                              L"Accounts",
-                              LsaDbContainerObject,
-                              0,
-                              &AccountsObject);
-    if (!NT_SUCCESS(Status))
-    {
-        ERR("LsapCreateDbObject (Accounts) failed (Status 0x%08lx)\n", Status);
-        goto done;
-    }
-
     /* Create SID string */
     if (!ConvertSidToStringSid((PSID)AccountSid,
                                &SidString))
@@ -477,14 +465,15 @@ NTSTATUS WINAPI LsarCreateAccount(
     }
 
     /* Create the Account object */
-    Status = LsapCreateDbObject(AccountsObject,
+    Status = LsapCreateDbObject(PolicyObject,
+                                L"Accounts",
                                 SidString,
                                 LsaDbAccountObject,
                                 DesiredAccess,
                                 &AccountObject);
     if (!NT_SUCCESS(Status))
     {
-        ERR("LsapCreateDbObject (Account) failed (Status 0x%08lx)\n", Status);
+        ERR("LsapCreateDbObject failed (Status 0x%08lx)\n", Status);
         goto done;
     }
 
@@ -508,9 +497,6 @@ done:
         *AccountHandle = (LSAPR_HANDLE)AccountObject;
     }
 
-    if (AccountsObject != NULL)
-        LsapCloseDbObject(AccountsObject);
-
     return STATUS_SUCCESS;
 }
 
@@ -750,7 +736,6 @@ NTSTATUS WINAPI LsarCreateSecret(
     LSAPR_HANDLE *SecretHandle)
 {
     PLSA_DB_OBJECT PolicyObject;
-    PLSA_DB_OBJECT SecretsObject = NULL;
     PLSA_DB_OBJECT SecretObject = NULL;
     LARGE_INTEGER Time;
     NTSTATUS Status = STATUS_SUCCESS;
@@ -766,18 +751,6 @@ NTSTATUS WINAPI LsarCreateSecret(
         return Status;
     }
 
-    /* Open the Secrets object */
-    Status = LsapOpenDbObject(PolicyObject,
-                              L"Secrets",
-                              LsaDbContainerObject,
-                              0,
-                              &SecretsObject);
-    if (!NT_SUCCESS(Status))
-    {
-        ERR("LsapCreateDbObject (Secrets) failed (Status 0x%08lx)\n", Status);
-        goto done;
-    }
-
     /* Get the current time */
     Status = NtQuerySystemTime(&Time);
     if (!NT_SUCCESS(Status))
@@ -787,14 +760,15 @@ NTSTATUS WINAPI LsarCreateSecret(
     }
 
     /* Create the Secret object */
-    Status = LsapCreateDbObject(SecretsObject,
+    Status = LsapCreateDbObject(PolicyObject,
+                                L"Secrets",
                                 SecretName->Buffer,
                                 LsaDbSecretObject,
                                 DesiredAccess,
                                 &SecretObject);
     if (!NT_SUCCESS(Status))
     {
-        ERR("LsapCreateDbObject (Secret) failed (Status 0x%08lx)\n", Status);
+        ERR("LsapCreateDbObject failed (Status 0x%08lx)\n", Status);
         goto done;
     }
 
@@ -826,9 +800,6 @@ done:
         *SecretHandle = (LSAPR_HANDLE)SecretObject;
     }
 
-    if (SecretsObject != NULL)
-        LsapCloseDbObject(SecretsObject);
-
     return STATUS_SUCCESS;
 }
 
@@ -841,7 +812,6 @@ NTSTATUS WINAPI LsarOpenAccount(
     LSAPR_HANDLE *AccountHandle)
 {
     PLSA_DB_OBJECT PolicyObject;
-    PLSA_DB_OBJECT AccountsObject = NULL;
     PLSA_DB_OBJECT AccountObject = NULL;
     LPWSTR SidString = NULL;
     NTSTATUS Status = STATUS_SUCCESS;
@@ -861,18 +831,6 @@ NTSTATUS WINAPI LsarOpenAccount(
         return Status;
     }
 
-    /* Open the Accounts object */
-    Status = LsapOpenDbObject(PolicyObject,
-                              L"Accounts",
-                              LsaDbContainerObject,
-                              0,
-                              &AccountsObject);
-    if (!NT_SUCCESS(Status))
-    {
-        ERR("LsapOpenDbObject (Accounts) failed (Status 0x%08lx)\n", Status);
-        goto done;
-    }
-
     /* Create SID string */
     if (!ConvertSidToStringSid((PSID)AccountSid,
                                &SidString))
@@ -883,14 +841,15 @@ NTSTATUS WINAPI LsarOpenAccount(
     }
 
     /* Create the Account object */
-    Status = LsapOpenDbObject(AccountsObject,
+    Status = LsapOpenDbObject(PolicyObject,
+                              L"Accounts",
                               SidString,
                               LsaDbAccountObject,
                               DesiredAccess,
                               &AccountObject);
     if (!NT_SUCCESS(Status))
     {
-        ERR("LsapOpenDbObject (Account) failed (Status 0x%08lx)\n", Status);
+        ERR("LsapOpenDbObject failed (Status 0x%08lx)\n", Status);
         goto done;
     }
 
@@ -914,9 +873,6 @@ done:
         *AccountHandle = (LSAPR_HANDLE)AccountObject;
     }
 
-    if (AccountsObject != NULL)
-        LsapCloseDbObject(AccountsObject);
-
     return Status;
 }
 
@@ -1257,7 +1213,6 @@ NTSTATUS WINAPI LsarOpenSecret(
     LSAPR_HANDLE *SecretHandle)
 {
     PLSA_DB_OBJECT PolicyObject;
-    PLSA_DB_OBJECT SecretsObject = NULL;
     PLSA_DB_OBJECT SecretObject = NULL;
     NTSTATUS Status = STATUS_SUCCESS;
 
@@ -1272,27 +1227,16 @@ NTSTATUS WINAPI LsarOpenSecret(
         return Status;
     }
 
-    /* Open the Secrets object */
+    /* Create the secret object */
     Status = LsapOpenDbObject(PolicyObject,
                               L"Secrets",
-                              LsaDbContainerObject,
-                              0,
-                              &SecretsObject);
-    if (!NT_SUCCESS(Status))
-    {
-        ERR("LsapCreateDbObject (Secrets) failed (Status 0x%08lx)\n", Status);
-        goto done;
-    }
-
-    /* Create the secret object */
-    Status = LsapOpenDbObject(SecretsObject,
                               SecretName->Buffer,
                               LsaDbSecretObject,
                               DesiredAccess,
                               &SecretObject);
     if (!NT_SUCCESS(Status))
     {
-        ERR("LsapOpenDbObject (Secret) failed (Status 0x%08lx)\n", Status);
+        ERR("LsapOpenDbObject failed (Status 0x%08lx)\n", Status);
         goto done;
     }
 
@@ -1307,9 +1251,6 @@ done:
         *SecretHandle = (LSAPR_HANDLE)SecretObject;
     }
 
-    if (SecretsObject != NULL)
-        LsapCloseDbObject(SecretsObject);
-
     return STATUS_SUCCESS;
 }
 
index 0086868..cc9737e 100644 (file)
@@ -33,7 +33,6 @@
 typedef enum _LSA_DB_OBJECT_TYPE
 {
     LsaDbIgnoreObject,
-    LsaDbContainerObject,
     LsaDbPolicyObject,
     LsaDbAccountObject,
     LsaDbDomainObject,
@@ -71,6 +70,7 @@ LsapInitDatabase(VOID);
 
 NTSTATUS
 LsapCreateDbObject(IN PLSA_DB_OBJECT ParentObject,
+                   IN LPWSTR ContainerName,
                    IN LPWSTR ObjectName,
                    IN LSA_DB_OBJECT_TYPE HandleType,
                    IN ACCESS_MASK DesiredAccess,
@@ -78,6 +78,7 @@ LsapCreateDbObject(IN PLSA_DB_OBJECT ParentObject,
 
 NTSTATUS
 LsapOpenDbObject(IN PLSA_DB_OBJECT ParentObject,
+                 IN LPWSTR ContainerName,
                  IN LPWSTR ObjectName,
                  IN LSA_DB_OBJECT_TYPE ObjectType,
                  IN ACCESS_MASK DesiredAccess,