/* FUNCTIONS ***************************************************************/
NTSTATUS
-LsarSetPrimaryDomain(LSAPR_HANDLE PolicyHandle,
+LsarSetPrimaryDomain(PLSA_DB_OBJECT PolicyObject,
PLSAPR_POLICY_PRIMARY_DOM_INFO Info)
{
PUNICODE_STRING Buffer;
NTSTATUS Status;
LPWSTR Ptr;
- TRACE("LsarSetPrimaryDomain(%p, %p)\n", PolicyHandle, Info);
+ TRACE("LsarSetPrimaryDomain(%p, %p)\n", PolicyObject, Info);
Length = sizeof(UNICODE_STRING) + Info->Name.MaximumLength;
Buffer = RtlAllocateHeap(RtlGetProcessHeap(),
Ptr = (LPWSTR)((ULONG_PTR)Buffer + sizeof(UNICODE_STRING));
memcpy(Ptr, Info->Name.Buffer, Info->Name.MaximumLength);
- Status = LsapSetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle,
+ Status = LsapSetObjectAttribute(PolicyObject,
L"PolPrDmN",
- Buffer, Length);
+ Buffer,
+ Length);
RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
if (Info->Sid != NULL)
Length = RtlLengthSid(Info->Sid);
- Status = LsapSetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle,
+ Status = LsapSetObjectAttribute(PolicyObject,
L"PolPrDmS",
(LPBYTE)Info->Sid,
Length);
NTSTATUS
-LsarSetAccountDomain(LSAPR_HANDLE PolicyHandle,
+LsarSetAccountDomain(PLSA_DB_OBJECT PolicyObject,
PLSAPR_POLICY_ACCOUNT_DOM_INFO Info)
{
PUNICODE_STRING Buffer;
NTSTATUS Status;
LPWSTR Ptr;
- TRACE("LsarSetAccountDomain(%p, %p)\n", PolicyHandle, Info);
+ TRACE("LsarSetAccountDomain(%p, %p)\n", PolicyObject, Info);
Length = sizeof(UNICODE_STRING) + Info->DomainName.MaximumLength;
Buffer = RtlAllocateHeap(RtlGetProcessHeap(),
Ptr = (LPWSTR)((ULONG_PTR)Buffer + sizeof(UNICODE_STRING));
memcpy(Ptr, Info->DomainName.Buffer, Info->DomainName.MaximumLength);
- Status = LsapSetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle,
+ Status = LsapSetObjectAttribute(PolicyObject,
L"PolAcDmN",
- Buffer, Length);
+ Buffer,
+ Length);
RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
if (Info->Sid != NULL)
Length = RtlLengthSid(Info->Sid);
- Status = LsapSetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle,
+ Status = LsapSetObjectAttribute(PolicyObject,
L"PolAcDmS",
(LPBYTE)Info->Sid,
Length);
NTSTATUS
-LsarSetDnsDomain(LSAPR_HANDLE PolicyHandle,
+LsarSetDnsDomain(PLSA_DB_OBJECT PolicyObject,
PLSAPR_POLICY_DNS_DOMAIN_INFO Info)
{
NTSTATUS
-LsarQueryAuditEvents(LSAPR_HANDLE PolicyHandle,
+LsarQueryAuditLog(PLSA_DB_OBJECT PolicyObject,
+ PLSAPR_POLICY_INFORMATION *PolicyInformation)
+{
+ PPOLICY_AUDIT_LOG_INFO AuditLogInfo = NULL;
+ ULONG AttributeSize;
+ NTSTATUS Status;
+
+ *PolicyInformation = NULL;
+
+ AttributeSize = sizeof(POLICY_AUDIT_LOG_INFO);
+ AuditLogInfo = MIDL_user_allocate(AttributeSize);
+ if (AuditLogInfo == NULL)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ Status = LsapGetObjectAttribute(PolicyObject,
+ L"PolAdtLg",
+ AuditLogInfo,
+ &AttributeSize);
+ if (!NT_SUCCESS(Status))
+ {
+ MIDL_user_free(AuditLogInfo);
+ }
+ else
+ {
+ *PolicyInformation = (PLSAPR_POLICY_INFORMATION)AuditLogInfo;
+ }
+
+ return Status;
+}
+
+
+NTSTATUS
+LsarQueryAuditEvents(PLSA_DB_OBJECT PolicyObject,
PLSAPR_POLICY_INFORMATION *PolicyInformation)
{
+ PLSAP_POLICY_AUDIT_EVENTS_DATA AuditData = NULL;
PLSAPR_POLICY_AUDIT_EVENTS_INFO p = NULL;
+ ULONG AttributeSize;
+ NTSTATUS Status = STATUS_SUCCESS;
- p = MIDL_user_allocate(sizeof(LSAPR_POLICY_AUDIT_EVENTS_INFO));
- if (p == NULL)
- return STATUS_INSUFFICIENT_RESOURCES;
+ *PolicyInformation = NULL;
+
+ AttributeSize = 0;
+ Status = LsapGetObjectAttribute(PolicyObject,
+ L"PolAdtEv",
+ NULL,
+ &AttributeSize);
+ if (!NT_SUCCESS(Status))
+ return Status;
+
+ if (AttributeSize > 0)
+ {
+ AuditData = MIDL_user_allocate(AttributeSize);
+ if (AuditData == NULL)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ Status = LsapGetObjectAttribute(PolicyObject,
+ L"PolAdtEv",
+ AuditData,
+ &AttributeSize);
+ if (!NT_SUCCESS(Status))
+ goto done;
+
+ p = MIDL_user_allocate(sizeof(LSAPR_POLICY_AUDIT_EVENTS_INFO));
+ if (p == NULL)
+ {
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ goto done;
+ }
- p->AuditingMode = FALSE; /* no auditing */
- p->EventAuditingOptions = NULL;
- p->MaximumAuditEventCount = 0;
+ p->AuditingMode = AuditData->AuditingMode;
+ p->MaximumAuditEventCount = AuditData->MaximumAuditEventCount;
+
+ p->EventAuditingOptions = MIDL_user_allocate(AuditData->MaximumAuditEventCount * sizeof(DWORD));
+ if (p->EventAuditingOptions == NULL)
+ {
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ goto done;
+ }
+
+ memcpy(p->EventAuditingOptions,
+ &(AuditData->AuditEvents[0]),
+ AuditData->MaximumAuditEventCount * sizeof(DWORD));
+ }
*PolicyInformation = (PLSAPR_POLICY_INFORMATION)p;
+done:
+ if (!NT_SUCCESS(Status))
+ {
+ if (p->EventAuditingOptions != NULL)
+ MIDL_user_free(p->EventAuditingOptions);
+
+ if (p != NULL)
+ MIDL_user_free(p);
+ }
+
+ if (AuditData != NULL)
+ MIDL_user_free(AuditData);
+
return STATUS_SUCCESS;
}
NTSTATUS
-LsarQueryPrimaryDomain(LSAPR_HANDLE PolicyHandle,
+LsarQueryPrimaryDomain(PLSA_DB_OBJECT PolicyObject,
PLSAPR_POLICY_INFORMATION *PolicyInformation)
{
PLSAPR_POLICY_PRIMARY_DOM_INFO p = NULL;
return STATUS_INSUFFICIENT_RESOURCES;
/* Domain Name */
- Status = LsapGetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle,
+ AttributeSize = 0;
+ Status = LsapGetObjectAttribute(PolicyObject,
L"PolPrDmN",
NULL,
&AttributeSize);
goto Done;
}
- Status = LsapGetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle,
+ Status = LsapGetObjectAttribute(PolicyObject,
L"PolPrDmN",
DomainName,
&AttributeSize);
/* Domain SID */
AttributeSize = 0;
- Status = LsapGetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle,
+ Status = LsapGetObjectAttribute(PolicyObject,
L"PolPrDmS",
NULL,
&AttributeSize);
goto Done;
}
- Status = LsapGetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle,
+ Status = LsapGetObjectAttribute(PolicyObject,
L"PolPrDmS",
p->Sid,
&AttributeSize);
}
}
+ return Status;
+}
+
+
+NTSTATUS
+LsarQueryPdAccount(PLSA_DB_OBJECT PolicyObject,
+ PLSAPR_POLICY_INFORMATION *PolicyInformation)
+{
+ PLSAPR_POLICY_PD_ACCOUNT_INFO PdAccountInfo = NULL;
+
+ *PolicyInformation = NULL;
+
+ PdAccountInfo = MIDL_user_allocate(sizeof(LSAPR_POLICY_PD_ACCOUNT_INFO));
+ if (PdAccountInfo == NULL)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ PdAccountInfo->Name.Length = 0;
+ PdAccountInfo->Name.MaximumLength = 0;
+ PdAccountInfo->Name.Buffer = NULL;
+
+ *PolicyInformation = (PLSAPR_POLICY_INFORMATION)PdAccountInfo;
+
return STATUS_SUCCESS;
}
NTSTATUS
-LsarQueryAccountDomain(LSAPR_HANDLE PolicyHandle,
+LsarQueryAccountDomain(PLSA_DB_OBJECT PolicyObject,
PLSAPR_POLICY_INFORMATION *PolicyInformation)
{
PLSAPR_POLICY_ACCOUNT_DOM_INFO p = NULL;
PUNICODE_STRING DomainName;
- ULONG AttributeSize;
+ ULONG AttributeSize = 0;
NTSTATUS Status;
*PolicyInformation = NULL;
return STATUS_INSUFFICIENT_RESOURCES;
/* Domain Name */
- Status = LsapGetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle,
+ Status = LsapGetObjectAttribute(PolicyObject,
L"PolAcDmN",
NULL,
&AttributeSize);
goto Done;
}
- Status = LsapGetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle,
+ Status = LsapGetObjectAttribute(PolicyObject,
L"PolAcDmN",
DomainName,
&AttributeSize);
/* Domain SID */
AttributeSize = 0;
- Status = LsapGetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle,
+ Status = LsapGetObjectAttribute(PolicyObject,
L"PolAcDmS",
NULL,
&AttributeSize);
goto Done;
}
- Status = LsapGetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle,
+ Status = LsapGetObjectAttribute(PolicyObject,
L"PolAcDmS",
p->Sid,
&AttributeSize);
}
}
- return STATUS_SUCCESS;
+ return Status;
+}
+
+
+NTSTATUS
+LsarQueryServerRole(PLSA_DB_OBJECT PolicyObject,
+ PLSAPR_POLICY_INFORMATION *PolicyInformation)
+{
+ PPOLICY_LSA_SERVER_ROLE_INFO ServerRoleInfo = NULL;
+ ULONG AttributeSize;
+ NTSTATUS Status;
+
+ *PolicyInformation = NULL;
+
+ AttributeSize = sizeof(POLICY_LSA_SERVER_ROLE_INFO);
+ ServerRoleInfo = MIDL_user_allocate(AttributeSize);
+ if (ServerRoleInfo == NULL)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ Status = LsapGetObjectAttribute(PolicyObject,
+ L"PolSrvRo",
+ ServerRoleInfo,
+ &AttributeSize);
+ if (Status == STATUS_OBJECT_NAME_NOT_FOUND)
+ {
+ ServerRoleInfo->LsaServerRole = PolicyServerRolePrimary;
+ Status = STATUS_SUCCESS;
+ }
+
+ if (!NT_SUCCESS(Status))
+ {
+ MIDL_user_free(ServerRoleInfo);
+ }
+ else
+ {
+ *PolicyInformation = (PLSAPR_POLICY_INFORMATION)ServerRoleInfo;
+ }
+
+ return Status;
+}
+
+
+NTSTATUS
+LsarQueryDefaultQuota(PLSA_DB_OBJECT PolicyObject,
+ PLSAPR_POLICY_INFORMATION *PolicyInformation)
+{
+ PPOLICY_DEFAULT_QUOTA_INFO QuotaInfo = NULL;
+ ULONG AttributeSize;
+ NTSTATUS Status;
+
+ *PolicyInformation = NULL;
+
+ AttributeSize = sizeof(POLICY_DEFAULT_QUOTA_INFO);
+ QuotaInfo = MIDL_user_allocate(AttributeSize);
+ if (QuotaInfo == NULL)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ Status = LsapGetObjectAttribute(PolicyObject,
+ L"DefQuota",
+ QuotaInfo,
+ &AttributeSize);
+ if (!NT_SUCCESS(Status))
+ {
+ MIDL_user_free(QuotaInfo);
+ }
+ else
+ {
+ *PolicyInformation = (PLSAPR_POLICY_INFORMATION)QuotaInfo;
+ }
+
+ return Status;
+}
+
+
+NTSTATUS
+LsarQueryReplicaSource(PLSA_DB_OBJECT PolicyObject,
+ PLSAPR_POLICY_INFORMATION *PolicyInformation)
+{
+ *PolicyInformation = NULL;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+
+NTSTATUS
+LsarQueryModification(PLSA_DB_OBJECT PolicyObject,
+ PLSAPR_POLICY_INFORMATION *PolicyInformation)
+{
+ PPOLICY_MODIFICATION_INFO Info = NULL;
+ ULONG AttributeSize;
+ NTSTATUS Status;
+
+ *PolicyInformation = NULL;
+
+ AttributeSize = sizeof(POLICY_MODIFICATION_INFO);
+ Info = MIDL_user_allocate(AttributeSize);
+ if (Info == NULL)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ Status = LsapGetObjectAttribute(PolicyObject,
+ L"PolMod",
+ Info,
+ &AttributeSize);
+ if (!NT_SUCCESS(Status))
+ {
+ MIDL_user_free(Info);
+ }
+ else
+ {
+ *PolicyInformation = (PLSAPR_POLICY_INFORMATION)Info;
+ }
+
+ return Status;
+}
+
+
+NTSTATUS
+LsarQueryAuditFull(PLSA_DB_OBJECT PolicyObject,
+ PLSAPR_POLICY_INFORMATION *PolicyInformation)
+{
+ PPOLICY_AUDIT_FULL_QUERY_INFO AuditFullInfo = NULL;
+ ULONG AttributeSize;
+ NTSTATUS Status;
+
+ *PolicyInformation = NULL;
+
+ AttributeSize = sizeof(POLICY_AUDIT_FULL_QUERY_INFO);
+ AuditFullInfo = MIDL_user_allocate(AttributeSize);
+ if (AuditFullInfo == NULL)
+ return STATUS_INSUFFICIENT_RESOURCES;
+
+ Status = LsapGetObjectAttribute(PolicyObject,
+ L"PolAdtFl",
+ AuditFullInfo,
+ &AttributeSize);
+ if (!NT_SUCCESS(Status))
+ {
+ MIDL_user_free(AuditFullInfo);
+ }
+ else
+ {
+ *PolicyInformation = (PLSAPR_POLICY_INFORMATION)AuditFullInfo;
+ }
+
+ return Status;
}
NTSTATUS
-LsarQueryDnsDomain(LSAPR_HANDLE PolicyHandle,
+LsarQueryDnsDomain(PLSA_DB_OBJECT PolicyObject,
PLSAPR_POLICY_INFORMATION *PolicyInformation)
{
PLSAPR_POLICY_DNS_DOMAIN_INFO p = NULL;
+ PUNICODE_STRING DomainName;
+ ULONG AttributeSize;
+ NTSTATUS Status;
+
+ *PolicyInformation = NULL;
p = MIDL_user_allocate(sizeof(LSAPR_POLICY_DNS_DOMAIN_INFO));
if (p == NULL)
return STATUS_INSUFFICIENT_RESOURCES;
- p->Name.Length = 0;
- p->Name.MaximumLength = 0;
- p->Name.Buffer = NULL;
-#if 0
- p->Name.Length = wcslen(L"COMPUTERNAME");
- p->Name.MaximumLength = p->Name.Length + sizeof(WCHAR);
- p->Name.Buffer = MIDL_user_allocate(p->Name.MaximumLength);
+ /* Primary Domain Name */
+ AttributeSize = 0;
+ Status = LsapGetObjectAttribute(PolicyObject,
+ L"PolPrDmN",
+ NULL,
+ &AttributeSize);
+ if (!NT_SUCCESS(Status))
+ {
+ goto done;
+ }
+
+ if (AttributeSize > 0)
+ {
+ DomainName = MIDL_user_allocate(AttributeSize);
+ if (DomainName == NULL)
+ {
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ goto done;
+ }
+
+ Status = LsapGetObjectAttribute(PolicyObject,
+ L"PolPrDmN",
+ DomainName,
+ &AttributeSize);
+ if (Status == STATUS_SUCCESS)
+ {
+ DomainName->Buffer = (LPWSTR)((ULONG_PTR)DomainName + (ULONG_PTR)DomainName->Buffer);
+
+ TRACE("PrimaryDomainName: %wZ\n", DomainName);
+
+ p->Name.Buffer = MIDL_user_allocate(DomainName->MaximumLength);
if (p->Name.Buffer == NULL)
{
- MIDL_user_free(p);
- return STATUS_INSUFFICIENT_RESOURCES;
+ MIDL_user_free(DomainName);
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ goto done;
}
- wcscpy(p->Name.Buffer, L"COMPUTERNAME");
-#endif
+ p->Name.Length = DomainName->Length;
+ p->Name.MaximumLength = DomainName->MaximumLength;
+ memcpy(p->Name.Buffer,
+ DomainName->Buffer,
+ DomainName->MaximumLength);
+ }
+
+ MIDL_user_free(DomainName);
+ }
+
+ /* Primary Domain SID */
+ AttributeSize = 0;
+ Status = LsapGetObjectAttribute(PolicyObject,
+ L"PolPrDmS",
+ NULL,
+ &AttributeSize);
+ if (!NT_SUCCESS(Status))
+ {
+ goto done;
+ }
+
+ if (AttributeSize > 0)
+ {
+ p->Sid = MIDL_user_allocate(AttributeSize);
+ if (p->Sid == NULL)
+ {
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ goto done;
+ }
- p->DnsDomainName.Length = 0;
- p->DnsDomainName.MaximumLength = 0;
- p->DnsDomainName.Buffer = NULL;
+ Status = LsapGetObjectAttribute(PolicyObject,
+ L"PolPrDmS",
+ p->Sid,
+ &AttributeSize);
+ }
- p->DnsForestName.Length = 0;
- p->DnsForestName.MaximumLength = 0;
- p->DnsForestName.Buffer = 0;
+ /* DNS Domain Name */
+ AttributeSize = 0;
+ Status = LsapGetObjectAttribute(PolicyObject,
+ L"PolDnDDN",
+ NULL,
+ &AttributeSize);
+ if (!NT_SUCCESS(Status))
+ goto done;
- memset(&p->DomainGuid, 0, sizeof(GUID));
+ if (AttributeSize > 0)
+ {
+ DomainName = MIDL_user_allocate(AttributeSize);
+ if (DomainName == NULL)
+ {
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ goto done;
+ }
- p->Sid = NULL; /* no domain, no workgroup */
+ Status = LsapGetObjectAttribute(PolicyObject,
+ L"PolDnDDN",
+ DomainName,
+ &AttributeSize);
+ if (Status == STATUS_SUCCESS)
+ {
+ DomainName->Buffer = (LPWSTR)((ULONG_PTR)DomainName + (ULONG_PTR)DomainName->Buffer);
+
+ TRACE("DNS Domain Name: %wZ\n", DomainName);
+
+ p->DnsDomainName.Buffer = MIDL_user_allocate(DomainName->MaximumLength);
+ if (p->DnsDomainName.Buffer == NULL)
+ {
+ MIDL_user_free(DomainName);
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ goto done;
+ }
+
+ p->DnsDomainName.Length = DomainName->Length;
+ p->DnsDomainName.MaximumLength = DomainName->MaximumLength;
+ memcpy(p->DnsDomainName.Buffer,
+ DomainName->Buffer,
+ DomainName->MaximumLength);
+ }
+
+ MIDL_user_free(DomainName);
+ }
+
+ /* DNS Forest Name */
+ AttributeSize = 0;
+ Status = LsapGetObjectAttribute(PolicyObject,
+ L"PolDnTrN",
+ NULL,
+ &AttributeSize);
+ if (!NT_SUCCESS(Status))
+ goto done;
+
+ if (AttributeSize > 0)
+ {
+ DomainName = MIDL_user_allocate(AttributeSize);
+ if (DomainName == NULL)
+ {
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ goto done;
+ }
+
+ Status = LsapGetObjectAttribute(PolicyObject,
+ L"PolDnTrN",
+ DomainName,
+ &AttributeSize);
+ if (Status == STATUS_SUCCESS)
+ {
+ DomainName->Buffer = (LPWSTR)((ULONG_PTR)DomainName + (ULONG_PTR)DomainName->Buffer);
+
+ TRACE("DNS Forest Name: %wZ\n", DomainName);
+
+ p->DnsForestName.Buffer = MIDL_user_allocate(DomainName->MaximumLength);
+ if (p->DnsForestName.Buffer == NULL)
+ {
+ MIDL_user_free(DomainName);
+ Status = STATUS_INSUFFICIENT_RESOURCES;
+ goto done;
+ }
+
+ p->DnsForestName.Length = DomainName->Length;
+ p->DnsForestName.MaximumLength = DomainName->MaximumLength;
+ memcpy(p->DnsForestName.Buffer,
+ DomainName->Buffer,
+ DomainName->MaximumLength);
+ }
+
+ MIDL_user_free(DomainName);
+ }
+
+ /* DNS Domain GUID */
+ AttributeSize = sizeof(GUID);
+ Status = LsapGetObjectAttribute(PolicyObject,
+ L"PolDnDmG",
+ &(p->DomainGuid),
+ &AttributeSize);
+ if (!NT_SUCCESS(Status))
+ goto done;
*PolicyInformation = (PLSAPR_POLICY_INFORMATION)p;
- return STATUS_SUCCESS;
+done:
+ if (!NT_SUCCESS(Status))
+ {
+ if (p)
+ {
+ if (p->Name.Buffer)
+ MIDL_user_free(p->Name.Buffer);
+
+ if (p->DnsDomainName.Buffer)
+ MIDL_user_free(p->DnsDomainName.Buffer);
+
+ if (p->DnsForestName.Buffer)
+ MIDL_user_free(p->DnsForestName.Buffer);
+
+ if (p->Sid)
+ MIDL_user_free(p->Sid);
+
+ MIDL_user_free(p);
+ }
+ }
+
+ return Status;
+}
+
+
+NTSTATUS
+LsarQueryDnsDomainInt(PLSA_DB_OBJECT PolicyObject,
+ PLSAPR_POLICY_INFORMATION *PolicyInformation)
+{
+ *PolicyInformation = NULL;
+ return STATUS_NOT_IMPLEMENTED;
+}
+
+
+NTSTATUS
+LsarQueryLocalAccountDomain(PLSA_DB_OBJECT PolicyObject,
+ PLSAPR_POLICY_INFORMATION *PolicyInformation)
+{
+ *PolicyInformation = NULL;
+ return STATUS_NOT_IMPLEMENTED;
}
/* EOF */