setupapi: Add support for creating directories from the FakeDlls section.
authorAlexandre Julliard <julliard@winehq.org>
Thu, 17 Apr 2008 18:34:06 +0000 (20:34 +0200)
committerAlexandre Julliard <julliard@winehq.org>
Thu, 17 Apr 2008 18:34:06 +0000 (20:34 +0200)
dlls/setupapi/fakedll.c

index ca9e0694c22346af303d44c114058cc535ef816d..e46a8214f0fc5e684ca08582be745484fbc0ace7 100644 (file)
@@ -276,6 +276,27 @@ static BOOL is_fake_dll( HANDLE h )
     return !memcmp( dos + 1, fakedll_signature, sizeof(fakedll_signature) );
 }
 
+/* create directories leading to a given file */
+static void create_directories( const WCHAR *name )
+{
+    WCHAR *path, *p;
+
+    /* create the directory/directories */
+    path = HeapAlloc(GetProcessHeap(), 0, (strlenW(name) + 1)*sizeof(WCHAR));
+    strcpyW(path, name);
+
+    p = strchrW(path, '\\');
+    while (p != NULL)
+    {
+        *p = 0;
+        if (!CreateDirectoryW(path, NULL))
+            TRACE("Couldn't create directory %s - error: %d\n", wine_dbgstr_w(path), GetLastError());
+        *p = '\\';
+        p = strchrW(p+1, '\\');
+    }
+    HeapFree(GetProcessHeap(), 0, path);
+}
+
 /***********************************************************************
  *            create_fake_dll
  */
@@ -285,6 +306,13 @@ BOOL create_fake_dll( const WCHAR *name, const WCHAR *source )
     HMODULE module;
     BOOL ret;
 
+    /* check for empty name which means to only create the directory */
+    if (name[strlenW(name) - 1] == '\\')
+    {
+        create_directories( name );
+        return TRUE;
+    }
+
     /* first check for an existing file */
     h = CreateFileW( name, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL );
     if (h != INVALID_HANDLE_VALUE)
@@ -301,27 +329,7 @@ BOOL create_fake_dll( const WCHAR *name, const WCHAR *source )
     }
     else
     {
-        if (GetLastError() == ERROR_PATH_NOT_FOUND)
-        {
-            WCHAR *path;
-            WCHAR *pathel;
-
-            /* create the directory/directories */
-            path = HeapAlloc(GetProcessHeap(), 0, (strlenW(name) + 1)*sizeof(WCHAR));
-            strcpyW(path, name);
-
-            pathel = strchrW(path, '\\');
-            while (pathel != NULL)
-            {
-                *pathel = 0;
-                if (!CreateDirectoryW(path, NULL))
-                    TRACE("Couldn't create directory %s - error: %d\n", wine_dbgstr_w(path), GetLastError());
-                *pathel = '\\';
-                pathel = strchrW(pathel+1, '\\');
-            }
-
-            HeapFree(GetProcessHeap(), 0, path);
-        }
+        if (GetLastError() == ERROR_PATH_NOT_FOUND) create_directories( name );
 
         h = CreateFileW( name, GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, NULL );
         if (h == INVALID_HANDLE_VALUE)