Index: include/wincrypt.h
===================================================================
RCS file: /home/wine/wine/include/wincrypt.h,v
retrieving revision 1.22
diff -u -r1.22 wincrypt.h
--- include/wincrypt.h	18 Aug 2004 23:51:04 -0000	1.22
+++ include/wincrypt.h	1 Sep 2004 01:11:45 -0000
@@ -175,7 +175,7 @@
     DWORD    dwProvType;
     BYTE    *pbContextInfo;
     DWORD    cbContextInfo;
-    LPSTR    pszProvName;
+    LPWSTR    pszProvName;
 } VTableProvStruc, *PVTableProvStruc;
 
 typedef struct _CRYPT_ATTRIBUTE {
Index: dlls/advapi32/crypt.c
===================================================================
RCS file: /home/wine/wine/dlls/advapi32/crypt.c,v
retrieving revision 1.51
diff -u -r1.51 crypt.c
--- dlls/advapi32/crypt.c	30 Aug 2004 23:57:18 -0000	1.51
+++ dlls/advapi32/crypt.c	1 Sep 2004 01:11:45 -0000
@@ -51,33 +51,54 @@
 #define CRYPT_Alloc(size) ((LPVOID)LocalAlloc(LMEM_ZEROINIT, size))
 #define CRYPT_Free(buffer) (LocalFree((HLOCAL)buffer))
 
-static inline PSTR CRYPT_GetProvKeyName(PCSTR pProvName)
+static inline PWSTR CRYPT_GetProvKeyName(PCWSTR pProvName)
 {
-	PCSTR KEYSTR = "Software\\Microsoft\\Cryptography\\Defaults\\Provider\\";
-	PSTR keyname;
+	static const WCHAR KEYSTR[] = {
+		'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
+	};
+	
+	PWSTR keyname;
 
-	keyname = CRYPT_Alloc(strlen(KEYSTR) + strlen(pProvName) +1);
+	keyname = CRYPT_Alloc((strlenW(KEYSTR) + strlenW(pProvName) + 1) * sizeof(WCHAR));
 	if (keyname)
 	{
-		strcpy(keyname, KEYSTR);
-		strcpy(keyname + strlen(KEYSTR), pProvName);
+		strcpyW(keyname, KEYSTR);
+		strcpyW(keyname + strlenW(KEYSTR), pProvName);
 	} else
 		SetLastError(ERROR_NOT_ENOUGH_MEMORY);
 	return keyname;
 }
 
-static inline PSTR CRYPT_GetTypeKeyName(DWORD dwType, BOOL user)
+static inline PWSTR CRYPT_GetTypeKeyName(DWORD dwType, BOOL user)
 {
-	PCSTR MACHINESTR = "Software\\Microsoft\\Cryptography\\Defaults\\Provider Types\\Type XXX";
-	PCSTR USERSTR = "Software\\Microsoft\\Cryptography\\Provider Type XXX";
-	PSTR keyname;
-	PSTR ptr;
+	static const WCHAR MACHINESTR[] = {
+		'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',' ','T','y','p','e','s','\\',
+		'T','y','p','e',' ','X','X','X',0
+	};
+	
+	static const WCHAR USERSTR[] = {
+		'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','\\',
+		'P','r','o','v','i','d','e','r',' ','T','y','p','e',' ','X','X','X',0
+	};
+	
+	PWSTR keyname;
+	PWSTR ptr;
 
-	keyname = CRYPT_Alloc( (user ? strlen(USERSTR) : strlen(MACHINESTR)) +1);
+	keyname = CRYPT_Alloc( ((user ? strlenW(USERSTR) : strlenW(MACHINESTR)) + 1) * sizeof(WCHAR));
 	if (keyname)
 	{
-		user ? strcpy(keyname, USERSTR) : strcpy(keyname, MACHINESTR);
-		ptr = keyname + strlen(keyname);
+		user ? strcpyW(keyname, USERSTR) : strcpyW(keyname, MACHINESTR);
+		ptr = keyname + strlenW(keyname);
 		*(--ptr) = (dwType % 10) + '0';
 		*(--ptr) = ((dwType / 10) % 10) + '0';
 		*(--ptr) = (dwType / 100) + '0';
@@ -144,7 +165,7 @@
 }
 
 /* These next 2 functions are used by the VTableProvStruc structure */
-static BOOL CALLBACK CRYPT_VerifyImage(LPCSTR lpszImage, BYTE* pData)
+static BOOL CALLBACK CRYPT_VerifyImage(LPCWSTR lpszImage, BYTE* pData)
 {
 	if (!lpszImage || !pData)
 	{
@@ -152,7 +173,7 @@
 		return FALSE;
 	}
 
-	FIXME("(%s, %p): not verifying image\n", lpszImage, pData);
+	FIXME("(%s, %p): not verifying image\n", debugstr_w(lpszImage), pData);
 
 	return TRUE;
 }
@@ -169,7 +190,7 @@
 	if ( !(provider->pFuncs->p##name = (void*)GetProcAddress(provider->hModule, #name)) ) goto error
 #define CRYPT_GetProvFuncOpt(name) \
 	provider->pFuncs->p##name = (void*)GetProcAddress(provider->hModule, #name)
-PCRYPTPROV CRYPT_LoadProvider(PSTR pImage)
+PCRYPTPROV CRYPT_LoadProvider(PWSTR pImage)
 {
 	PCRYPTPROV provider;
 	DWORD errorcode = ERROR_NOT_ENOUGH_MEMORY;
@@ -177,10 +198,10 @@
 	if ( !(provider = CRYPT_Alloc(sizeof(CRYPTPROV))) ) goto error;
 	if ( !(provider->pFuncs = CRYPT_Alloc(sizeof(PROVFUNCS))) ) goto error;
 	if ( !(provider->pVTable = CRYPT_Alloc(sizeof(VTableProvStruc))) ) goto error;
-	if ( !(provider->hModule = LoadLibraryA(pImage)) )
+	if ( !(provider->hModule = LoadLibraryW(pImage)) )
 	{
 		errorcode = (GetLastError() == ERROR_FILE_NOT_FOUND) ? NTE_PROV_DLL_NOT_FOUND : NTE_PROVIDER_DLL_FAIL;
-		FIXME("Failed to load dll %s\n", debugstr_a(pImage));
+		FIXME("Failed to load dll %s\n", debugstr_w(pImage));
 		goto error;
 	}
 	provider->refcount = 1;
@@ -241,7 +262,8 @@
 
 
 /******************************************************************************
- * CryptAcquireContextA (ADVAPI32.@)
+ * CryptAcquireContextW (ADVAPI32.@)
+ *
  * Acquire a crypto provider context handle.
  *
  * PARAMS
@@ -253,18 +275,24 @@
  *
  * RETURNS TRUE on success, FALSE on failure.
  */
-BOOL WINAPI CryptAcquireContextA (HCRYPTPROV *phProv, LPCSTR pszContainer,
-		LPCSTR pszProvider, DWORD dwProvType, DWORD dwFlags)
+BOOL WINAPI CryptAcquireContextW (HCRYPTPROV *phProv, LPCWSTR pszContainer,
+		LPCWSTR pszProvider, DWORD dwProvType, DWORD dwFlags)
 {
 	PCRYPTPROV pProv = NULL;
 	HKEY key;
-	PSTR imagepath = NULL, keyname = NULL, provname = NULL, temp = NULL;
+	PWSTR imagepath = NULL, keyname = NULL, provname = NULL, temp = NULL;
 	BYTE* signature;
 	DWORD keytype, type, len;
 	ULONG r;
+	
+	static const WCHAR nameW[] = {'N','a','m','e',0};
+	static const WCHAR typeW[] = {'T','y','p','e',0};
+	static const WCHAR imagePathW[] = {'I','m','a','g','e',' ','P','a','t','h',0};
+	static const WCHAR signatureW[] = {'S','i','g','n','a','t','u','r','e',0};
+	static const WCHAR sigInFileW[] = {'S','i','g','I','n','F','i','l','e',0};
 
-	TRACE("(%p, %s, %s, %ld, %08lx)\n", phProv, pszContainer,
-		pszProvider, dwProvType, dwFlags);
+	TRACE("(%p, %s, %s, %ld, %08lx)\n", phProv, debugstr_w(pszContainer),
+		debugstr_w(pszProvider), dwProvType, dwFlags);
 
 	if (dwProvType < 1 || dwProvType > MAXPROVTYPES)
 	{
@@ -288,7 +316,7 @@
 			SetLastError(NTE_PROV_TYPE_NOT_DEF);
 			return FALSE;
 		}
-		if (RegOpenKeyA(HKEY_CURRENT_USER, keyname, &key))
+		if (RegOpenKeyW(HKEY_CURRENT_USER, keyname, &key))
 		{
 			CRYPT_Free(keyname);
 			if ( !(keyname = CRYPT_GetTypeKeyName(dwProvType, FALSE)) ) {
@@ -297,8 +325,8 @@
 				SetLastError(NTE_PROV_TYPE_NOT_DEF);
 				goto error;
 			}
-			if (RegOpenKeyA(HKEY_LOCAL_MACHINE, keyname, &key)) {
-				TRACE("Did not find registry entry of crypto provider for %s.\n", debugstr_a(keyname));
+			if (RegOpenKeyW(HKEY_LOCAL_MACHINE, keyname, &key)) {
+				TRACE("Did not find registry entry of crypto provider for %s.\n", debugstr_w(keyname));
 				CRYPT_Free(keyname);
 				RegCloseKey(key);
 				SetLastError(NTE_PROV_TYPE_NOT_DEF);
@@ -306,7 +334,7 @@
 			}
 		}
 		CRYPT_Free(keyname);
-		r = RegQueryValueExA(key, "Name", NULL, &keytype, NULL, &len);
+		r = RegQueryValueExW(key, nameW, NULL, &keytype, NULL, &len);
 		if( r != ERROR_SUCCESS || !len || keytype != REG_SZ)
 		{
 			TRACE("error %ld reading size of 'Name' from registry\n", r );
@@ -320,7 +348,7 @@
 			SetLastError(ERROR_NOT_ENOUGH_MEMORY);
 			goto error;
 		}
-		r = RegQueryValueExA(key, "Name", NULL, NULL, provname, &len);
+		r = RegQueryValueExW(key, nameW, NULL, NULL, (LPBYTE)provname, &len);
 		if( r != ERROR_SUCCESS )
 		{
 			TRACE("error %ld reading 'Name' from registry\n", r );
@@ -330,16 +358,16 @@
 		}
 		RegCloseKey(key);
 	} else {
-		if ( !(provname = CRYPT_Alloc(strlen(pszProvider) +1)) )
+		if ( !(provname = CRYPT_Alloc((strlenW(pszProvider) + 1) * sizeof(WCHAR))))
 		{
 			SetLastError(ERROR_NOT_ENOUGH_MEMORY);
 			goto error;
 		}
-		strcpy(provname, pszProvider);
+		strcpyW(provname, pszProvider);
 	}
 
 	keyname = CRYPT_GetProvKeyName(provname);
-	r = RegOpenKeyA(HKEY_LOCAL_MACHINE, keyname, &key);
+	r = RegOpenKeyW(HKEY_LOCAL_MACHINE, keyname, &key);
 	CRYPT_Free(keyname);
 	if (r != ERROR_SUCCESS)
 	{
@@ -347,7 +375,7 @@
 		goto error;
 	}
 	len = sizeof(DWORD);
-	r = RegQueryValueExA(key, "Type", NULL, NULL, (BYTE*)&type, &len);
+	r = RegQueryValueExW(key, typeW, NULL, NULL, (BYTE*)&type, &len);
 	if (r != ERROR_SUCCESS)
 	{
 		SetLastError(NTE_PROV_TYPE_ENTRY_BAD);
@@ -360,7 +388,7 @@
 		goto error;
 	}
 
-	r = RegQueryValueExA(key, "Image Path", NULL, &keytype, NULL, &len);
+	r = RegQueryValueExW(key, imagePathW, NULL, &keytype, NULL, &len);
 	if ( r != ERROR_SUCCESS || keytype != REG_SZ)
 	{
 		TRACE("error %ld reading size of 'Image Path' from registry\n", r );
@@ -374,7 +402,7 @@
 		SetLastError(ERROR_NOT_ENOUGH_MEMORY);
 		goto error;
 	}
-	r = RegQueryValueExA(key, "Image Path", NULL, NULL, temp, &len);
+	r = RegQueryValueExW(key, imagePathW, NULL, NULL, (LPBYTE)temp, &len);
 	if( r != ERROR_SUCCESS )
 	{
 		TRACE("error %ld reading 'Image Path' from registry\n", r );
@@ -383,7 +411,7 @@
 		goto error;
 	}
 
-	r = RegQueryValueExA(key, "Signature", NULL, &keytype, NULL, &len);
+	r = RegQueryValueExW(key, signatureW, NULL, &keytype, NULL, &len);
 	if ( r == ERROR_SUCCESS && keytype == REG_BINARY )
 	{
 		if (!(signature = CRYPT_Alloc(len)))
@@ -392,7 +420,7 @@
 			SetLastError(ERROR_NOT_ENOUGH_MEMORY);
 			goto error;
 		}
-		r = RegQueryValueExA(key, "Signature", NULL, NULL, signature, &len);
+		r = RegQueryValueExW(key, signatureW, NULL, NULL, signature, &len);
 		if ( r != ERROR_SUCCESS )
 		{
 			TRACE("error %ld reading 'Signature'\n", r );
@@ -403,7 +431,7 @@
 	}
 	else
 	{
-		r = RegQueryValueExA(key, "SigInFile", NULL, &keytype, NULL, &len);
+		r = RegQueryValueExW(key, sigInFileW, NULL, &keytype, NULL, &len);
 		if (r != ERROR_SUCCESS)
 		{
 			TRACE("error %ld reading size of 'SigInFile'\n", r );
@@ -427,14 +455,14 @@
 		}
 	}
 	RegCloseKey(key);
-	len = ExpandEnvironmentStringsA(temp, NULL, 0);
-	if ( !(imagepath = CRYPT_Alloc(len)) )
+	len = ExpandEnvironmentStringsW(temp, NULL, 0);
+	if ( !(imagepath = CRYPT_Alloc(len * sizeof(WCHAR))) )
 	{
 		CRYPT_Free(signature);
 		SetLastError(ERROR_NOT_ENOUGH_MEMORY);
 		goto error;
 	}
-	if (!ExpandEnvironmentStringsA(temp, imagepath, len))
+	if (!ExpandEnvironmentStringsW(temp, imagepath, len))
 	{
 		CRYPT_Free(signature);
 		/* ExpandEnvironmentStrings will call SetLastError */
@@ -490,28 +518,28 @@
 }
 
 /******************************************************************************
- * CryptAcquireContextW (ADVAPI32.@)
+ * CryptAcquireContextA (ADVAPI32.@)
  *
- * see CryptAcquireContextA
+ * see CryptAcquireContextW
  */
-BOOL WINAPI CryptAcquireContextW (HCRYPTPROV *phProv, LPCWSTR pszContainer,
-		LPCWSTR pszProvider, DWORD dwProvType, DWORD dwFlags)
+BOOL WINAPI CryptAcquireContextA (HCRYPTPROV *phProv, LPCSTR pszContainer,
+		LPCSTR pszProvider, DWORD dwProvType, DWORD dwFlags)
 {
-	PSTR pProvider = NULL, pContainer = NULL;
+	PWSTR pProvider = NULL, pContainer = NULL;
 	BOOL ret = FALSE;
 
-	TRACE("(%p, %s, %s, %ld, %08lx)\n", phProv, debugstr_w(pszContainer),
-		debugstr_w(pszProvider), dwProvType, dwFlags);
+	TRACE("(%p, %s, %s, %ld, %08lx)\n", phProv, debugstr_a(pszContainer),
+		debugstr_a(pszProvider), dwProvType, dwFlags);
 
-	if ( !CRYPT_UnicodeToANSI(pszContainer, &pContainer, -1) )
+	if ( !CRYPT_ANSIToUnicode(pszContainer, &pContainer, -1) )
 		CRYPT_ReturnLastError(ERROR_NOT_ENOUGH_MEMORY);
-	if ( !CRYPT_UnicodeToANSI(pszProvider, &pProvider, -1) )
+	if ( !CRYPT_ANSIToUnicode(pszProvider, &pProvider, -1) )
 	{
 		CRYPT_Free(pContainer);
 		CRYPT_ReturnLastError(ERROR_NOT_ENOUGH_MEMORY);
 	}
 
-	ret = CryptAcquireContextA(phProv, pContainer, pProvider, dwProvType, dwFlags);
+	ret = CryptAcquireContextW(phProv, pContainer, pProvider, dwProvType, dwFlags);
 
 	if (pContainer)
 		CRYPT_Free(pContainer);
@@ -1050,7 +1078,7 @@
 }
 
 /******************************************************************************
- * CryptEnumProviderTypesA (ADVAPI32i.@)
+ * CryptEnumProviderTypesW (ADVAPI32i.@)
  *
  * Retrieves the next type of CSP supported.
  *
@@ -1068,17 +1096,27 @@
  *   Failure: FALSE
  *
  *  NOTES
- *   If pszTypeName is NULL, CryptEnumProviderTypesA sets the size of the name
+ *   If pszTypeName is NULL, CryptEnumProviderTypesW sets the size of the name
  *   for memory allocation purposes.
  */
-BOOL WINAPI CryptEnumProviderTypesA (DWORD dwIndex, DWORD *pdwReserved,
-		DWORD dwFlags, DWORD *pdwProvType, LPSTR pszTypeName, DWORD *pcbTypeName)
+BOOL WINAPI CryptEnumProviderTypesW (DWORD dwIndex, DWORD *pdwReserved,
+		DWORD dwFlags, DWORD *pdwProvType, LPWSTR pszTypeName, DWORD *pcbTypeName)
 {
 	HKEY hKey, hSubkey;
 	DWORD keylen, numkeys, dwType;
-	PSTR keyname, ch;
+	PWSTR keyname, ch;
 	DWORD result;
-
+	
+	static const WCHAR providerTypesW[] = {
+		'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',' ','T','y','p','e','s',0
+	};
+	
+	static const WCHAR typeNameW[] = {'T','y','p','e','N','a','m','e',0};
+	
 	TRACE("(%ld, %p, %08ld, %p, %p, %p)\n", dwIndex, pdwReserved,
 		dwFlags, pdwProvType, pszTypeName, pcbTypeName);
 
@@ -1086,28 +1124,28 @@
 		CRYPT_ReturnLastError(ERROR_INVALID_PARAMETER);
 	if (dwFlags) CRYPT_ReturnLastError(NTE_BAD_FLAGS);
 
-	if (RegOpenKeyA(HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Cryptography\\Defaults\\Provider Types", &hKey))
+	if (RegOpenKeyW(HKEY_LOCAL_MACHINE, providerTypesW, &hKey))
 		return FALSE;
 
-	RegQueryInfoKeyA(hKey, NULL, NULL, NULL, &numkeys, &keylen, NULL, NULL, NULL, NULL, NULL, NULL);
+	RegQueryInfoKeyW(hKey, NULL, NULL, NULL, &numkeys, &keylen, NULL, NULL, NULL, NULL, NULL, NULL);
 	if (dwIndex >= numkeys)
 		CRYPT_ReturnLastError(ERROR_NO_MORE_ITEMS);
 	keylen++;
-	if ( !(keyname = CRYPT_Alloc(keylen)) )
+	if ( !(keyname = CRYPT_Alloc(keylen * sizeof(WCHAR))) )
 		CRYPT_ReturnLastError(ERROR_NOT_ENOUGH_MEMORY);
-	if ( RegEnumKeyA(hKey, dwIndex, keyname, keylen) ) {
+	if ( RegEnumKeyW(hKey, dwIndex, keyname, keylen) ) {
                 CRYPT_Free(keyname);
 		return FALSE;
         }
-	RegOpenKeyA(hKey, keyname, &hSubkey);
-	ch = keyname + strlen(keyname);
+	RegOpenKeyW(hKey, keyname, &hSubkey);
+	ch = keyname + strlenW(keyname);
 	/* Convert "Type 000" to 0, etc/ */
 	*pdwProvType = *(--ch) - '0';
 	*pdwProvType += (*(--ch) - '0') * 10;
 	*pdwProvType += (*(--ch) - '0') * 100;
 	CRYPT_Free(keyname);
 	
-	result = RegQueryValueExA(hSubkey, "TypeName", NULL, &dwType, pszTypeName, pcbTypeName);
+	result = RegQueryValueExW(hSubkey, typeNameW, NULL, &dwType, (LPBYTE)pszTypeName, pcbTypeName);
 	if (result)
 		CRYPT_ReturnLastError(result);
 
@@ -1117,29 +1155,29 @@
 }
 
 /******************************************************************************
- * CryptEnumProviderTypesW (ADVAPI32.@)
+ * CryptEnumProviderTypesA (ADVAPI32.@)
  *
- * see CryptEnumProviderTypesA
+ * see CryptEnumProviderTypesW
  */
-BOOL WINAPI CryptEnumProviderTypesW (DWORD dwIndex, DWORD *pdwReserved,
-		DWORD dwFlags, DWORD *pdwProvType, LPWSTR pszTypeName, DWORD *pcbTypeName)
+BOOL WINAPI CryptEnumProviderTypesA (DWORD dwIndex, DWORD *pdwReserved,
+		DWORD dwFlags, DWORD *pdwProvType, LPSTR pszTypeName, DWORD *pcbTypeName)
 {
-	PSTR str = NULL;
+	PWSTR str = NULL;
 	DWORD strlen;
 	BOOL ret;
 
 	TRACE("(%ld, %p, %08ld, %p, %p, %p)\n", dwIndex, pdwReserved, dwFlags,
 			pdwProvType, pszTypeName, pcbTypeName);
-	strlen = *pcbTypeName / sizeof(WCHAR);
+	strlen = *pcbTypeName * sizeof(WCHAR);
 	if ( pszTypeName && !(str = CRYPT_Alloc(strlen)) )
 		CRYPT_ReturnLastError(ERROR_NOT_ENOUGH_MEMORY);
-	ret = CryptEnumProviderTypesA(dwIndex, pdwReserved, dwFlags, pdwProvType, str, &strlen);
+	ret = CryptEnumProviderTypesW(dwIndex, pdwReserved, dwFlags, pdwProvType, str, &strlen);
 	if (str)
 	{
-		CRYPT_ANSIToUnicode(str, &pszTypeName, *pcbTypeName);
+		CRYPT_UnicodeToANSI(str, &pszTypeName, *pcbTypeName);
 		CRYPT_Free(str);
 	}
-	*pcbTypeName = strlen * sizeof(WCHAR);
+	*pcbTypeName = strlen / sizeof(WCHAR);
 	return ret;
 }
 
@@ -1223,7 +1261,7 @@
 }
 
 /******************************************************************************
- * CryptGetDefaultProviderA (ADVAPI32.@)
+ * CryptGetDefaultProviderW (ADVAPI32.@)
  *
  * Finds the default CSP of a certain provider type.
  *
@@ -1242,12 +1280,14 @@
  *  If pszProvName is NULL, pcbProvName will hold the size of the buffer for
  *  memory allocation purposes on return.
  */
-BOOL WINAPI CryptGetDefaultProviderA (DWORD dwProvType, DWORD *pdwReserved,
-		DWORD dwFlags, LPSTR pszProvName, DWORD *pcbProvName)
+BOOL WINAPI CryptGetDefaultProviderW (DWORD dwProvType, DWORD *pdwReserved,
+		DWORD dwFlags, LPWSTR pszProvName, DWORD *pcbProvName)
 {
 	HKEY hKey;
-	PSTR keyname;
+	PWSTR keyname;
 	DWORD result;
+	
+	static const WCHAR nameW[] = {'N','a','m','e',0};
 
 	if (pdwReserved || !pcbProvName)
 		CRYPT_ReturnLastError(ERROR_INVALID_PARAMETER);
@@ -1257,14 +1297,14 @@
 		CRYPT_ReturnLastError(NTE_BAD_PROV_TYPE);
 	if ( !(keyname = CRYPT_GetTypeKeyName(dwProvType, dwFlags & CRYPT_USER_DEFAULT)) )
 		CRYPT_ReturnLastError(ERROR_NOT_ENOUGH_MEMORY);
-	if (RegOpenKeyA((dwFlags & CRYPT_USER_DEFAULT) ?  HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE ,keyname, &hKey))
+	if (RegOpenKeyW((dwFlags & CRYPT_USER_DEFAULT) ?  HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE ,keyname, &hKey))
 	{
 		CRYPT_Free(keyname);
 		CRYPT_ReturnLastError(NTE_PROV_TYPE_NOT_DEF);
 	}
 	CRYPT_Free(keyname);
 	
-	result = RegQueryValueExA(hKey, "Name", NULL, NULL, pszProvName, pcbProvName); 
+	result = RegQueryValueExW(hKey, nameW, NULL, NULL, (LPBYTE)pszProvName, pcbProvName);
 	if (result)
 	{
 		if (result != ERROR_MORE_DATA)
@@ -1280,29 +1320,29 @@
 }
 
 /******************************************************************************
- * CryptGetDefaultProviderW (ADVAPI32.@)
+ * CryptGetDefaultProviderA (ADVAPI32.@)
  *
- * see CryptGetDefaultProviderA
+ * see CryptGetDefaultProviderW
  */
-BOOL WINAPI CryptGetDefaultProviderW (DWORD dwProvType, DWORD *pdwReserved,
-		DWORD dwFlags, LPWSTR pszProvName, DWORD *pcbProvName)
+BOOL WINAPI CryptGetDefaultProviderA (DWORD dwProvType, DWORD *pdwReserved,
+		DWORD dwFlags, LPSTR pszProvName, DWORD *pcbProvName)
 {
-	PSTR str = NULL;
+	PWSTR str = NULL;
 	DWORD strlen;
 	BOOL ret = FALSE;
 
 	TRACE("(%ld, %p, %08ld, %p, %p)\n", dwProvType, pdwReserved, dwFlags, pszProvName, pcbProvName);
 
-	strlen = *pcbProvName / sizeof(WCHAR);
+	strlen = *pcbProvName * sizeof(WCHAR);
 	if ( pszProvName && !(str = CRYPT_Alloc(strlen)) )
 		CRYPT_ReturnLastError(ERROR_NOT_ENOUGH_MEMORY);
-	ret = CryptGetDefaultProviderA(dwProvType, pdwReserved, dwFlags, str, &strlen);
+	ret = CryptGetDefaultProviderW(dwProvType, pdwReserved, dwFlags, str, &strlen);
 	if (str)
 	{
-		CRYPT_ANSIToUnicode(str, &pszProvName, *pcbProvName);
+		CRYPT_UnicodeToANSI(str, &pszProvName, *pcbProvName);
 		CRYPT_Free(str);
 	}
-	*pcbProvName = strlen * sizeof(WCHAR);
+	*pcbProvName = strlen / sizeof(WCHAR);
 	return ret;
 }
 
@@ -1681,7 +1721,7 @@
 }
 
 /******************************************************************************
- * CryptSetProviderExA (ADVAPI32.@)
+ * CryptSetProviderExW (ADVAPI32.@)
  *
  * Specifies the default CSP.
  *
@@ -1695,12 +1735,14 @@
  *  Success: TRUE
  *  Failure: FALSE
  */
-BOOL WINAPI CryptSetProviderExA (LPCSTR pszProvName, DWORD dwProvType, DWORD *pdwReserved, DWORD dwFlags)
+BOOL WINAPI CryptSetProviderExW (LPCWSTR pszProvName, DWORD dwProvType, DWORD *pdwReserved, DWORD dwFlags)
 {
 	HKEY hProvKey, hTypeKey;
-	PSTR keyname;
+	PWSTR keyname;
+	
+	static const WCHAR nameW[] = {'N','a','m','e',0};
 
-	TRACE("(%s, %ld, %p, %08ld)\n", pszProvName, dwProvType, pdwReserved, dwFlags);
+	TRACE("(%s, %ld, %p, %08ld)\n", debugstr_w(pszProvName), dwProvType, pdwReserved, dwFlags);
 
 	if (!pszProvName || pdwReserved)
 		CRYPT_ReturnLastError(ERROR_INVALID_PARAMETER);
@@ -1712,7 +1754,7 @@
 	
 	if (!(keyname = CRYPT_GetTypeKeyName(dwProvType, dwFlags & CRYPT_USER_DEFAULT)))
 		CRYPT_ReturnLastError(ERROR_NOT_ENOUGH_MEMORY);
-	if (RegOpenKeyA((dwFlags & CRYPT_USER_DEFAULT) ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE,
+	if (RegOpenKeyW((dwFlags & CRYPT_USER_DEFAULT) ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE,
 		keyname, &hTypeKey))
 	{
 		CRYPT_Free(keyname);
@@ -1722,7 +1764,7 @@
 	
 	if (dwFlags & CRYPT_DELETE_DEFAULT)
 	{
-		RegDeleteValueA(hTypeKey, "Name");
+		RegDeleteValueW(hTypeKey, nameW);
 	}
 	else
 	{
@@ -1731,7 +1773,7 @@
 			RegCloseKey(hTypeKey);
 			CRYPT_ReturnLastError(ERROR_NOT_ENOUGH_MEMORY);
 		}
-		if (RegOpenKeyA((dwFlags & CRYPT_USER_DEFAULT) ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE,
+		if (RegOpenKeyW((dwFlags & CRYPT_USER_DEFAULT) ? HKEY_CURRENT_USER : HKEY_LOCAL_MACHINE,
 			keyname, &hProvKey))
 		{
 			CRYPT_Free(keyname);
@@ -1740,7 +1782,7 @@
 		}
 		CRYPT_Free(keyname);
 		
-		if (RegSetValueExA(hTypeKey, "Name", 0, REG_SZ, pszProvName, strlen(pszProvName) + 1))
+		if (RegSetValueExW(hTypeKey, nameW, 0, REG_SZ, (LPBYTE)pszProvName, (strlenW(pszProvName) + 1) * sizeof(WCHAR)))
 		{
 			RegCloseKey(hTypeKey);
 			RegCloseKey(hProvKey);
@@ -1755,20 +1797,20 @@
 }
 
 /******************************************************************************
- * CryptSetProviderExW (ADVAPI32.@)
+ * CryptSetProviderExA (ADVAPI32.@)
  *
- * See CryptSetProviderExA
+ * See CryptSetProviderExW
  */
-BOOL WINAPI CryptSetProviderExW (LPCWSTR pszProvName, DWORD dwProvType, DWORD *pdwReserved, DWORD dwFlags)
+BOOL WINAPI CryptSetProviderExA (LPCSTR pszProvName, DWORD dwProvType, DWORD *pdwReserved, DWORD dwFlags)
 {
 	BOOL ret = FALSE;
-	PSTR str = NULL;
+	PWSTR str = NULL;
 
-	TRACE("(%s, %ld, %p, %08ld)\n", debugstr_w(pszProvName), dwProvType, pdwReserved, dwFlags);
+	TRACE("(%s, %ld, %p, %08ld)\n", pszProvName, dwProvType, pdwReserved, dwFlags);
 
-	if (CRYPT_UnicodeToANSI(pszProvName, &str, -1))
+	if (CRYPT_ANSIToUnicode(pszProvName, &str, -1))
 	{
-		ret = CryptSetProviderExA(str, dwProvType, pdwReserved, dwFlags);
+		ret = CryptSetProviderExW(str, dwProvType, pdwReserved, dwFlags);
 		CRYPT_Free(str);
 	}
 	return ret;
