mirror of
https://github.com/reactos/wine.git
synced 2024-11-25 20:59:54 +00:00
setupapi: Add support for creating directories from the FakeDlls section.
This commit is contained in:
parent
05e55edd82
commit
0ed9db27c5
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user