advapi32: LsaQueryInformationPolicy update (REVISED)(again)
Robert Reif
reif at earthlink.net
Tue Aug 1 20:49:15 CDT 2006
Robert Reif wrote:
> This is a revised version that does the right thing for both domains
> and accounts.
Rediff against CVS.
-------------- next part --------------
diff -p -u -r1.11 lsa.c
--- dlls/advapi32/lsa.c 1 Aug 2006 09:58:11 -0000 1.11
+++ dlls/advapi32/lsa.c 2 Aug 2006 01:45:39 -0000
@@ -374,7 +374,7 @@ NTSTATUS WINAPI LsaQueryInformationPolic
IN POLICY_INFORMATION_CLASS InformationClass,
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;
switch (InformationClass)
@@ -388,16 +388,12 @@ NTSTATUS WINAPI LsaQueryInformationPolic
}
break;
case PolicyPrimaryDomainInformation: /* 3 */
- case PolicyAccountDomainInformation: /* 5 */
{
- struct di
- {
- POLICY_PRIMARY_DOMAIN_INFO ppdi;
- SID sid;
- DWORD padding[3];
- };
-
- struct di * xdi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*xdi));
+ /* Only the domain name is valid for the local computer.
+ * All other fields are zero.
+ */
+ PPOLICY_PRIMARY_DOMAIN_INFO pinfo = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+ sizeof(POLICY_PRIMARY_DOMAIN_INFO));
HKEY key;
BOOL useDefault = TRUE;
LONG ret;
@@ -412,43 +408,62 @@ NTSTATUS WINAPI LsaQueryInformationPolic
ret = RegQueryValueExW(key, wg, NULL, NULL, NULL, &size);
if (ret == ERROR_MORE_DATA || ret == ERROR_SUCCESS)
{
- xdi->ppdi.Name.Buffer = HeapAlloc(GetProcessHeap(),
- HEAP_ZERO_MEMORY, size);
+ pinfo->Name.Buffer = HeapAlloc(GetProcessHeap(),
+ HEAP_ZERO_MEMORY, size);
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;
}
else
{
- HeapFree(GetProcessHeap(), 0, xdi->ppdi.Name.Buffer);
- xdi->ppdi.Name.Buffer = NULL;
+ HeapFree(GetProcessHeap(), 0, pinfo->Name.Buffer);
+ pinfo->Name.Buffer = NULL;
}
}
RegCloseKey(key);
}
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;
- 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);
- }
+ POLICY_ACCOUNT_DOMAIN_INFO info;
+ SID sid;
+ DWORD padding[3];
+ };
+
+ 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));
-
- xdi->ppdi.Sid = &(xdi->sid);
-
+
+ TRACE("setting name to %s\n", debugstr_w(xdi->info.DomainName.Buffer));
+
+ xdi->info.DomainSid = &(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;
@@ -456,8 +471,10 @@ NTSTATUS WINAPI LsaQueryInformationPolic
xdi->sid.SubAuthority[1] = 0;
xdi->sid.SubAuthority[2] = 0;
xdi->sid.SubAuthority[3] = 0;
+
+ WARN("Computer SID not found in registry\n");
}
-
+
TRACE("setting SID to %s\n", debugstr_sid(&xdi->sid));
*Buffer = xdi;
@@ -465,14 +482,11 @@ NTSTATUS WINAPI LsaQueryInformationPolic
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));
+ /* Only the domain name is valid for the local computer.
+ * All other fields are zero.
+ */
+ PPOLICY_DNS_DOMAIN_INFO pinfo = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
+ sizeof(POLICY_DNS_DOMAIN_INFO));
HKEY key;
BOOL useDefault = TRUE;
LONG ret;
@@ -487,55 +501,30 @@ NTSTATUS WINAPI LsaQueryInformationPolic
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);
+ pinfo->Name.Buffer = HeapAlloc(GetProcessHeap(),
+ HEAP_ZERO_MEMORY, size);
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;
}
else
{
- HeapFree(GetProcessHeap(), 0, xdi->pddi.Name.Buffer);
- xdi->pddi.Name.Buffer = NULL;
+ HeapFree(GetProcessHeap(), 0, pinfo->Name.Buffer);
+ pinfo->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));
+ RtlCreateUnicodeStringFromAsciiz(&(pinfo->Name), "DOMAIN");
- *Buffer = xdi;
+ TRACE("setting domain to %s\n", debugstr_w(pinfo->Name.Buffer));
+
+ *Buffer = pinfo;
}
break;
case PolicyAuditLogInformation:
@@ -547,7 +536,7 @@ NTSTATUS WINAPI LsaQueryInformationPolic
case PolicyAuditFullSetInformation:
case PolicyAuditFullQueryInformation:
{
- FIXME("category not implemented\n");
+ FIXME("category %d not implemented\n", InformationClass);
return STATUS_UNSUCCESSFUL;
}
}
More information about the wine-patches
mailing list