advpack: Implement the launching of executables in RunSetupCommand.
This commit is contained in:
parent
e4b31800ab
commit
480b64950b
|
@ -156,6 +156,39 @@ HRESULT WINAPI LaunchINFSectionExA( HWND hWnd, HINSTANCE hInst, LPSTR cmdline, I
|
||||||
return E_FAIL;
|
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.@)
|
* RunSetupCommandA (ADVPACK.@)
|
||||||
*
|
*
|
||||||
|
@ -220,23 +253,26 @@ HRESULT WINAPI RunSetupCommandA(HWND hWnd, LPCSTR szCmdName,
|
||||||
* HRESULT_FROM_WIN32(GetLastError()) Some other error
|
* HRESULT_FROM_WIN32(GetLastError()) Some other error
|
||||||
*
|
*
|
||||||
* BUGS
|
* BUGS
|
||||||
* Unimplemented
|
* INF install unimplemented.
|
||||||
*/
|
*/
|
||||||
HRESULT WINAPI RunSetupCommandW(HWND hWnd, LPCWSTR szCmdName,
|
HRESULT WINAPI RunSetupCommandW(HWND hWnd, LPCWSTR szCmdName,
|
||||||
LPCWSTR szInfSection, LPCWSTR szDir,
|
LPCWSTR szInfSection, LPCWSTR szDir,
|
||||||
LPCWSTR lpszTitle, HANDLE *phEXE,
|
LPCWSTR lpszTitle, HANDLE *phEXE,
|
||||||
DWORD dwFlags, LPVOID pvReserved )
|
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),
|
hWnd, debugstr_w(szCmdName), debugstr_w(szInfSection),
|
||||||
debugstr_w(szDir), debugstr_w(lpszTitle),
|
debugstr_w(szDir), debugstr_w(lpszTitle),
|
||||||
phEXE, dwFlags, pvReserved);
|
phEXE, dwFlags, pvReserved);
|
||||||
|
|
||||||
|
if (dwFlags)
|
||||||
|
FIXME("Unhandled flags: 0x%08lx\n", dwFlags);
|
||||||
|
|
||||||
if (!szCmdName || !szDir)
|
if (!szCmdName || !szDir)
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
|
|
||||||
if (!(dwFlags & RSC_FLAG_INF))
|
if (!(dwFlags & RSC_FLAG_INF))
|
||||||
*phEXE = NULL;
|
return launch_exe(szCmdName, szDir, phEXE);
|
||||||
|
|
||||||
return E_UNEXPECTED;
|
return E_UNEXPECTED;
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,22 +56,16 @@ static void test_RunSetupCommand()
|
||||||
/* try to run a non-existent exe */
|
/* try to run a non-existent exe */
|
||||||
hexe = (HANDLE)0xdeadbeef;
|
hexe = (HANDLE)0xdeadbeef;
|
||||||
hr = pRunSetupCommand(NULL, "idontexist.exe", "Install", "c:\\windows\\system32", "Title", &hexe, 0, NULL);
|
hr = pRunSetupCommand(NULL, "idontexist.exe", "Install", "c:\\windows\\system32", "Title", &hexe, 0, NULL);
|
||||||
todo_wine
|
|
||||||
{
|
|
||||||
ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND),
|
ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND),
|
||||||
"Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %ld\n", hr);
|
"Expected HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), got %ld\n", hr);
|
||||||
}
|
|
||||||
ok(hexe == NULL, "Expcted hexe to be NULL\n");
|
ok(hexe == NULL, "Expcted hexe to be NULL\n");
|
||||||
ok(!TerminateProcess(hexe, 0), "Expected TerminateProcess to fail\n");
|
ok(!TerminateProcess(hexe, 0), "Expected TerminateProcess to fail\n");
|
||||||
|
|
||||||
/* try a bad directory */
|
/* try a bad directory */
|
||||||
hexe = (HANDLE)0xdeadbeef;
|
hexe = (HANDLE)0xdeadbeef;
|
||||||
hr = pRunSetupCommand(NULL, "winve.exe", "Install", "", "Title", &hexe, 0, NULL);
|
hr = pRunSetupCommand(NULL, "winver.exe", "Install", "non\\existent\\directory", "Title", &hexe, 0, NULL);
|
||||||
todo_wine
|
|
||||||
{
|
|
||||||
ok(hr == HRESULT_FROM_WIN32(ERROR_DIRECTORY),
|
ok(hr == HRESULT_FROM_WIN32(ERROR_DIRECTORY),
|
||||||
"Expected HRESULT_FROM_WIN32(ERROR_DIRECTORY), got %ld\n", hr);
|
"Expected HRESULT_FROM_WIN32(ERROR_DIRECTORY), got %ld\n", hr);
|
||||||
}
|
|
||||||
ok(hexe == NULL, "Expcted hexe to be NULL\n");
|
ok(hexe == NULL, "Expcted hexe to be NULL\n");
|
||||||
ok(!TerminateProcess(hexe, 0), "Expected TerminateProcess to fail\n");
|
ok(!TerminateProcess(hexe, 0), "Expected TerminateProcess to fail\n");
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue