diff --git a/dlls/advpack/Makefile.in b/dlls/advpack/Makefile.in
index 453808393e70e9311e8f7887cd683b66b1815f8d..b1705c7ab6fe435da6cf1671d70e8db1c27887b2 100644
--- a/dlls/advpack/Makefile.in
+++ b/dlls/advpack/Makefile.in
@@ -10,6 +10,7 @@ EXTRALIBS = $(LIBUNICODE)
 C_SRCS = \
 	advpack.c \
 	files.c \
+	install.c \
 	reg.c
 
 SUBDIRS = tests
diff --git a/dlls/advpack/advpack.c b/dlls/advpack/advpack.c
index 0e8c7e58e73525b8f8f3426b066e7facfbe602bd..ca1d9f943afc40c37786966b6162959559a5595f 100644
--- a/dlls/advpack/advpack.c
+++ b/dlls/advpack/advpack.c
@@ -140,146 +140,6 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
     return TRUE;
 }
 
-/***********************************************************************
- *		RunSetupCommand  (ADVPACK.@)
- *
- * Executes an install section in an INF file or a program.
- *
- * PARAMS
- *   hWnd          [I] Handle to parent window, NULL for quiet mode
- *   szCmdName     [I] Inf or EXE filename to execute
- *   szInfSection  [I] Inf section to install, NULL for DefaultInstall
- *   szDir         [I] Path to extracted files
- *   szTitle       [I] Title of all dialogs
- *   phEXE         [O] Handle of EXE to wait for
- *   dwFlags       [I] Flags; see include/advpub.h
- *   pvReserved    [I] Reserved
- *
- * RETURNS
- *   S_OK                                 Everything OK
- *   S_ASYNCHRONOUS                       OK, required to wait on phEXE
- *   ERROR_SUCCESS_REBOOT_REQUIRED        Reboot required
- *   E_INVALIDARG                         Invalid argument given
- *   HRESULT_FROM_WIN32(ERROR_OLD_WIN_VERSION)
- *                                        Not supported on this Windows version
- *   E_UNEXPECTED                         Unexpected error
- *   HRESULT_FROM_WIN32(GetLastError())   Some other error
- *
- * BUGS
- *   Unimplemented
- */
-HRESULT WINAPI RunSetupCommand( HWND hWnd, LPCSTR szCmdName,
-                                LPCSTR szInfSection, LPCSTR szDir,
-                                LPCSTR lpszTitle, HANDLE *phEXE,
-                                DWORD dwFlags, LPVOID pvReserved )
-{
-    FIXME("(%p, %s, %s, %s, %s, %p, 0x%08lx, %p): stub\n",
-           hWnd, debugstr_a(szCmdName), debugstr_a(szInfSection),
-           debugstr_a(szDir), debugstr_a(lpszTitle),
-           phEXE, dwFlags, pvReserved);
-    return E_UNEXPECTED;
-}
-
-/***********************************************************************
- *		LaunchINFSection  (ADVPACK.@)
- *
- * Installs an INF section without BACKUP/ROLLBACK capabilities.
- *
- * PARAMS
- *   hWnd    [I] Handle to parent window, NULL for desktop.
- *   hInst   [I] Instance of the process.
- *   cmdline [I] Contains parameters in the order INF,section,flags.
- *   show    [I] Reboot behaviour:
- *              'A' reboot always
- *              'I' default, reboot if needed
- *              'N' no reboot
- *
- * RETURNS
- *  Success: S_OK.
- *  Failure: S_FALSE
- *
- * BUGS
- *  Unimplemented.
- */
-INT WINAPI LaunchINFSection( HWND hWnd, HINSTANCE hInst, LPSTR cmdline, INT show )
-{
-    FIXME("(%p %p %s %d): stub\n", hWnd, hInst, debugstr_a(cmdline), show );
-    return 0;
-}
-
-/***********************************************************************
- *		LaunchINFSectionEx  (ADVPACK.@)
- *
- * Installs an INF section with BACKUP/ROLLBACK capabilities.
- *
- * PARAMS
- *   hWnd    [I] Handle to parent window, NULL for desktop.
- *   hInst   [I] Instance of the process.
- *   cmdline [I] Contains parameters in the order INF,section,CAB,flags.
- *   show    [I] Reboot behaviour:
- *              'A' reboot always
- *              'I' default, reboot if needed
- *              'N' no reboot
- *
- * RETURNS
- *  Success: S_OK.
- *  Failure: E_FAIL.
- *
- * BUGS
- *  Unimplemented.
- */
-HRESULT WINAPI LaunchINFSectionEx( HWND hWnd, HINSTANCE hInst, LPSTR cmdline, INT show )
-{
-    FIXME("(%p %p %s %d): stub\n", hWnd, hInst, debugstr_a(cmdline), show );
-    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.
- *
- * RETURNS
- *   S_OK                                Everything OK
- *   HRESULT_FROM_WIN32(GetLastError())  Some other error
- */
-HRESULT WINAPI DoInfInstall(const SETUPCOMMAND_PARAMS *setup)
-{
-    BOOL ret;
-    HINF hinf;
-    void *callback_context;
-
-    TRACE("%p %s %s %s %s\n", setup->hwnd, debugstr_a(setup->title),
-          debugstr_a(setup->inf_name), debugstr_a(setup->dir),
-          debugstr_a(setup->section_name));
-
-    hinf = SetupOpenInfFileA(setup->inf_name, NULL, INF_STYLE_WIN4, NULL);
-    if (hinf == INVALID_HANDLE_VALUE) return HRESULT_FROM_WIN32(GetLastError());
-
-    callback_context = SetupInitDefaultQueueCallback(setup->hwnd);
-
-    ret = SetupInstallFromInfSectionA(NULL, hinf, setup->section_name, SPINST_ALL,
-                                      NULL, NULL, 0, SetupDefaultQueueCallbackA,
-                                      callback_context, NULL, NULL);
-    SetupTermDefaultQueueCallback(callback_context);
-    SetupCloseInfFile(hinf);
-
-    return ret ? S_OK : HRESULT_FROM_WIN32(GetLastError());
-}
-
 /***********************************************************************
  *              IsNTAdmin	(ADVPACK.@)
  *
@@ -497,29 +357,6 @@ void WINAPI RegisterOCX( HWND hWnd, HINSTANCE hInst, LPCSTR cmdline, INT show )
     FreeLibrary(hm);
 }
 
-/***********************************************************************
- *             ExecuteCab    (ADVPACK.@)
- * 
- * Installs the INF file extracted from a specified cabinet file.
- * 
- * PARAMS
- *   hwnd      [I] Handle to the window used for the display.
- *   pCab      [I] Information about the cabinet file.
- *   pReserved [I] Reserved.  Must be NULL.
- * 
- * RETURNS
- *   Success: S_OK.
- *   Failure: E_FAIL.
- *
- * BUGS
- *   Unimplemented
- */
-HRESULT WINAPI ExecuteCab( HWND hwnd, PCABINFO pCab, LPVOID pReserved )
-{
-    FIXME("(%p %p %p): stub\n", hwnd, pCab, pReserved);
-    return E_FAIL;
-}
-
 /***********************************************************************
  *             SetPerUserSecValues    (ADVPACK.@)
  *
diff --git a/dlls/advpack/install.c b/dlls/advpack/install.c
new file mode 100644
index 0000000000000000000000000000000000000000..806f8d537d10f29bf0027a5ee2549c0f74b79467
--- /dev/null
+++ b/dlls/advpack/install.c
@@ -0,0 +1,196 @@
+/*
+ * Advpack install functions
+ *
+ * Copyright 2006 James Hawkins
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <stdarg.h>
+#include <stdlib.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "winuser.h"
+#include "winreg.h"
+#include "winver.h"
+#include "setupapi.h"
+#include "advpub.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(advpack);
+
+/* 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.
+ *
+ * RETURNS
+ *   S_OK                                Everything OK
+ *   HRESULT_FROM_WIN32(GetLastError())  Some other error
+ */
+HRESULT WINAPI DoInfInstall(const SETUPCOMMAND_PARAMS *setup)
+{
+    BOOL ret;
+    HINF hinf;
+    void *callback_context;
+
+    TRACE("%p %s %s %s %s\n", setup->hwnd, debugstr_a(setup->title),
+          debugstr_a(setup->inf_name), debugstr_a(setup->dir),
+          debugstr_a(setup->section_name));
+
+    hinf = SetupOpenInfFileA(setup->inf_name, NULL, INF_STYLE_WIN4, NULL);
+    if (hinf == INVALID_HANDLE_VALUE) return HRESULT_FROM_WIN32(GetLastError());
+
+    callback_context = SetupInitDefaultQueueCallback(setup->hwnd);
+
+    ret = SetupInstallFromInfSectionA(NULL, hinf, setup->section_name, SPINST_ALL,
+                                      NULL, NULL, 0, SetupDefaultQueueCallbackA,
+                                      callback_context, NULL, NULL);
+    SetupTermDefaultQueueCallback(callback_context);
+    SetupCloseInfFile(hinf);
+
+    return ret ? S_OK : HRESULT_FROM_WIN32(GetLastError());
+}
+
+/***********************************************************************
+ *             ExecuteCab    (ADVPACK.@)
+ * 
+ * Installs the INF file extracted from a specified cabinet file.
+ * 
+ * PARAMS
+ *   hwnd      [I] Handle to the window used for the display.
+ *   pCab      [I] Information about the cabinet file.
+ *   pReserved [I] Reserved.  Must be NULL.
+ * 
+ * RETURNS
+ *   Success: S_OK.
+ *   Failure: E_FAIL.
+ *
+ * BUGS
+ *   Unimplemented
+ */
+HRESULT WINAPI ExecuteCab( HWND hwnd, PCABINFO pCab, LPVOID pReserved )
+{
+    FIXME("(%p %p %p): stub\n", hwnd, pCab, pReserved);
+    return E_FAIL;
+}
+
+/***********************************************************************
+ *      LaunchINFSection  (ADVPACK.@)
+ *
+ * Installs an INF section without BACKUP/ROLLBACK capabilities.
+ *
+ * PARAMS
+ *   hWnd    [I] Handle to parent window, NULL for desktop.
+ *   hInst   [I] Instance of the process.
+ *   cmdline [I] Contains parameters in the order INF,section,flags.
+ *   show    [I] Reboot behaviour:
+ *              'A' reboot always
+ *              'I' default, reboot if needed
+ *              'N' no reboot
+ *
+ * RETURNS
+ *  Success: S_OK.
+ *  Failure: S_FALSE
+ *
+ * BUGS
+ *  Unimplemented.
+ */
+INT WINAPI LaunchINFSection( HWND hWnd, HINSTANCE hInst, LPSTR cmdline, INT show )
+{
+    FIXME("(%p %p %s %d): stub\n", hWnd, hInst, debugstr_a(cmdline), show );
+    return 0;
+}
+
+/***********************************************************************
+ *      LaunchINFSectionEx  (ADVPACK.@)
+ *
+ * Installs an INF section with BACKUP/ROLLBACK capabilities.
+ *
+ * PARAMS
+ *   hWnd    [I] Handle to parent window, NULL for desktop.
+ *   hInst   [I] Instance of the process.
+ *   cmdline [I] Contains parameters in the order INF,section,CAB,flags.
+ *   show    [I] Reboot behaviour:
+ *              'A' reboot always
+ *              'I' default, reboot if needed
+ *              'N' no reboot
+ *
+ * RETURNS
+ *  Success: S_OK.
+ *  Failure: E_FAIL.
+ *
+ * BUGS
+ *  Unimplemented.
+ */
+HRESULT WINAPI LaunchINFSectionEx( HWND hWnd, HINSTANCE hInst, LPSTR cmdline, INT show )
+{
+    FIXME("(%p %p %s %d): stub\n", hWnd, hInst, debugstr_a(cmdline), show );
+    return E_FAIL;
+}
+
+/***********************************************************************
+ *      RunSetupCommand  (ADVPACK.@)
+ *
+ * Executes an install section in an INF file or a program.
+ *
+ * PARAMS
+ *   hWnd          [I] Handle to parent window, NULL for quiet mode
+ *   szCmdName     [I] Inf or EXE filename to execute
+ *   szInfSection  [I] Inf section to install, NULL for DefaultInstall
+ *   szDir         [I] Path to extracted files
+ *   szTitle       [I] Title of all dialogs
+ *   phEXE         [O] Handle of EXE to wait for
+ *   dwFlags       [I] Flags; see include/advpub.h
+ *   pvReserved    [I] Reserved
+ *
+ * RETURNS
+ *   S_OK                                 Everything OK
+ *   S_ASYNCHRONOUS                       OK, required to wait on phEXE
+ *   ERROR_SUCCESS_REBOOT_REQUIRED        Reboot required
+ *   E_INVALIDARG                         Invalid argument given
+ *   HRESULT_FROM_WIN32(ERROR_OLD_WIN_VERSION)
+ *                                        Not supported on this Windows version
+ *   E_UNEXPECTED                         Unexpected error
+ *   HRESULT_FROM_WIN32(GetLastError())   Some other error
+ *
+ * BUGS
+ *   Unimplemented
+ */
+HRESULT WINAPI RunSetupCommand( HWND hWnd, LPCSTR szCmdName,
+                                LPCSTR szInfSection, LPCSTR szDir,
+                                LPCSTR lpszTitle, HANDLE *phEXE,
+                                DWORD dwFlags, LPVOID pvReserved )
+{
+    FIXME("(%p, %s, %s, %s, %s, %p, 0x%08lx, %p): stub\n",
+           hWnd, debugstr_a(szCmdName), debugstr_a(szInfSection),
+           debugstr_a(szDir), debugstr_a(lpszTitle),
+           phEXE, dwFlags, pvReserved);
+    return E_UNEXPECTED;
+}