Get rid of the ugly container object code. Let LsapCreateDbObject and LsapOpenDbObject handle container objects instead.

svn path=/trunk/; revision=57449
This commit is contained in:
Eric Kohl 2012-09-30 23:50:30 +00:00
parent 0683a941e9
commit b0d00a039a
3 changed files with 148 additions and 108 deletions

View 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);
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);

View 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;
}

View 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,