James Hawkins : advpack:
Open the INF file if the RSC_FLAG_INF flag is specified.
Alexandre Julliard
julliard at wine.codeweavers.com
Thu Mar 30 05:44:26 CST 2006
Module: wine
Branch: refs/heads/master
Commit: c26245077de0759d10a531a4e7575798fa374ecf
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=c26245077de0759d10a531a4e7575798fa374ecf
Author: James Hawkins <truiken at gmail.com>
Date: Wed Mar 29 11:36:04 2006 -0600
advpack: Open the INF file if the RSC_FLAG_INF flag is specified.
---
dlls/advpack/install.c | 19 +++++++++++++++++++
dlls/advpack/tests/install.c | 13 +++++++++----
2 files changed, 28 insertions(+), 4 deletions(-)
diff --git a/dlls/advpack/install.c b/dlls/advpack/install.c
index f44c042..042f761 100644
--- a/dlls/advpack/install.c
+++ b/dlls/advpack/install.c
@@ -33,6 +33,11 @@
WINE_DEFAULT_DEBUG_CHANNEL(advpack);
+#define SPAPI_ERROR 0xE0000000L
+#define SPAPI_PREFIX 0x800F0000L
+#define SPAPI_MASK 0xFFFFL
+#define HRESULT_FROM_SPAPI(x) ((x & SPAPI_MASK) | SPAPI_PREFIX)
+
/* this structure very closely resembles parameters of RunSetupCommand() */
typedef struct
{
@@ -293,6 +298,9 @@ HRESULT WINAPI RunSetupCommandW(HWND hWn
LPCWSTR lpszTitle, HANDLE *phEXE,
DWORD dwFlags, LPVOID pvReserved )
{
+ HINF hinf;
+ DWORD err;
+
TRACE("(%p, %s, %s, %s, %s, %p, 0x%08lx, %p)\n",
hWnd, debugstr_w(szCmdName), debugstr_w(szInfSection),
debugstr_w(szDir), debugstr_w(lpszTitle),
@@ -307,5 +315,16 @@ HRESULT WINAPI RunSetupCommandW(HWND hWn
if (!(dwFlags & RSC_FLAG_INF))
return launch_exe(szCmdName, szDir, phEXE);
+ hinf = SetupOpenInfFileW(szCmdName, NULL, INF_STYLE_WIN4, NULL);
+ if (hinf == INVALID_HANDLE_VALUE)
+ {
+ err = GetLastError();
+ if (err & SPAPI_ERROR)
+ return HRESULT_FROM_SPAPI(err);
+ else
+ return HRESULT_FROM_WIN32(err);
+ }
+
+ SetupCloseInfFile(hinf);
return E_UNEXPECTED;
}
diff --git a/dlls/advpack/tests/install.c b/dlls/advpack/tests/install.c
index 26f0fa4..d8eee76 100644
--- a/dlls/advpack/tests/install.c
+++ b/dlls/advpack/tests/install.c
@@ -40,6 +40,14 @@ static BOOL init_function_pointers()
return TRUE;
}
+static BOOL is_spapi_err(DWORD err)
+{
+ const DWORD SPAPI_PREFIX = 0x800F0000L;
+ const DWORD SPAPI_MASK = 0xFFFF0000L;
+
+ return (((err & SPAPI_MASK) ^ SPAPI_PREFIX) == 0);
+}
+
static void test_RunSetupCommand()
{
HRESULT hr;
@@ -72,10 +80,7 @@ static void test_RunSetupCommand()
/* try to run an exe with the RSC_FLAG_INF flag */
hexe = (HANDLE)0xdeadbeef;
hr = pRunSetupCommand(NULL, "winver.exe", "Install", "c:\\windows\\system32", "Title", &hexe, RSC_FLAG_INF, NULL);
- todo_wine
- {
- ok(hr == SPAPI_E_WRONG_INF_STYLE, "Expected SPAPI_E_WRONG_INF_STYLE, got %ld\n", hr);
- }
+ ok(is_spapi_err(hr), "Expected a setupapi error, got %ld\n", hr);
ok(hexe == (HANDLE)0xdeadbeef, "Expected hexe to be 0xdeadbeef\n");
ok(!TerminateProcess(hexe, 0), "Expected TerminateProcess to fail\n");
More information about the wine-cvs
mailing list