Module: wine Branch: refs/heads/master Commit: c67728f7c67f5b847d4d145aeaf62ba84a0258f2 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=c67728f7c67f5b847d4d145a...
Author: Alexandre Julliard julliard@winehq.org Date: Fri Mar 17 23:08:27 2006 +0100
setupapi: Added support for calling executables in a RegisterDlls section.
---
dlls/setupapi/install.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 files changed, 40 insertions(+), 0 deletions(-)
diff --git a/dlls/setupapi/install.c b/dlls/setupapi/install.c index 4cdfdcf..43544da 100644 --- a/dlls/setupapi/install.c +++ b/dlls/setupapi/install.c @@ -444,6 +444,7 @@ static BOOL do_register_dll( const struc HMODULE module; HRESULT res; SP_REGISTER_CONTROL_STATUSW status; + IMAGE_NT_HEADERS *nt;
status.cbSize = sizeof(status); status.FileName = path; @@ -473,6 +474,45 @@ static BOOL do_register_dll( const struc goto done; }
+ if ((nt = RtlImageNtHeader( module )) && !(nt->FileHeader.Characteristics & IMAGE_FILE_DLL)) + { + /* file is an executable, not a dll */ + STARTUPINFOW startup; + PROCESS_INFORMATION info; + WCHAR *cmd_line; + BOOL res; + static const WCHAR format[] = {'"','%','s','"',' ','%','s',0}; + static const WCHAR default_args[] = {'/','R','e','g','S','e','r','v','e','r',0}; + + FreeLibrary( module ); + module = NULL; + if (!args) args = default_args; + cmd_line = HeapAlloc( GetProcessHeap(), 0, (strlenW(path) + strlenW(args) + 4) * sizeof(WCHAR) ); + sprintfW( cmd_line, format, path, args ); + memset( &startup, 0, sizeof(startup) ); + startup.cb = sizeof(startup); + TRACE( "executing %s\n", debugstr_w(cmd_line) ); + res = CreateProcessW( NULL, cmd_line, NULL, NULL, FALSE, 0, NULL, NULL, &startup, &info ); + HeapFree( GetProcessHeap(), 0, cmd_line ); + if (!res) + { + status.FailureCode = SPREG_LOADLIBRARY; + status.Win32Error = GetLastError(); + goto done; + } + CloseHandle( info.hThread ); + + if (WaitForSingleObject( info.hProcess, timeout*1000 ) == WAIT_TIMEOUT) + { + /* timed out, kill the process */ + TerminateProcess( info.hProcess, 1 ); + status.FailureCode = SPREG_TIMEOUT; + status.Win32Error = ERROR_TIMEOUT; + } + CloseHandle( info.hProcess ); + goto done; + } + if (flags & FLG_REGSVR_DLLREGISTER) { const char *entry_point = info->unregister ? "DllUnregisterServer" : "DllRegisterServer";