Add a display class installer (useful when installing display drivers)
authorHervé Poussineau <hpoussin@reactos.org>
Sat, 22 Oct 2005 17:18:33 +0000 (17:18 +0000)
committerHervé Poussineau <hpoussin@reactos.org>
Sat, 22 Oct 2005 17:18:33 +0000 (17:18 +0000)
Use a common header for desk.cpl files

svn path=/trunk/; revision=18683

15 files changed:
reactos/bootdata/packages/reactos.dff
reactos/lib/cpl/desk/appearance.c
reactos/lib/cpl/desk/background.c
reactos/lib/cpl/desk/classinst.c [new file with mode: 0644]
reactos/lib/cpl/desk/desk.c
reactos/lib/cpl/desk/desk.def
reactos/lib/cpl/desk/desk.h
reactos/lib/cpl/desk/desk.xml
reactos/lib/cpl/desk/dibitmap.c
reactos/lib/cpl/desk/dibitmap.h [deleted file]
reactos/lib/cpl/desk/screensaver.c
reactos/lib/cpl/desk/settings.c
reactos/media/inf/display.inf [new file with mode: 0644]
reactos/media/inf/inf.xml
reactos/media/inf/syssetup.inf

index d0ee084..b75f8d2 100755 (executable)
@@ -293,6 +293,7 @@ media\nls\c_28599.nls                   1
 media\drivers\etc\services              5
 media\inf\acpi.inf                      6
 media\inf\cdrom.inf                     6
+media\inf\display.inf                   6
 media\inf\hdc.inf                       6
 media\inf\layout.inf                    6
 media\inf\machine.inf                   6
index ca0d761..4c02abe 100644 (file)
@@ -8,10 +8,7 @@
  * PROGRAMMERS:     Trevor McCort (lycan359@gmail.com)
  */
 
