Cleanup A->W cross call in CryptEnumProviders.
This commit is contained in:
parent
b459952144
commit
e1f5370f42
|
@ -939,7 +939,7 @@ BOOL WINAPI CryptEncrypt (HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final,
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* CryptEnumProvidersA (ADVAPI32.@)
|
* CryptEnumProvidersW (ADVAPI32.@)
|
||||||
*
|
*
|
||||||
* Returns the next availabe CPS.
|
* Returns the next availabe CPS.
|
||||||
*
|
*
|
||||||
|
@ -960,45 +960,57 @@ BOOL WINAPI CryptEncrypt (HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final,
|
||||||
* If pszProvName is NULL, CryptEnumProvidersA sets the size of the name
|
* If pszProvName is NULL, CryptEnumProvidersA sets the size of the name
|
||||||
* for memory allocation purposes.
|
* for memory allocation purposes.
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI CryptEnumProvidersA (DWORD dwIndex, DWORD *pdwReserved,
|
BOOL WINAPI CryptEnumProvidersW (DWORD dwIndex, DWORD *pdwReserved,
|
||||||
DWORD dwFlags, DWORD *pdwProvType, LPSTR pszProvName, DWORD *pcbProvName)
|
DWORD dwFlags, DWORD *pdwProvType, LPWSTR pszProvName, DWORD *pcbProvName)
|
||||||
{
|
{
|
||||||
HKEY hKey;
|
HKEY hKey;
|
||||||
|
|
||||||
|
static const WCHAR providerW[] = {
|
||||||
|
'S','o','f','t','w','a','r','e','\\',
|
||||||
|
'M','i','c','r','o','s','o','f','t','\\',
|
||||||
|
'C','r','y','p','t','o','g','r','a','p','h','y','\\',
|
||||||
|
'D','e','f','a','u','l','t','s','\\',
|
||||||
|
'P','r','o','v','i','d','e','r',0
|
||||||
|
};
|
||||||
|
|
||||||
|
static const WCHAR typeW[] = {'T','y','p','e',0};
|
||||||
|
|
||||||
TRACE("(%ld, %p, %ld, %p, %p, %p)\n", dwIndex, pdwReserved, dwFlags,
|
TRACE("(%ld, %p, %ld, %p, %p, %p)\n", dwIndex, pdwReserved, dwFlags,
|
||||||
pdwProvType, pszProvName, pcbProvName);
|
pdwProvType, pszProvName, pcbProvName);
|
||||||
|
|
||||||
if (pdwReserved || !pcbProvName) CRYPT_ReturnLastError(ERROR_INVALID_PARAMETER);
|
if (pdwReserved || !pcbProvName) CRYPT_ReturnLastError(ERROR_INVALID_PARAMETER);
|
||||||
if (dwFlags) CRYPT_ReturnLastError(NTE_BAD_FLAGS);
|
if (dwFlags) CRYPT_ReturnLastError(NTE_BAD_FLAGS);
|
||||||
|
|
||||||
if (RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Cryptography\\Defaults\\Provider", &hKey))
|
if (RegOpenKeyW(HKEY_LOCAL_MACHINE, providerW, &hKey))
|
||||||
CRYPT_ReturnLastError(NTE_FAIL);
|
CRYPT_ReturnLastError(NTE_FAIL);
|
||||||
|
|
||||||
if (!pszProvName)
|
if (!pszProvName)
|
||||||
{
|
{
|
||||||
DWORD numkeys;
|
DWORD numkeys;
|
||||||
char *provName;
|
WCHAR *provNameW;
|
||||||
|
|
||||||
RegQueryInfoKeyA(hKey, NULL, NULL, NULL, &numkeys, pcbProvName, NULL, NULL, NULL, NULL, NULL, NULL);
|
RegQueryInfoKeyW(hKey, NULL, NULL, NULL, &numkeys, pcbProvName,
|
||||||
|
NULL, NULL, NULL, NULL, NULL, NULL);
|
||||||
|
|
||||||
if (!(provName = CRYPT_Alloc(*pcbProvName)))
|
if (!(provNameW = CRYPT_Alloc(*pcbProvName * sizeof(WCHAR))))
|
||||||
CRYPT_ReturnLastError(ERROR_NOT_ENOUGH_MEMORY);
|
CRYPT_ReturnLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||||
|
|
||||||
RegEnumKeyExA(hKey, dwIndex, provName, pcbProvName, NULL, NULL, NULL, NULL);
|
RegEnumKeyExW(hKey, dwIndex, provNameW, pcbProvName, NULL, NULL, NULL, NULL);
|
||||||
(*pcbProvName)++;
|
(*pcbProvName)++;
|
||||||
|
*pcbProvName *= sizeof(WCHAR);
|
||||||
|
|
||||||
CRYPT_Free(provName);
|
CRYPT_Free(provNameW);
|
||||||
|
|
||||||
if (dwIndex >= numkeys)
|
if (dwIndex >= numkeys)
|
||||||
CRYPT_ReturnLastError(ERROR_NO_MORE_ITEMS);
|
CRYPT_ReturnLastError(ERROR_NO_MORE_ITEMS);
|
||||||
} else {
|
} else {
|
||||||
DWORD size = sizeof(DWORD);
|
DWORD size = sizeof(DWORD);
|
||||||
HKEY subkey;
|
HKEY subkey;
|
||||||
if (RegEnumKeyA(hKey, dwIndex, pszProvName, *pcbProvName))
|
if (RegEnumKeyW(hKey, dwIndex, pszProvName, *pcbProvName / sizeof(WCHAR)))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if (RegOpenKeyA(hKey, pszProvName, &subkey))
|
if (RegOpenKeyW(hKey, pszProvName, &subkey))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
if (RegQueryValueExA(subkey, "Type", NULL, NULL, (BYTE*)pdwProvType, &size))
|
if (RegQueryValueExW(subkey, typeW, NULL, NULL, (BYTE*)pdwProvType, &size))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
RegCloseKey(subkey);
|
RegCloseKey(subkey);
|
||||||
}
|
}
|
||||||
|
@ -1007,30 +1019,30 @@ BOOL WINAPI CryptEnumProvidersA (DWORD dwIndex, DWORD *pdwReserved,
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* CryptEnumProvidersW (ADVAPI32.@)
|
* CryptEnumProvidersA (ADVAPI32.@)
|
||||||
*
|
*
|
||||||
* see CryptEnumProvidersA
|
* see CryptEnumProvidersW
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI CryptEnumProvidersW (DWORD dwIndex, DWORD *pdwReserved,
|
BOOL WINAPI CryptEnumProvidersA (DWORD dwIndex, DWORD *pdwReserved,
|
||||||
DWORD dwFlags, DWORD *pdwProvType, LPWSTR pszProvName, DWORD *pcbProvName)
|
DWORD dwFlags, DWORD *pdwProvType, LPSTR pszProvName, DWORD *pcbProvName)
|
||||||
{
|
{
|
||||||
PSTR str = NULL;
|
PWSTR str = NULL;
|
||||||
DWORD strlen;
|
DWORD strlen;
|
||||||
BOOL ret; /* = FALSE; */
|
BOOL ret; /* = FALSE; */
|
||||||
|
|
||||||
TRACE("(%ld, %p, %08ld, %p, %p, %p)\n", dwIndex, pdwReserved, dwFlags,
|
TRACE("(%ld, %p, %08ld, %p, %p, %p)\n", dwIndex, pdwReserved, dwFlags,
|
||||||
pdwProvType, pszProvName, pcbProvName);
|
pdwProvType, pszProvName, pcbProvName);
|
||||||
|
|
||||||
strlen = *pcbProvName / sizeof(WCHAR);
|
strlen = *pcbProvName * sizeof(WCHAR);
|
||||||
if ( pszProvName && !(str = CRYPT_Alloc(strlen)) )
|
if ( pszProvName && !(str = CRYPT_Alloc(strlen)) )
|
||||||
CRYPT_ReturnLastError(ERROR_NOT_ENOUGH_MEMORY);
|
CRYPT_ReturnLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||||
ret = CryptEnumProvidersA(dwIndex, pdwReserved, dwFlags, pdwProvType, str, &strlen);
|
ret = CryptEnumProvidersW(dwIndex, pdwReserved, dwFlags, pdwProvType, str, &strlen);
|
||||||
if (str)
|
if (str)
|
||||||
{
|
{
|
||||||
CRYPT_ANSIToUnicode(str, &pszProvName, *pcbProvName);
|
CRYPT_UnicodeToANSI(str, &pszProvName, *pcbProvName);
|
||||||
CRYPT_Free(str);
|
CRYPT_Free(str);
|
||||||
}
|
}
|
||||||
*pcbProvName = strlen * sizeof(WCHAR);
|
*pcbProvName = strlen / sizeof(WCHAR); /* FIXME: not correct */
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue