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(&params);
+        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