forked from Mirrors/wine-wine
advapi32: LsaQueryInformationPolicy: do the right thing for both domains and accounts.
parent
7fc56136be
commit
0424424e34
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue