Cleanup A->W cross call in CryptEnumProviders.

This commit is contained in:
James Hawkins 2004-08-12 03:24:10 +00:00 committed by Alexandre Julliard
parent b459952144
commit e1f5370f42
1 changed files with 35 additions and 23 deletions

View File

@ -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,10 +960,20 @@ 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);
@ -971,34 +981,36 @@ BOOL WINAPI CryptEnumProvidersA (DWORD dwIndex, DWORD *pdwReserved,
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);
(*pcbProvName)++;
CRYPT_Free(provName); RegEnumKeyExW(hKey, dwIndex, provNameW, pcbProvName, NULL, NULL, NULL, NULL);
(*pcbProvName)++;
*pcbProvName *= sizeof(WCHAR);
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;
} }