Commit 0ed9db27 authored by Alexandre Julliard's avatar Alexandre Julliard

setupapi: Add support for creating directories from the FakeDlls section.

parent 05e55edd
...@@ -276,6 +276,27 @@ static BOOL is_fake_dll( HANDLE h ) ...@@ -276,6 +276,27 @@ static BOOL is_fake_dll( HANDLE h )
return !memcmp( dos + 1, fakedll_signature, sizeof(fakedll_signature) ); 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 * create_fake_dll
*/ */
...@@ -285,6 +306,13 @@ BOOL create_fake_dll( const WCHAR *name, const WCHAR *source ) ...@@ -285,6 +306,13 @@ BOOL create_fake_dll( const WCHAR *name, const WCHAR *source )
HMODULE module; HMODULE module;
BOOL ret; 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 */ /* first check for an existing file */
h = CreateFileW( name, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL ); h = CreateFileW( name, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL );
if (h != INVALID_HANDLE_VALUE) if (h != INVALID_HANDLE_VALUE)
...@@ -301,27 +329,7 @@ BOOL create_fake_dll( const WCHAR *name, const WCHAR *source ) ...@@ -301,27 +329,7 @@ BOOL create_fake_dll( const WCHAR *name, const WCHAR *source )
} }
else else
{ {
if (GetLastError() == ERROR_PATH_NOT_FOUND) if (GetLastError() == ERROR_PATH_NOT_FOUND) create_directories( name );
{
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);
}
h = CreateFileW( name, GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, NULL ); h = CreateFileW( name, GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, NULL );
if (h == INVALID_HANDLE_VALUE) if (h == INVALID_HANDLE_VALUE)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment