Module: wine Branch: refs/heads/master Commit: 480b64950b9c9212a10d62dcec5c8a733fef6171 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=480b64950b9c9212a10d62dc...
Author: James Hawkins truiken@gmail.com Date: Sun Mar 26 22:05:58 2006 -0600
advpack: Implement the launching of executables in RunSetupCommand.
---
dlls/advpack/install.c | 42 +++++++++++++++++++++++++++++++++++++++--- dlls/advpack/tests/install.c | 16 +++++----------- 2 files changed, 44 insertions(+), 14 deletions(-)
diff --git a/dlls/advpack/install.c b/dlls/advpack/install.c index ecf8a18..c6bc6c5 100644 --- a/dlls/advpack/install.c +++ b/dlls/advpack/install.c @@ -156,6 +156,39 @@ HRESULT WINAPI LaunchINFSectionExA( HWND return E_FAIL; }
+static HRESULT launch_exe(LPCWSTR cmd, LPCWSTR dir, HANDLE *phEXE) +{ + STARTUPINFOW si; + PROCESS_INFORMATION pi; + + if (phEXE) *phEXE = NULL; + + ZeroMemory(&pi, sizeof(pi)); + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + + if (!CreateProcessW(NULL, (LPWSTR)cmd, NULL, NULL, FALSE, + CREATE_DEFAULT_ERROR_MODE | CREATE_NEW_PROCESS_GROUP, + NULL, dir, &si, &pi)) + { + return HRESULT_FROM_WIN32(GetLastError()); + } + + CloseHandle(pi.hThread); + + if (phEXE) + { + *phEXE = pi.hProcess; + return S_ASYNCHRONOUS; + } + + /* wait for the child process to finish */ + WaitForSingleObject(pi.hProcess, INFINITE); + CloseHandle(pi.hProcess); + + return S_OK; +} + /*********************************************************************** * RunSetupCommandA (ADVPACK.@) * @@ -220,23 +253,26 @@ HRESULT WINAPI RunSetupCommandA(HWND hWn * HRESULT_FROM_WIN32(GetLastError()) Some other error * * BUGS - * Unimplemented + * INF install unimplemented. */ HRESULT WINAPI RunSetupCommandW(HWND hWnd, LPCWSTR szCmdName, LPCWSTR szInfSection, LPCWSTR szDir, LPCWSTR lpszTitle, HANDLE *phEXE, DWORD dwFlags, LPVOID pvReserved ) { - FIXME("(%p, %s, %s, %s, %s, %p, 0x%08lx, %p): stub\n", + TRACE("(%p, %s, %s, %s, %s, %p, 0x%08lx, %p)\n", hWnd, debugstr_w(szCmdName), debugstr_w(szInfSection), debugstr_w(szDir), debugstr_w(lpszTitle), phEXE, dwFlags, pvReserved);
+ if (dwFlags) + FIXME("Unhandled flags: 0x%08lx\n", dwFlags); + if (!szCmdName || !szDir) return E_INVALIDARG;
if (!(dwFlags & RSC_FLAG_INF)) - *phEXE = NULL; + return launch_exe(szCmdName, szDir, phEXE);
return E_UNEXPECTED; } diff --git a/dlls/advpack/tests/install.c b/dlls/advpack/tests/install.c index 4810868..26f0fa4 100644 --- a/dlls/advpack/tests/install.c +++ b/dlls/advpack/tests/install.c @@ -56,22 +56,16 @@ static void test_RunSetupCommand() /* try to run a non-existent exe */ hexe = (HANDLE)0xdeadbeef; hr = pRunSetupCommand(NULL, "idontexist.exe", "Install", "c:\windows\system32", "Title", &hexe, 0, NULL); - todo_wine - { - ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), - "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %ld\n", hr); - } + ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), + "Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %ld\n", hr); ok(hexe == NULL, "Expcted hexe to be NULL\n"); ok(!TerminateProcess(hexe, 0), "Expected TerminateProcess to fail\n");
/* try a bad directory */ hexe = (HANDLE)0xdeadbeef; - hr = pRunSetupCommand(NULL, "winve.exe", "Install", "", "Title", &hexe, 0, NULL); - todo_wine - { - ok(hr == HRESULT_FROM_WIN32(ERROR_DIRECTORY), - "Expected HRESULT_FROM_WIN32(ERROR_DIRECTORY), got %ld\n", hr); - } + hr = pRunSetupCommand(NULL, "winver.exe", "Install", "non\existent\directory", "Title", &hexe, 0, NULL); + ok(hr == HRESULT_FROM_WIN32(ERROR_DIRECTORY), + "Expected HRESULT_FROM_WIN32(ERROR_DIRECTORY), got %ld\n", hr); ok(hexe == NULL, "Expcted hexe to be NULL\n"); ok(!TerminateProcess(hexe, 0), "Expected TerminateProcess to fail\n");