diff --git a/reactos/dll/win32/lsasrv/database.c b/reactos/dll/win32/lsasrv/database.c index de113c5602e..6251a0e55f3 100644 --- a/reactos/dll/win32/lsasrv/database.c +++ b/reactos/dll/win32/lsasrv/database.c @@ -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); - - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE, - ParentKeyHandle, - NULL); - - Status = NtCreateKey(&ObjectKeyHandle, - KEY_ALL_ACCESS, - &ObjectAttributes, - 0, - NULL, - 0, - NULL); - if (!NT_SUCCESS(Status)) + if (ContainerName != NULL) { - return Status; + /* 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; + } + + /* Open the object key */ + RtlInitUnicodeString(&KeyName, + ObjectName); + + 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 + { + 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); - - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE, - ParentKeyHandle, - NULL); - - Status = NtOpenKey(&ObjectKeyHandle, - KEY_ALL_ACCESS, - &ObjectAttributes); - if (!NT_SUCCESS(Status)) + if (ContainerName != NULL) { - return Status; + /* 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; + } + + /* Open the object key */ + RtlInitUnicodeString(&KeyName, + ObjectName); + + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + ContainerKeyHandle, + NULL); + + Status = NtOpenKey(&ObjectKeyHandle, + KEY_ALL_ACCESS, + &ObjectAttributes); + + NtClose(ContainerKeyHandle); + + if (!NT_SUCCESS(Status)) + { + return Status; + } + } + else + { + /* 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); diff --git a/reactos/dll/win32/lsasrv/lsarpc.c b/reactos/dll/win32/lsasrv/lsarpc.c index aef0c4b85bb..ce9d4818155 100644 --- a/reactos/dll/win32/lsasrv/lsarpc.c +++ b/reactos/dll/win32/lsasrv/lsarpc.c @@ -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; } diff --git a/reactos/dll/win32/lsasrv/lsasrv.h b/reactos/dll/win32/lsasrv/lsasrv.h index 0086868473f..cc9737eba1e 100644 --- a/reactos/dll/win32/lsasrv/lsasrv.h +++ b/reactos/dll/win32/lsasrv/lsasrv.h @@ -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,