Module: wine Branch: master Commit: bc7b194bf9ec41387fc269649ee739928028a2e2 URL: http://source.winehq.org/git/wine.git/?a=commit;h=bc7b194bf9ec41387fc269649e...
Author: Peter Dons Tychsen donpedro@tdcadsl.dk Date: Wed Sep 17 00:33:26 2008 +0200
winedevice: Fix problems with driver entries without the "ImagePath" entry in registry.
---
programs/winedevice/device.c | 34 +++++++++++++++++++++++++--------- 1 files changed, 25 insertions(+), 9 deletions(-)
diff --git a/programs/winedevice/device.c b/programs/winedevice/device.c index 5a1ba99..7afe97e 100644 --- a/programs/winedevice/device.c +++ b/programs/winedevice/device.c @@ -147,6 +147,8 @@ static NTSTATUS init_driver( HMODULE module, UNICODE_STRING *keyname ) /* load the .sys module for a device driver */ static BOOL load_driver(void) { + static const WCHAR driversW[] = {'\','d','r','i','v','e','r','s','\',0}; + static const WCHAR postfixW[] = {'.','s','y','s',0}; static const WCHAR ntprefixW[] = {'\','?','?','\',0}; static const WCHAR ImagePathW[] = {'I','m','a','g','e','P','a','t','h',0}; static const WCHAR servicesW[] = {'\','R','e','g','i','s','t','r','y', @@ -174,17 +176,31 @@ static BOOL load_driver(void)
/* read the executable path from memory */ size = 0; - if (RegQueryValueExW( driver_hkey, ImagePathW, NULL, &type, NULL, &size )) return FALSE; - - str = HeapAlloc( GetProcessHeap(), 0, size ); - if (!RegQueryValueExW( driver_hkey, ImagePathW, NULL, &type, (LPBYTE)str, &size )) + if (!RegQueryValueExW( driver_hkey, ImagePathW, NULL, &type, NULL, &size )) + { + str = HeapAlloc( GetProcessHeap(), 0, size ); + if (!RegQueryValueExW( driver_hkey, ImagePathW, NULL, &type, (LPBYTE)str, &size )) + { + size = ExpandEnvironmentStringsW(str,NULL,0); + path = HeapAlloc(GetProcessHeap(),0,size*sizeof(WCHAR)); + ExpandEnvironmentStringsW(str,path,size); + } + HeapFree( GetProcessHeap(), 0, str ); + if (!path) return FALSE; + } + else { - size = ExpandEnvironmentStringsW(str,NULL,0); - path = HeapAlloc(GetProcessHeap(),0,size*sizeof(WCHAR)); - ExpandEnvironmentStringsW(str,path,size); + /* default is to use the driver name + ".sys" */ + WCHAR buffer[MAX_PATH]; + GetSystemDirectoryW(buffer, MAX_PATH); + path = HeapAlloc(GetProcessHeap(),0, + (strlenW(buffer) + strlenW(driversW) + strlenW(driver_name) + strlenW(postfixW) + 1) + *sizeof(WCHAR)); + lstrcpyW(path, buffer); + lstrcatW(path, driversW); + lstrcatW(path, driver_name); + lstrcatW(path, postfixW); } - HeapFree( GetProcessHeap(), 0, str ); - if (!path) return FALSE;
/* GameGuard uses an NT-style path name */ str = path;