-#include <windows.h>
-#include <commctrl.h>
-
-#include "resource.h"
+#include "desk.h"
 
 INT_PTR CALLBACK AppearancePageProc(HWND hwndDlg,
                                     UINT uMsg,
index 9862f53..f43c381 100644 (file)
@@ -8,16 +8,7 @@
  * PROGRAMMERS:     Trevor McCort (lycan359@gmail.com)
  */
 
-#include <windows.h>
-#include <commctrl.h>
-#include <commdlg.h>
-#include <cpl.h>
-#include <tchar.h>
-
-#include "resource.h"
-
 #include "desk.h"
-#include "dibitmap.h"
 
 #define MAX_BACKGROUNDS     100
 
diff --git a/reactos/lib/cpl/desk/classinst.c b/reactos/lib/cpl/desk/classinst.c
new file mode 100644 (file)
index 0000000..a1867c1
--- /dev/null
@@ -0,0 +1,177 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS Plug & Play
+ * FILE:            lib/cpl/desk/classinst.c
+ * PURPOSE:         Display class installer
+ *
+ * PROGRAMMERS:     Hervé Poussineau (hpoussin@reactos.org)
+ */
+
+//#define NDEBUG
+#include <debug.h>
+
+#include "desk.h"
+
+DWORD WINAPI
+DisplayClassInstaller(
+       IN DI_FUNCTION InstallFunction,
+       IN HDEVINFO DeviceInfoSet,
+       IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL)
+{
+       SP_DEVINSTALL_PARAMS InstallParams;
+       SP_DRVINFO_DATA DriverInfoData;
+       HINF hInf = INVALID_HANDLE_VALUE;
+       TCHAR SectionName[MAX_PATH];
+       TCHAR ServiceName[MAX_SERVICE_NAME_LEN];
+       SP_DRVINFO_DETAIL_DATA DriverInfoDetailData;
+       HKEY hServicesKey = INVALID_HANDLE_VALUE;
+       HKEY hServiceKey = INVALID_HANDLE_VALUE;
+       HKEY hDeviceSubKey = INVALID_HANDLE_VALUE;
+       DWORD disposition;
+       BOOL result;
+       LONG rc;
+
+       if (InstallFunction != DIF_INSTALLDEVICE)
+               return ERROR_DI_DO_DEFAULT;
+
+       InstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS);
+       result = SetupDiGetDeviceInstallParams(DeviceInfoSet, DeviceInfoData, &InstallParams);
+       if (!result)
+       {
+               rc = GetLastError();
+               DPRINT("SetupDiGetDeviceInstallParams() failed with error 0x%lx\n", rc);
+               goto cleanup;
+       }
+
+       InstallParams.Flags |= DI_NEEDRESTART;
+
+       result = SetupDiSetDeviceInstallParams(DeviceInfoSet, DeviceInfoData, &InstallParams);
+       if (!result)
+       {
+               rc = GetLastError();
+               DPRINT("SetupDiSetDeviceInstallParams() failed with error 0x%lx\n", rc);
+               goto cleanup;
+       }
+
+       DriverInfoData.cbSize = sizeof(SP_DRVINFO_DATA);
+       result = SetupDiGetSelectedDriver(DeviceInfoSet, DeviceInfoData, &DriverInfoData);
+       if (!result)
+       {
+               rc = GetLastError();
+               DPRINT("SetupDiGetSelectedDriver() failed with error 0x%lx\n", rc);
+               goto cleanup;
+       }
+
+       DriverInfoDetailData.cbSize = sizeof(SP_DRVINFO_DETAIL_DATA);
+       result = SetupDiGetDriverInfoDetail(
+               DeviceInfoSet, DeviceInfoData,
+               &DriverInfoData, &DriverInfoDetailData,
+               sizeof(SP_DRVINFO_DETAIL_DATA), NULL);
+       if (!result && GetLastError() != ERROR_INSUFFICIENT_BUFFER)
+       {
+               rc = GetLastError();
+               DPRINT("SetupDiGetDriverInfoDetail() failed with error 0x%lx\n", rc);
+               goto cleanup;
+       }
+
+       hInf = SetupOpenInfFile(DriverInfoDetailData.InfFileName, NULL, INF_STYLE_WIN4, NULL);
+       if (hInf == INVALID_HANDLE_VALUE)
+       {
+               rc = GetLastError();
+               DPRINT("SetupOpenInfFile() failed with error 0x%lx\n", rc);
+               goto cleanup;
+       }
+
+       result = SetupDiGetActualSectionToInstall(
+               hInf, DriverInfoDetailData.SectionName,
+               SectionName, MAX_PATH - _tcslen(_T(".SoftwareSettings")), NULL, NULL);
+       if (!result)
+       {
+               rc = GetLastError();
+               DPRINT("SetupDiGetActualSectionToInstall() failed with error 0x%lx\n", rc);
+               goto cleanup;
+       }
+       _tcscat(SectionName, _T(".SoftwareSettings"));
+
+       result = SetupDiInstallDevice(DeviceInfoSet, DeviceInfoData);
+       if (!result)
+       {
+               rc = GetLastError();
+               DPRINT("SetupDiGetDeviceRegistryProperty() failed with error 0x%lx\n", rc);
+               goto cleanup;
+       }
+
+       result = SetupDiGetDeviceRegistryProperty(
+               DeviceInfoSet, DeviceInfoData,
+               SPDRP_SERVICE, NULL,
+               (PBYTE)ServiceName, MAX_SERVICE_NAME_LEN * sizeof(TCHAR), NULL);
+       if (!result)
+       {
+               rc = GetLastError();
+               DPRINT("SetupDiGetDeviceRegistryProperty() failed with error 0x%lx\n", rc);
+               goto cleanup;
+       }
+
+       rc = RegOpenKeyEx(
+               HKEY_LOCAL_MACHINE, _T("SYSTEM\\CurrentControlSet\\Services"),
+               0, KEY_ENUMERATE_SUB_KEYS, &hServicesKey);
+       if (rc != ERROR_SUCCESS)
+       {
+               DPRINT("RegOpenKeyEx() failed with error 0x%lx\n", rc);
+               goto cleanup;
+       }
+       rc = RegOpenKeyEx(
+               hServicesKey, ServiceName,
+               0, KEY_CREATE_SUB_KEY, &hServiceKey);
+       if (rc != ERROR_SUCCESS)
+       {
+               DPRINT("RegOpenKeyEx() failed with error 0x%lx\n", rc);
+               goto cleanup;
+       }
+
+       /* Create a Device0 subkey (FIXME: do a loop to find a free number?) */
+       rc = RegCreateKeyEx(
+               hServiceKey, _T("Device0"), 0, NULL,
+               REG_OPTION_NON_VOLATILE, KEY_SET_VALUE, NULL,
+               &hDeviceSubKey, &disposition);
+       if (rc != ERROR_SUCCESS)
+       {
+               DPRINT("RegCreateKeyEx() failed with error 0x%lx\n", rc);
+               goto cleanup;
+       }
+       if (disposition != REG_CREATED_NEW_KEY)
+       {
+               rc = ERROR_GEN_FAILURE;
+               DPRINT("RegCreateKeyEx() failed\n");
+               goto cleanup;
+       }
+
+       /* Install SoftwareSettings section */
+       result = SetupInstallFromInfSection(
+               InstallParams.hwndParent, hInf, SectionName,
+               SPINST_REGISTRY, hDeviceSubKey,
+               NULL, 0, NULL, NULL,
+               NULL, NULL);
+       if (!result)
+       {
+               rc = GetLastError();
+               DPRINT("SetupInstallFromInfSection() failed with error 0x%lx\n", rc);
+               goto cleanup;
+       }
+
+       /* FIXME: install OpenGLSoftwareSettings section */
+
+       rc = ERROR_SUCCESS;
+
+cleanup:
+       if (hInf != INVALID_HANDLE_VALUE)
+               SetupCloseInfFile(hInf);
+       if (hServicesKey != INVALID_HANDLE_VALUE)
+               RegCloseKey(hServicesKey);
+       if (hServiceKey != INVALID_HANDLE_VALUE)
+               RegCloseKey(hServiceKey);
+       if (hDeviceSubKey != INVALID_HANDLE_VALUE)
+               RegCloseKey(hDeviceSubKey);
+
+       return rc;
+}
index d64825c..6a8ef5a 100644 (file)
@@ -8,11 +8,6 @@
  * PROGRAMMERS:     Trevor McCort (lycan359@gmail.com)
  */
 
