Author: cwittich Date: Sun Feb 8 04:34:09 2009 New Revision: 39482
URL: http://svn.reactos.org/svn/reactos?rev=39482&view=rev Log: sync CredReadDomainCredentialsA/W with wine 1.14
Modified: trunk/reactos/dll/win32/advapi32/sec/cred.c
Modified: trunk/reactos/dll/win32/advapi32/sec/cred.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/advapi32/sec/cred... ============================================================================== --- trunk/reactos/dll/win32/advapi32/sec/cred.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/advapi32/sec/cred.c [iso-8859-1] Sun Feb 8 04:34:09 2009 @@ -1700,26 +1700,168 @@ return TRUE; }
-BOOL -WINAPI -CredReadDomainCredentialsW(PCREDENTIAL_TARGET_INFORMATIONW TargetInfo, - DWORD Flags, - DWORD *Count, - PCREDENTIALW **Credential) -{ - WARN("Not implemented\n"); +/****************************************************************************** + * CredReadDomainCredentialsW [ADVAPI32.@] + */ +BOOL WINAPI CredReadDomainCredentialsW(PCREDENTIAL_TARGET_INFORMATIONW TargetInformation, DWORD Flags, + DWORD *Size, PCREDENTIALW **Credentials) +{ + FIXME("(%p, 0x%x, %p, %p) stub\n", TargetInformation, Flags, Size, Credentials); + + /* follow Windows behavior - do not test for NULL, initialize early */ + *Size = 0; + *Credentials = NULL; + if (!TargetInformation) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + SetLastError(ERROR_NOT_FOUND); return FALSE; }
-BOOL -WINAPI -CredReadDomainCredentialsA(PCREDENTIAL_TARGET_INFORMATIONA TargetInfo, - DWORD Flags, - DWORD *Count, - PCREDENTIALA **Credential) -{ - WARN("Not implemented\n"); - return FALSE; +/****************************************************************************** + * CredReadDomainCredentialsA [ADVAPI32.@] + */ +BOOL WINAPI CredReadDomainCredentialsA(PCREDENTIAL_TARGET_INFORMATIONA TargetInformation, + DWORD Flags, DWORD *Size, PCREDENTIALA **Credentials) +{ + PCREDENTIAL_TARGET_INFORMATIONW TargetInformationW; + DWORD len, i; + WCHAR *buffer, *end; + BOOL ret; + PCREDENTIALW* CredentialsW; + + TRACE("(%p, 0x%x, %p, %p)\n", TargetInformation, Flags, Size, Credentials); + + /* follow Windows behavior - do not test for NULL, initialize early */ + *Size = 0; + *Credentials = NULL; + + if (!TargetInformation) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + len = sizeof(*TargetInformationW); + if (TargetInformation->TargetName) + len += MultiByteToWideChar(CP_ACP, 0, TargetInformation->TargetName, -1, NULL, 0) * sizeof(WCHAR); + if (TargetInformation->NetbiosServerName) + len += MultiByteToWideChar(CP_ACP, 0, TargetInformation->NetbiosServerName, -1, NULL, 0) * sizeof(WCHAR); + if (TargetInformation->DnsServerName) + len += MultiByteToWideChar(CP_ACP, 0, TargetInformation->DnsServerName, -1, NULL, 0) * sizeof(WCHAR); + if (TargetInformation->NetbiosDomainName) + len += MultiByteToWideChar(CP_ACP, 0, TargetInformation->NetbiosDomainName, -1, NULL, 0) * sizeof(WCHAR); + if (TargetInformation->DnsDomainName) + len += MultiByteToWideChar(CP_ACP, 0, TargetInformation->DnsDomainName, -1, NULL, 0) * sizeof(WCHAR); + if (TargetInformation->DnsTreeName) + len += MultiByteToWideChar(CP_ACP, 0, TargetInformation->DnsTreeName, -1, NULL, 0) * sizeof(WCHAR); + if (TargetInformation->PackageName) + len += MultiByteToWideChar(CP_ACP, 0, TargetInformation->PackageName, -1, NULL, 0) * sizeof(WCHAR); + + TargetInformationW = HeapAlloc(GetProcessHeap(), 0, len); + if (!TargetInformationW) + { + SetLastError(ERROR_OUTOFMEMORY); + return FALSE; + } + buffer = (WCHAR*)(TargetInformationW + 1); + end = (WCHAR *)((char *)TargetInformationW + len); + + if (TargetInformation->TargetName) + { + TargetInformationW->TargetName = buffer; + buffer += MultiByteToWideChar(CP_ACP, 0, TargetInformation->TargetName, -1, + TargetInformationW->TargetName, end - buffer); + } else + TargetInformationW->TargetName = NULL; + + if (TargetInformation->NetbiosServerName) + { + TargetInformationW->NetbiosServerName = buffer; + buffer += MultiByteToWideChar(CP_ACP, 0, TargetInformation->NetbiosServerName, -1, + TargetInformationW->NetbiosServerName, end - buffer); + } else + TargetInformationW->NetbiosServerName = NULL; + + if (TargetInformation->DnsServerName) + { + TargetInformationW->DnsServerName = buffer; + buffer += MultiByteToWideChar(CP_ACP, 0, TargetInformation->DnsServerName, -1, + TargetInformationW->DnsServerName, end - buffer); + } else + TargetInformationW->DnsServerName = NULL; + + if (TargetInformation->NetbiosDomainName) + { + TargetInformationW->NetbiosDomainName = buffer; + buffer += MultiByteToWideChar(CP_ACP, 0, TargetInformation->NetbiosDomainName, -1, + TargetInformationW->NetbiosDomainName, end - buffer); + } else + TargetInformationW->NetbiosDomainName = NULL; + + if (TargetInformation->DnsDomainName) + { + TargetInformationW->DnsDomainName = buffer; + buffer += MultiByteToWideChar(CP_ACP, 0, TargetInformation->DnsDomainName, -1, + TargetInformationW->DnsDomainName, end - buffer); + } else + TargetInformationW->DnsDomainName = NULL; + + if (TargetInformation->DnsTreeName) + { + TargetInformationW->DnsTreeName = buffer; + buffer += MultiByteToWideChar(CP_ACP, 0, TargetInformation->DnsTreeName, -1, + TargetInformationW->DnsTreeName, end - buffer); + } else + TargetInformationW->DnsTreeName = NULL; + + if (TargetInformation->PackageName) + { + TargetInformationW->PackageName = buffer; + buffer += MultiByteToWideChar(CP_ACP, 0, TargetInformation->PackageName, -1, + TargetInformationW->PackageName, end - buffer); + } else + TargetInformationW->PackageName = NULL; + + TargetInformationW->Flags = TargetInformation->Flags; + TargetInformationW->CredTypeCount = TargetInformation->CredTypeCount; + TargetInformationW->CredTypes = TargetInformation->CredTypes; + + ret = CredReadDomainCredentialsW(TargetInformationW, Flags, Size, &CredentialsW); + + HeapFree(GetProcessHeap(), 0, TargetInformationW); + + if (ret) + { + char *buf; + + len = *Size * sizeof(PCREDENTIALA); + for (i = 0; i < *Size; i++) + convert_PCREDENTIALW_to_PCREDENTIALA(CredentialsW[i], NULL, &len); + + *Credentials = HeapAlloc(GetProcessHeap(), 0, len); + if (!*Credentials) + { + CredFree(CredentialsW); + SetLastError(ERROR_OUTOFMEMORY); + return FALSE; + } + + buf = (char *)&(*Credentials)[*Size]; + for (i = 0; i < *Size; i++) + { + len = 0; + (*Credentials)[i] = (PCREDENTIALA)buf; + convert_PCREDENTIALW_to_PCREDENTIALA(CredentialsW[i], (*Credentials)[i], &len); + buf += len; + } + + CredFree(CredentialsW); + } + return ret; }
BOOL