Detlef Riekenberg : winspool: Fix OpenDriverReg on top of
validate_envW.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed May 17 04:47:16 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: 6c233ef205b351e8a2e314de776c55ddfca5d61f
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=6c233ef205b351e8a2e314de776c55ddfca5d61f
Author: Detlef Riekenberg <wine.dev at web.de>
Date: Thu May 11 23:59:17 2006 +0200
winspool: Fix OpenDriverReg on top of validate_envW.
---
dlls/winspool/info.c | 91 +++++++++++++++++++++-----------------------------
1 files changed, 39 insertions(+), 52 deletions(-)
diff --git a/dlls/winspool/info.c b/dlls/winspool/info.c
index b67613e..1f91202 100644
--- a/dlls/winspool/info.c
+++ b/dlls/winspool/info.c
@@ -100,6 +100,9 @@ typedef struct {
typedef struct {
LPCWSTR envname;
LPCWSTR subdir;
+ DWORD driverversion;
+ LPCWSTR versionregpath;
+ LPCWSTR versionsubdir;
} printenv_t;
/* ############################### */
@@ -124,7 +127,7 @@ static const WCHAR DriversW[] = { 'S','y
'c','o','n','t','r','o','l','\\',
'P','r','i','n','t','\\',
'E','n','v','i','r','o','n','m','e','n','t','s','\\',
- '%','s','\\','D','r','i','v','e','r','s','\\',0 };
+ '%','s','\\','D','r','i','v','e','r','s','%','s',0 };
static const WCHAR MonitorsW[] = { 'S','y','s','t','e','m','\\',
'C','u', 'r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
@@ -157,6 +160,8 @@ static const WCHAR envname_win40W[] = {'
static const WCHAR envname_x86W[] = {'W','i','n','d','o','w','s',' ','N','T',' ','x','8','6',0};
static const WCHAR subdir_win40W[] = {'w','i','n','4','0',0};
static const WCHAR subdir_x86W[] = {'w','3','2','x','8','6',0};
+static const WCHAR Version3_RegPathW[] = {'\\','V','e','r','s','i','o','n','-','3',0};
+static const WCHAR Version3_SubdirW[] = {'\\','3',0};
static const WCHAR spooldriversW[] = {'\\','s','p','o','o','l','\\','d','r','i','v','e','r','s','\\',0};
@@ -226,8 +231,10 @@ static DWORD WINSPOOL_SHDeleteKeyW(HKEY
static const printenv_t * validate_envW(LPCWSTR env)
{
- static const printenv_t env_x86 = {envname_x86W, subdir_x86W};
- static const printenv_t env_win40 = {envname_win40W, subdir_win40W};
+ static const printenv_t env_x86 = {envname_x86W, subdir_x86W,
+ 3, Version3_RegPathW, Version3_SubdirW};
+ static const printenv_t env_win40 = {envname_win40W, subdir_win40W,
+ 0, emptyStringW, emptyStringW};
static const printenv_t * const all_printenv[]={&env_x86, &env_win40};
const printenv_t *result = NULL;
@@ -1854,57 +1861,37 @@ BOOL WINAPI GetPrintProcessorDirectoryW(
*/
static HKEY WINSPOOL_OpenDriverReg( LPVOID pEnvironment, BOOL unicode)
{
- static const WCHAR WinNTW[] = { 'W','i','n','d','o','w','s',' ','N','T',' ','x','8','6',0 };
- static const WCHAR Win40W[] = { 'W','i','n','d','o','w','s',' ','4','.','0',0 };
- HKEY retval;
- LPWSTR lpKey, buffer = NULL;
- LPCWSTR pEnvW;
-
- TRACE("%s\n",
- (unicode) ? debugstr_w(pEnvironment) : debugstr_a(pEnvironment));
-
- if(pEnvironment) {
- if (unicode) {
- pEnvW = pEnvironment;
- } else {
- INT len = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pEnvironment, -1, NULL, 0);
- buffer = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
- if (buffer) MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pEnvironment, -1, buffer, len);
- pEnvW = buffer;
- }
- } else {
- OSVERSIONINFOW ver;
- ver.dwOSVersionInfoSize = sizeof(OSVERSIONINFOW);
-
- if(!GetVersionExW( &ver))
- return 0;
-
- switch (ver.dwPlatformId) {
- case VER_PLATFORM_WIN32s:
- ERR("win32 style printing used with 16 bits app, try specifying 'win95' Windows version\n");
- return 0;
- case VER_PLATFORM_WIN32_NT:
- pEnvW = WinNTW;
- break;
- default:
- pEnvW = Win40W;
- break;
- }
- TRACE("set environment to %s\n", debugstr_w(pEnvW));
- }
-
- lpKey = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
- (strlenW(pEnvW) + strlenW(DriversW) + 1) * sizeof(WCHAR));
- wsprintfW( lpKey, DriversW, pEnvW);
-
- TRACE("%s\n", debugstr_w(lpKey));
-
- if(RegCreateKeyW(HKEY_LOCAL_MACHINE, lpKey, &retval) != ERROR_SUCCESS)
- retval = 0;
+ HKEY retval = NULL;
+ LPWSTR buffer;
+ const printenv_t * env;
- HeapFree( GetProcessHeap(), 0, buffer);
- HeapFree( GetProcessHeap(), 0, lpKey);
+ TRACE("(%s, %d)\n",
+ (unicode) ? debugstr_w(pEnvironment) : debugstr_a(pEnvironment), unicode);
+ if (!pEnvironment || unicode) {
+ /* pEnvironment was NULL or an Unicode-String: use it direct */
+ env = validate_envW(pEnvironment);
+ }
+ else
+ {
+ /* pEnvironment was an ANSI-String: convert to unicode first */
+ LPWSTR buffer;
+ INT len = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pEnvironment, -1, NULL, 0);
+ buffer = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ if (buffer) MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pEnvironment, -1, buffer, len);
+ env = validate_envW(buffer);
+ HeapFree(GetProcessHeap(), 0, buffer);
+ }
+ if (!env) return NULL;
+
+ buffer = HeapAlloc( GetProcessHeap(), 0,
+ (strlenW(DriversW) + strlenW(env->envname) +
+ strlenW(env->versionregpath) + 1) * sizeof(WCHAR));
+ if(buffer) {
+ wsprintfW(buffer, DriversW, env->envname, env->versionregpath);
+ RegCreateKeyW(HKEY_LOCAL_MACHINE, buffer, &retval);
+ HeapFree(GetProcessHeap(), 0, buffer);
+ }
return retval;
}
More information about the wine-cvs
mailing list