Peter Dons Tychsen : winedevice: Fix problems with driver entries without the "ImagePath" entry in registry .

Alexandre Julliard julliard at winehq.org
Wed Sep 17 07:15:14 CDT 2008


Module: wine
Branch: master
Commit: bc7b194bf9ec41387fc269649ee739928028a2e2
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=bc7b194bf9ec41387fc269649ee739928028a2e2

Author: Peter Dons Tychsen <donpedro at 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;




More information about the wine-cvs mailing list