[LSASRV]
[reactos.git] / reactos / dll / win32 / lsasrv / policy.c
index 6239acb..91e3b58 100644 (file)
@@ -16,7 +16,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(lsasrv);
 /* FUNCTIONS ***************************************************************/
 
 NTSTATUS
-LsarSetPrimaryDomain(LSAPR_HANDLE PolicyHandle,
+LsarSetPrimaryDomain(PLSA_DB_OBJECT PolicyObject,
                      PLSAPR_POLICY_PRIMARY_DOM_INFO Info)
 {
     PUNICODE_STRING Buffer;
@@ -24,7 +24,7 @@ LsarSetPrimaryDomain(LSAPR_HANDLE PolicyHandle,
     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(),
@@ -39,9 +39,10 @@ LsarSetPrimaryDomain(LSAPR_HANDLE PolicyHandle,
     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);
 
@@ -52,7 +53,7 @@ LsarSetPrimaryDomain(LSAPR_HANDLE PolicyHandle,
     if (Info->Sid != NULL)
         Length = RtlLengthSid(Info->Sid);
 
-    Status = LsapSetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle,
+    Status = LsapSetObjectAttribute(PolicyObject,
                                     L"PolPrDmS",
                                     (LPBYTE)Info->Sid,
                                     Length);
@@ -62,7 +63,7 @@ LsarSetPrimaryDomain(LSAPR_HANDLE PolicyHandle,
 
 
 NTSTATUS
-LsarSetAccountDomain(LSAPR_HANDLE PolicyHandle,
+LsarSetAccountDomain(PLSA_DB_OBJECT PolicyObject,
                      PLSAPR_POLICY_ACCOUNT_DOM_INFO Info)
 {
     PUNICODE_STRING Buffer;
@@ -70,7 +71,7 @@ LsarSetAccountDomain(LSAPR_HANDLE PolicyHandle,
     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(),
@@ -85,9 +86,10 @@ LsarSetAccountDomain(LSAPR_HANDLE PolicyHandle,
     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);
 
@@ -98,7 +100,7 @@ LsarSetAccountDomain(LSAPR_HANDLE PolicyHandle,
     if (Info->Sid != NULL)
         Length = RtlLengthSid(Info->Sid);
 
-    Status = LsapSetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle,
+    Status = LsapSetObjectAttribute(PolicyObject,
                                     L"PolAcDmS",
                                     (LPBYTE)Info->Sid,
                                     Length);
@@ -108,7 +110,7 @@ LsarSetAccountDomain(LSAPR_HANDLE PolicyHandle,
 
 
 NTSTATUS
-LsarSetDnsDomain(LSAPR_HANDLE PolicyHandle,
+LsarSetDnsDomain(PLSA_DB_OBJECT PolicyObject,
                  PLSAPR_POLICY_DNS_DOMAIN_INFO Info)
 {
 
@@ -117,27 +119,112 @@ LsarSetDnsDomain(LSAPR_HANDLE PolicyHandle,
 
 
 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;
@@ -152,7 +239,8 @@ LsarQueryPrimaryDomain(LSAPR_HANDLE PolicyHandle,
         return STATUS_INSUFFICIENT_RESOURCES;
 
     /* Domain Name */
-    Status = LsapGetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle,
+    AttributeSize = 0;
+    Status = LsapGetObjectAttribute(PolicyObject,
                                     L"PolPrDmN",
                                     NULL,
                                     &AttributeSize);
@@ -170,7 +258,7 @@ LsarQueryPrimaryDomain(LSAPR_HANDLE PolicyHandle,
             goto Done;
         }
 
-        Status = LsapGetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle,
+        Status = LsapGetObjectAttribute(PolicyObject,
                                         L"PolPrDmN",
                                         DomainName,
                                         &AttributeSize);
@@ -200,7 +288,7 @@ LsarQueryPrimaryDomain(LSAPR_HANDLE PolicyHandle,
 
     /* Domain SID */
     AttributeSize = 0;
-    Status = LsapGetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle,
+    Status = LsapGetObjectAttribute(PolicyObject,
                                     L"PolPrDmS",
                                     NULL,
                                     &AttributeSize);
@@ -218,7 +306,7 @@ LsarQueryPrimaryDomain(LSAPR_HANDLE PolicyHandle,
             goto Done;
         }
 
-        Status = LsapGetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle,
+        Status = LsapGetObjectAttribute(PolicyObject,
                                         L"PolPrDmS",
                                         p->Sid,
                                         &AttributeSize);
@@ -241,17 +329,39 @@ Done:
         }
     }
 
+    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;
@@ -261,7 +371,7 @@ LsarQueryAccountDomain(LSAPR_HANDLE PolicyHandle,
         return STATUS_INSUFFICIENT_RESOURCES;
 
     /* Domain Name */
-    Status = LsapGetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle,
+    Status = LsapGetObjectAttribute(PolicyObject,
                                     L"PolAcDmN",
                                     NULL,
                                     &AttributeSize);
@@ -279,7 +389,7 @@ LsarQueryAccountDomain(LSAPR_HANDLE PolicyHandle,
             goto Done;
         }
 
-        Status = LsapGetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle,
+        Status = LsapGetObjectAttribute(PolicyObject,
                                         L"PolAcDmN",
                                         DomainName,
                                         &AttributeSize);
@@ -309,7 +419,7 @@ LsarQueryAccountDomain(LSAPR_HANDLE PolicyHandle,
 
     /* Domain SID */
     AttributeSize = 0;
-    Status = LsapGetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle,
+    Status = LsapGetObjectAttribute(PolicyObject,
                                     L"PolAcDmS",
                                     NULL,
                                     &AttributeSize);
@@ -327,7 +437,7 @@ LsarQueryAccountDomain(LSAPR_HANDLE PolicyHandle,
             goto Done;
         }
 
-        Status = LsapGetObjectAttribute((PLSA_DB_OBJECT)PolicyHandle,
+        Status = LsapGetObjectAttribute(PolicyObject,
                                         L"PolAcDmS",
                                         p->Sid,
                                         &AttributeSize);
@@ -350,51 +460,385 @@ Done:
         }
     }
 
-    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 */