advapi32: LsaQueryInformationPolicy update.

Update LsaQueryInformationPolicy to use correct computer name and SID.
Add support for PolicyDnsDomainInformation.
This commit is contained in:
Robert Reif 2006-07-31 17:53:32 -04:00 committed by Alexandre Julliard
parent a430db9e39
commit 3879fef21d
1 changed files with 104 additions and 10 deletions

View File

@ -394,10 +394,9 @@ NTSTATUS WINAPI LsaQueryInformationPolicy(
{
POLICY_PRIMARY_DOMAIN_INFO ppdi;
SID sid;
DWORD padding[3];
};
SID_IDENTIFIER_AUTHORITY localSidAuthority = {SECURITY_NT_AUTHORITY};
struct di * xdi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*xdi));
HKEY key;
BOOL useDefault = TRUE;
@ -431,15 +430,111 @@ NTSTATUS WINAPI LsaQueryInformationPolicy(
RegCloseKey(key);
}
if (useDefault)
RtlCreateUnicodeStringFromAsciiz(&(xdi->ppdi.Name), "DOMAIN");
{
DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1;
LPWSTR buf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSize * sizeof(WCHAR));
if (GetComputerNameW(buf, &dwSize))
{
xdi->ppdi.Name.Buffer = buf;
xdi->ppdi.Name.Length = dwSize * sizeof(WCHAR);
}
}
TRACE("setting domain to %s\n", debugstr_w(xdi->ppdi.Name.Buffer));
xdi->ppdi.Sid = &(xdi->sid);
xdi->sid.Revision = SID_REVISION;
xdi->sid.SubAuthorityCount = 1;
xdi->sid.IdentifierAuthority = localSidAuthority;
xdi->sid.SubAuthority[0] = SECURITY_LOCAL_SYSTEM_RID;
/* read the computer SID from the registry */
if (!ADVAPI_GetComputerSid(&(xdi->sid)))
{
SID_IDENTIFIER_AUTHORITY localSidAuthority = {SECURITY_NT_AUTHORITY};
xdi->sid.Revision = SID_REVISION;
xdi->sid.SubAuthorityCount = 4;
xdi->sid.IdentifierAuthority = localSidAuthority;
xdi->sid.SubAuthority[0] = SECURITY_NT_NON_UNIQUE;
xdi->sid.SubAuthority[1] = 0;
xdi->sid.SubAuthority[2] = 0;
xdi->sid.SubAuthority[3] = 0;
}
TRACE("setting SID to %s\n", debugstr_sid(&xdi->sid));
*Buffer = xdi;
}
break;
case PolicyDnsDomainInformation: /* 12 (0xc) */
{
struct di
{
POLICY_DNS_DOMAIN_INFO pddi;
SID sid;
DWORD padding[3];
};
struct di * xdi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*xdi));
HKEY key;
BOOL useDefault = TRUE;
LONG ret;
if ((ret = RegOpenKeyExA(HKEY_LOCAL_MACHINE,
"System\\CurrentControlSet\\Services\\VxD\\VNETSUP", 0,
KEY_READ, &key)) == ERROR_SUCCESS)
{
DWORD size = 0;
static const WCHAR wg[] = { 'W','o','r','k','g','r','o','u','p',0 };
ret = RegQueryValueExW(key, wg, NULL, NULL, NULL, &size);
if (ret == ERROR_MORE_DATA || ret == ERROR_SUCCESS)
{
xdi->pddi.Name.Buffer = HeapAlloc(GetProcessHeap(),
HEAP_ZERO_MEMORY, size);
if ((ret = RegQueryValueExW(key, wg, NULL, NULL,
(LPBYTE)xdi->pddi.Name.Buffer, &size)) == ERROR_SUCCESS)
{
xdi->pddi.Name.Length = (USHORT)size;
useDefault = FALSE;
}
else
{
HeapFree(GetProcessHeap(), 0, xdi->pddi.Name.Buffer);
xdi->pddi.Name.Buffer = NULL;
}
}
RegCloseKey(key);
}
if (useDefault)
{
DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1;
LPWSTR buf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSize * sizeof(WCHAR));
if (GetComputerNameW(buf, &dwSize))
{
xdi->pddi.Name.Buffer = buf;
xdi->pddi.Name.Length = dwSize * sizeof(WCHAR);
}
}
TRACE("setting domain to %s\n", debugstr_w(xdi->pddi.Name.Buffer));
xdi->pddi.Sid = &(xdi->sid);
/* read the computer SID from the registry */
if (!ADVAPI_GetComputerSid(&(xdi->sid)))
{
SID_IDENTIFIER_AUTHORITY localSidAuthority = {SECURITY_NT_AUTHORITY};
xdi->sid.Revision = SID_REVISION;
xdi->sid.SubAuthorityCount = 4;
xdi->sid.IdentifierAuthority = localSidAuthority;
xdi->sid.SubAuthority[0] = SECURITY_NT_NON_UNIQUE;
xdi->sid.SubAuthority[1] = 0;
xdi->sid.SubAuthority[2] = 0;
xdi->sid.SubAuthority[3] = 0;
}
TRACE("setting SID to %s\n", debugstr_sid(&xdi->sid));
*Buffer = xdi;
}
break;
@ -451,7 +546,6 @@ NTSTATUS WINAPI LsaQueryInformationPolicy(
case PolicyModificationInformation:
case PolicyAuditFullSetInformation:
case PolicyAuditFullQueryInformation:
case PolicyDnsDomainInformation:
{
FIXME("category not implemented\n");
return STATUS_UNSUCCESSFUL;