advapi32: LsaQueryInformationPolicy: do the right thing for both domains and accounts.

oldstable
Robert Reif 2006-08-01 21:49:15 -04:00 committed by Alexandre Julliard
parent 7fc56136be
commit 0424424e34
1 changed files with 64 additions and 75 deletions

View File

@ -374,7 +374,7 @@ NTSTATUS WINAPI LsaQueryInformationPolicy(
IN POLICY_INFORMATION_CLASS InformationClass, IN POLICY_INFORMATION_CLASS InformationClass,
OUT PVOID *Buffer) OUT PVOID *Buffer)
{ {
FIXME("(%p,0x%08x,%p) stub\n", PolicyHandle, InformationClass, Buffer); TRACE("(%p,0x%08x,%p)\n", PolicyHandle, InformationClass, Buffer);
if(!Buffer) return STATUS_INVALID_PARAMETER; if(!Buffer) return STATUS_INVALID_PARAMETER;
switch (InformationClass) switch (InformationClass)
@ -388,16 +388,12 @@ NTSTATUS WINAPI LsaQueryInformationPolicy(
} }
break; break;
case PolicyPrimaryDomainInformation: /* 3 */ case PolicyPrimaryDomainInformation: /* 3 */
case PolicyAccountDomainInformation: /* 5 */
{ {
struct di /* Only the domain name is valid for the local computer.
{ * All other fields are zero.
POLICY_PRIMARY_DOMAIN_INFO ppdi; */
SID sid; PPOLICY_PRIMARY_DOMAIN_INFO pinfo = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
DWORD padding[3]; sizeof(POLICY_PRIMARY_DOMAIN_INFO));
};
struct di * xdi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*xdi));
HKEY key; HKEY key;
BOOL useDefault = TRUE; BOOL useDefault = TRUE;
LONG ret; LONG ret;
@ -412,43 +408,62 @@ NTSTATUS WINAPI LsaQueryInformationPolicy(
ret = RegQueryValueExW(key, wg, NULL, NULL, NULL, &size); ret = RegQueryValueExW(key, wg, NULL, NULL, NULL, &size);
if (ret == ERROR_MORE_DATA || ret == ERROR_SUCCESS) if (ret == ERROR_MORE_DATA || ret == ERROR_SUCCESS)
{ {
xdi->ppdi.Name.Buffer = HeapAlloc(GetProcessHeap(), pinfo->Name.Buffer = HeapAlloc(GetProcessHeap(),
HEAP_ZERO_MEMORY, size); HEAP_ZERO_MEMORY, size);
if ((ret = RegQueryValueExW(key, wg, NULL, NULL, if ((ret = RegQueryValueExW(key, wg, NULL, NULL,
(LPBYTE)xdi->ppdi.Name.Buffer, &size)) == ERROR_SUCCESS) (LPBYTE)pinfo->Name.Buffer, &size)) == ERROR_SUCCESS)
{ {
xdi->ppdi.Name.Length = (USHORT)size; pinfo->Name.Length = (USHORT)(size - sizeof(WCHAR));
pinfo->Name.MaximumLength = (USHORT)size;
useDefault = FALSE; useDefault = FALSE;
} }
else else
{ {
HeapFree(GetProcessHeap(), 0, xdi->ppdi.Name.Buffer); HeapFree(GetProcessHeap(), 0, pinfo->Name.Buffer);
xdi->ppdi.Name.Buffer = NULL; pinfo->Name.Buffer = NULL;
} }
} }
RegCloseKey(key); RegCloseKey(key);
} }
if (useDefault) if (useDefault)
RtlCreateUnicodeStringFromAsciiz(&(pinfo->Name), "DOMAIN");
TRACE("setting domain to %s\n", debugstr_w(pinfo->Name.Buffer));
*Buffer = pinfo;
}
break;
case PolicyAccountDomainInformation: /* 5 */
{
struct di
{ {
DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1; POLICY_ACCOUNT_DOMAIN_INFO info;
LPWSTR buf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSize * sizeof(WCHAR)); SID sid;
if (GetComputerNameW(buf, &dwSize)) DWORD padding[3];
{ };
xdi->ppdi.Name.Buffer = buf;
xdi->ppdi.Name.Length = dwSize * sizeof(WCHAR); struct di * xdi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*xdi));
} DWORD dwSize = MAX_COMPUTERNAME_LENGTH + 1;
LPWSTR buf = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSize * sizeof(WCHAR));
xdi->info.DomainName.MaximumLength = dwSize * sizeof(WCHAR);
if (GetComputerNameW(buf, &dwSize))
{
xdi->info.DomainName.Buffer = buf;
xdi->info.DomainName.Length = dwSize * sizeof(WCHAR);
} }
TRACE("setting domain to %s\n", debugstr_w(xdi->ppdi.Name.Buffer)); TRACE("setting name to %s\n", debugstr_w(xdi->info.DomainName.Buffer));
xdi->ppdi.Sid = &(xdi->sid); xdi->info.DomainSid = &(xdi->sid);
/* read the computer SID from the registry */ /* read the computer SID from the registry */
if (!ADVAPI_GetComputerSid(&(xdi->sid))) if (!ADVAPI_GetComputerSid(&(xdi->sid)))
{ {
SID_IDENTIFIER_AUTHORITY localSidAuthority = {SECURITY_NT_AUTHORITY}; SID_IDENTIFIER_AUTHORITY localSidAuthority = {SECURITY_NT_AUTHORITY};
xdi->sid.Revision = SID_REVISION; xdi->sid.Revision = SID_REVISION;
xdi->sid.SubAuthorityCount = 4; xdi->sid.SubAuthorityCount = 4;
xdi->sid.IdentifierAuthority = localSidAuthority; xdi->sid.IdentifierAuthority = localSidAuthority;
@ -456,8 +471,10 @@ NTSTATUS WINAPI LsaQueryInformationPolicy(
xdi->sid.SubAuthority[1] = 0; xdi->sid.SubAuthority[1] = 0;
xdi->sid.SubAuthority[2] = 0; xdi->sid.SubAuthority[2] = 0;
xdi->sid.SubAuthority[3] = 0; xdi->sid.SubAuthority[3] = 0;
WARN("Computer SID not found in registry\n");
} }
TRACE("setting SID to %s\n", debugstr_sid(&xdi->sid)); TRACE("setting SID to %s\n", debugstr_sid(&xdi->sid));
*Buffer = xdi; *Buffer = xdi;
@ -465,14 +482,11 @@ NTSTATUS WINAPI LsaQueryInformationPolicy(
break; break;
case PolicyDnsDomainInformation: /* 12 (0xc) */ case PolicyDnsDomainInformation: /* 12 (0xc) */
{ {
struct di /* Only the domain name is valid for the local computer.
{ * All other fields are zero.
POLICY_DNS_DOMAIN_INFO pddi; */
SID sid; PPOLICY_DNS_DOMAIN_INFO pinfo = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
DWORD padding[3]; sizeof(POLICY_DNS_DOMAIN_INFO));
};
struct di * xdi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*xdi));
HKEY key; HKEY key;
BOOL useDefault = TRUE; BOOL useDefault = TRUE;
LONG ret; LONG ret;
@ -487,55 +501,30 @@ NTSTATUS WINAPI LsaQueryInformationPolicy(
ret = RegQueryValueExW(key, wg, NULL, NULL, NULL, &size); ret = RegQueryValueExW(key, wg, NULL, NULL, NULL, &size);
if (ret == ERROR_MORE_DATA || ret == ERROR_SUCCESS) if (ret == ERROR_MORE_DATA || ret == ERROR_SUCCESS)
{ {
xdi->pddi.Name.Buffer = HeapAlloc(GetProcessHeap(), pinfo->Name.Buffer = HeapAlloc(GetProcessHeap(),
HEAP_ZERO_MEMORY, size); HEAP_ZERO_MEMORY, size);
if ((ret = RegQueryValueExW(key, wg, NULL, NULL, if ((ret = RegQueryValueExW(key, wg, NULL, NULL,
(LPBYTE)xdi->pddi.Name.Buffer, &size)) == ERROR_SUCCESS) (LPBYTE)pinfo->Name.Buffer, &size)) == ERROR_SUCCESS)
{ {
xdi->pddi.Name.Length = (USHORT)size; pinfo->Name.Length = (USHORT)(size - sizeof(WCHAR));
pinfo->Name.MaximumLength = (USHORT)size;
useDefault = FALSE; useDefault = FALSE;
} }
else else
{ {
HeapFree(GetProcessHeap(), 0, xdi->pddi.Name.Buffer); HeapFree(GetProcessHeap(), 0, pinfo->Name.Buffer);
xdi->pddi.Name.Buffer = NULL; pinfo->Name.Buffer = NULL;
} }
} }
RegCloseKey(key); RegCloseKey(key);
} }
if (useDefault) if (useDefault)
{ RtlCreateUnicodeStringFromAsciiz(&(pinfo->Name), "DOMAIN");
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; TRACE("setting domain to %s\n", debugstr_w(pinfo->Name.Buffer));
*Buffer = pinfo;
} }
break; break;
case PolicyAuditLogInformation: case PolicyAuditLogInformation:
@ -547,7 +536,7 @@ NTSTATUS WINAPI LsaQueryInformationPolicy(
case PolicyAuditFullSetInformation: case PolicyAuditFullSetInformation:
case PolicyAuditFullQueryInformation: case PolicyAuditFullQueryInformation:
{ {
FIXME("category not implemented\n"); FIXME("category %d not implemented\n", InformationClass);
return STATUS_UNSUCCESSFUL; return STATUS_UNSUCCESSFUL;
} }
} }