-#include <windows.h>
-#include <commctrl.h>
-#include <cpl.h>
-
-#include "resource.h"
 #include "desk.h"
 
 #define NUM_APPLETS    (1)
index e354780..b060f7f 100644 (file)
@@ -2,5 +2,6 @@ LIBRARY desk.cpl
 
 EXPORTS
 CPlApplet@16
+DisplayClassInstaller@12
 
 ; EOF
index eb600d8..1c6973e 100644 (file)
@@ -1,6 +1,16 @@
 #ifndef __CPL_DESK_H__
 #define __CPL_DESK_H__
 
+#include <windows.h>
+#include <commctrl.h>
+#include <commdlg.h>
+#include <cpl.h>
+#include <tchar.h>
+#include <setupapi.h>
+#include <stdio.h>
+
+#include "resource.h"
+
 typedef struct
 {
     int idIcon;
@@ -13,5 +23,21 @@ typedef struct
 
 extern HINSTANCE hApplet;
 
+typedef struct
+{
+    BITMAPFILEHEADER *header;
+    BITMAPINFO       *info;
+    BYTE             *bits;
+    
+    int               width;
+    int               height;
+
+} DIBitmap;
+
+extern DIBitmap *DibLoadImage(TCHAR *filename);
+extern void DibFreeImage(DIBitmap *bitmap);
+
+DWORD DbgPrint(PCH Format,...);
+
 #endif /* __CPL_DESK_H__ */
 
index b5b2cde..73ff982 100644 (file)
        <library>gdi32</library>
        <library>comctl32</library>
        <library>comdlg32</library>
+       <library>setupapi</library>
        <library>shell32</library>
-       <file>desk.c</file>           
+       <library>ntdll</library>
+       <file>classinst.c</file>
+       <file>desk.c</file>
        <file>background.c</file>
        <file>screensaver.c</file>
        <file>appearance.c</file>
        <file>settings.c</file>
-       <file>dibitmap.c</file>      
-      <file>desk.rc</file>           
-
+       <file>dibitmap.c</file>
+       <file>desk.rc</file>
 </module>
index 661c58e..001333e 100644 (file)
@@ -8,7 +8,7 @@
  * PROGRAMMERS:     Trevor McCort (lycan359@gmail.com)
  */
 
-#include "dibitmap.h"
+#include "desk.h"
 
 DIBitmap *DibLoadImage(TCHAR *filename)
 {
diff --git a/reactos/lib/cpl/desk/dibitmap.h b/reactos/lib/cpl/desk/dibitmap.h
deleted file mode 100644 (file)
index cb5b0ab..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-
-#ifndef __DIBITMAP_H__
-#define __DIBITMAP_H__
-
-#include <windows.h>
-
-typedef struct
-{
-    BITMAPFILEHEADER *header;
-    BITMAPINFO       *info;
-    BYTE             *bits;
-    
-    int               width;
-    int               height;
-
-} DIBitmap;
-
-extern DIBitmap *DibLoadImage(TCHAR *filename);
-extern void DibFreeImage(DIBitmap *bitmap);
-
-#endif /* __DIBITMAP_H__ */
-
index d97a8fb..8eada73 100644 (file)
@@ -8,12 +8,6 @@
  * PROGRAMMERS:     Trevor McCort (lycan359@gmail.com)
  */
 
-#include <windows.h>
-#include <commctrl.h>
-
-#include "resource.h"
-#include <cpl.h>
-#include <tchar.h>
 #include "desk.h"
 
 #define MAX_SCREENSAVERS 100
index 7d9afb7..3f0925e 100644 (file)
@@ -9,13 +9,6 @@
  *                  Hervé Poussineau (poussine@freesurf.fr)
  */
 
-#include <windows.h>
-#include <commctrl.h>
-#include <stdio.h>
-#include <tchar.h>
-#include <cpl.h>
-
-#include "resource.h"
 #include "desk.h"
 
 /* As slider control can't contain user data, we have to keep an
diff --git a/reactos/media/inf/display.inf b/reactos/media/inf/display.inf
new file mode 100644 (file)
index 0000000..9fb5d23
--- /dev/null
@@ -0,0 +1,25 @@
+; Display.INF\r
+;\r
+; Installation file for the Display class\r
+;\r
+[Version]\r
+Signature  = "$Windows NT$"\r
+;Signature  = "$ReactOS$"\r
+LayoutFile = layout.inf\r
+\r
+Class      = Display\r
+ClassGUID  = {4d36e968-e325-11ce-bfc1-08002be10318}\r
+Provider   = %ReactOS%\r
+DriverVer  = 10/18/2005,1.00\r
+\r
+[ClassInstall32.NT]\r
+AddReg = DisplayClass.NT.AddReg\r
+\r
+[DisplayClass.NT.AddReg]\r
+HKR, , ,                0, %DisplayClassName%\r
+HKR, , Icon,            0, "-1"\r
+HKR, , Installer32,     0, "desk.cpl,DisplayClassInstaller"\r
+\r
+[Strings]\r
+ReactOS = "ReactOS Team"\r
+DisplayClassName = "Display Adapters"\r
index 1d2b927..8da98e8 100644 (file)
@@ -1,6 +1,7 @@
 <group>
 <installfile base="inf">acpi.inf</installfile>
 <installfile base="inf">cdrom.inf</installfile>
+<installfile base="inf">display.inf</installfile>
 <installfile base="inf">hdc.inf</installfile>
 <installfile base="inf">layout.inf</installfile>
 <installfile base="inf">machine.inf</installfile>
index e987cd8..371ca8a 100644 (file)
@@ -15,6 +15,7 @@ ClassGUID={00000000-0000-0000-0000-000000000000}
 ; MS uses netnovel.inf as class-installer INF for NICs
 ; we use a separate one to keep things clean
 cdrom.inf
+display.inf
 hdc.inf
 machine.inf
 mouse.inf