advpack: DoInfInstall test, fix
Markus Amsler
markus.amsler at oribi.org
Thu Dec 8 17:35:29 CST 2005
Changelog:
Markus Amsler <markus.amsler at oribi.org>
Add test for DoInfInstall and make it pass under wine.
-------------- next part --------------
Index: dlls/advpack/advpack.c
===================================================================
RCS file: /home/wine/wine/dlls/advpack/advpack.c,v
retrieving revision 1.18
diff -u -r1.18 advpack.c
--- dlls/advpack/advpack.c 2 Dec 2005 10:29:40 -0000 1.18
+++ dlls/advpack/advpack.c 8 Dec 2005 23:30:51 -0000
@@ -159,20 +159,26 @@
return E_FAIL;
}
-/* this structure very closely resembles parameters of RunSetupCommand() */
-typedef struct
-{
- HWND hwnd;
- LPCSTR title;
- LPCSTR inf_name;
- LPCSTR dir;
- LPCSTR section_name;
-} SETUPCOMMAND_PARAMS;
-
/***********************************************************************
* DoInfInstall (ADVPACK.@)
+ *
+ * Install an INF section.
+ *
+ * PARAMS
+ * setup [I] Structure containing install information.
+ * See INFINSTALLPARAMS in include/advpub.h.
+ *
+ * RETURNS
+ * S_OK Everything OK
+ * E_INVALIDARG Invalid argument, cmdline NULL
+ * HRESULT_FROM_WIN32(GetLastError()) Some other error
+ *
+ * NOTES
+ * The INFINSTALLPARAMS structure is undocumented by Microsoft.
+ * It looks like the arguments from RunSetupCommand() are packed
+ * into that structure. But the flags (DII_*) are different.
*/
-BOOL WINAPI DoInfInstall(const SETUPCOMMAND_PARAMS *setup)
+HRESULT WINAPI DoInfInstall(LPCINFINSTALLPARAMS setup)
{
BOOL ret;
HINF hinf;
@@ -182,8 +188,10 @@
debugstr_a(setup->inf_name), debugstr_a(setup->dir),
debugstr_a(setup->section_name));
+ if (setup->inf_name == NULL) return E_INVALIDARG;
+
hinf = SetupOpenInfFileA(setup->inf_name, NULL, INF_STYLE_WIN4, NULL);
- if (hinf == INVALID_HANDLE_VALUE) return FALSE;
+ if (hinf == INVALID_HANDLE_VALUE) return HRESULT_FROM_WIN32(GetLastError());
callback_context = SetupInitDefaultQueueCallback(setup->hwnd);
@@ -193,7 +201,7 @@
SetupTermDefaultQueueCallback(callback_context);
SetupCloseInfFile(hinf);
- return ret;
+ return ret ? S_OK : HRESULT_FROM_WIN32(GetLastError());
}
/***********************************************************************
Index: dlls/advpack/tests/advpack.c
===================================================================
RCS file: /home/wine/wine/dlls/advpack/tests/advpack.c,v
retrieving revision 1.11
diff -u -r1.11 advpack.c
--- dlls/advpack/tests/advpack.c 29 Nov 2005 11:07:43 -0000 1.11
+++ dlls/advpack/tests/advpack.c 8 Dec 2005 23:30:51 -0000
@@ -31,6 +31,7 @@
static HRESULT (WINAPI *pGetVersionFromFile)(LPSTR,LPDWORD,LPDWORD,BOOL);
static HRESULT (WINAPI *pDelNode)(LPCSTR,DWORD);
static HRESULT (WINAPI *pTranslateInfString)(LPSTR,LPSTR,LPSTR,LPSTR,LPSTR,DWORD,LPDWORD,LPVOID);
+static HRESULT (WINAPI *pDoInfInstall)(LPCINFINSTALLPARAMS);
static void version_test(void)
{
@@ -162,6 +163,9 @@
append_str(&ptr, "[Strings]\n");
append_str(&ptr, "DefaultAppPath=\"Application Name\"\n");
append_str(&ptr, "LProgramF=\"Program Files\"\n");
+ append_str(&ptr, "[InfInstall]\n");
+ append_str(&ptr, "AddReg=TestReg\n");
+ append_str(&ptr, "[TestReg]\n");
WriteFile(hf, data, ptr - data, &dwNumberOfBytesWritten, NULL);
CloseHandle(hf);
@@ -240,6 +244,58 @@
DeleteFile("c:\\test.inf");
}
+struct _inf_install {
+ LPCSTR file;
+ LPCSTR dir;
+ LPCSTR section;
+ DWORD flags;
+ HRESULT result;
+ HRESULT result_w9x;
+};
+
+static void infinstall_test()
+{
+ HRESULT hr;
+
+ INFINSTALLPARAMS params = {
+ NULL,
+ "WindowTitle",
+ NULL,
+ NULL,
+ NULL,
+ 0,
+ 0
+ };
+
+ struct _inf_install inf_install[]={
+ { NULL , NULL, NULL , DII_FLAG_QUIET,
+ E_INVALIDARG, E_FAIL },
+ { "C:\\a.inf" , NULL, NULL , DII_FLAG_QUIET,
+ HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), E_FAIL },
+ { "C:\\test.inf", NULL, NULL , 0,
+ S_OK, S_OK },
+ { "C:\\test.inf", NULL, "foobar" , 0,
+ S_OK, S_OK },
+ { "C:\\test.inf", NULL, "InfInstall", 0,
+ S_OK, S_OK },
+ };
+ int i, num_test = (sizeof(inf_install)/sizeof(struct _inf_install));
+
+ create_inf_file();
+ for (i=0; i < num_test; i++)
+ {
+ params.inf_name = inf_install[i].file;
+ params.dir = inf_install[i].dir;
+ params.section_name = inf_install[i].section;
+ params.flags = inf_install[i].flags;
+ hr = pDoInfInstall(¶ms);
+ ok (hr==inf_install[i].result || hr==inf_install[i].result_w9x,
+ "i=%d Expected 0x%08x, got 0x%08x\n", i, (UINT)inf_install[i].result, (UINT)hr);
+ }
+ DeleteFile("c:\\a.inf");
+ DeleteFile("c:\\test.inf");
+}
+
START_TEST(advpack)
{
HMODULE hdll;
@@ -251,12 +307,14 @@
pGetVersionFromFile = (void*)GetProcAddress(hdll, "GetVersionFromFile");
pDelNode = (void*)GetProcAddress(hdll, "DelNode");
pTranslateInfString = (void*)GetProcAddress(hdll, "TranslateInfString");
- if (!pGetVersionFromFile || !pDelNode || !pTranslateInfString)
+ pDoInfInstall = (void*)GetProcAddress(hdll, "DoInfInstall");
+ if (!pGetVersionFromFile || !pDelNode || !pTranslateInfString || !pDoInfInstall)
return;
version_test();
delnode_test();
translateinfstring_test();
+ infinstall_test();
FreeLibrary(hdll);
}
Index: include/advpub.h
===================================================================
RCS file: /home/wine/wine/include/advpub.h,v
retrieving revision 1.8
diff -u -r1.8 advpub.h
--- include/advpub.h 1 Dec 2005 12:00:26 -0000 1.8
+++ include/advpub.h 8 Dec 2005 23:30:52 -0000
@@ -46,6 +46,20 @@
typedef const STRTABLE CSTRTABLE;
typedef CSTRTABLE *LPCSTRTABLE;
+/* Structure for DoInfInstall */
+typedef struct _InfInstallParams{
+ HWND hwnd;
+ LPCSTR title;
+ LPCSTR inf_name;
+ LPCSTR dir;
+ LPCSTR section_name;
+ DWORD unknown1;
+ DWORD flags;
+} INFINSTALLPARAMS, *LPINFINSTALLPARAMS;
+
+typedef const INFINSTALLPARAMS CINFINSTALLPARAMS;
+typedef CINFINSTALLPARAMS *LPCINFINSTALLPARAMS;
+
/* Flags for AdvInstallFile */
#define AIF_WARNIFSKIP 0x00000001
#define AIF_NOSKIP 0x00000002
@@ -66,6 +80,9 @@
#define RSC_FLAG_DELAYREGISTEROCX 0x00000200
#define RSC_FLAG_SETUPAPI 0x00000400
+/* Flags for DoInfInstall */
+#define DII_FLAG_QUIET 0x00000001
+
/* Flags for DelNode */
#define ADN_DEL_IF_EMPTY 0x00000001
#define ADN_DONT_DEL_SUBDIRS 0x00000002
@@ -77,6 +94,7 @@
DWORD dwFlags, DWORD dwReserved);
HRESULT WINAPI DelNode(LPCSTR pszFileOrDirName, DWORD dwFlags);
HRESULT WINAPI DelNodeRunDLL32(HWND,HINSTANCE,LPSTR,INT);
+HRESULT WINAPI DoInfInstall(LPCINFINSTALLPARAMS setup);
HRESULT WINAPI ExecuteCab( HWND hwnd, PCABINFO pCab, LPVOID pReserved );
HRESULT WINAPI ExtractFiles(LPCSTR,LPCSTR,DWORD,LPCSTR,LPVOID,DWORD);
HRESULT WINAPI GetVersionFromFile(LPSTR lpszFilename, LPDWORD pdwMSVer, LPDWORD pdwLSVer, BOOL bVersion);
More information about the wine-patches
mailing list