Finish implementation of SetupDiGetClassDevPropertySheetsW (not tested)
Modified: trunk/reactos/lib/setupapi/devinst.c

Modified: trunk/reactos/lib/setupapi/devinst.c
--- trunk/reactos/lib/setupapi/devinst.c	2005-11-30 16:54:54 UTC (rev 19779)
+++ trunk/reactos/lib/setupapi/devinst.c	2005-11-30 17:11:43 UTC (rev 19780)
@@ -3591,11 +3591,28 @@
     return FALSE;
 }
 
+struct ClassDevPropertySheetsData
+{
+    HPROPSHEETPAGE *PropertySheetPages;
+    DWORD MaximumNumberOfPages;
+    DWORD NumberOfPages;
+};
+
 static BOOL WINAPI GetClassDevPropertySheetsCallback(
         IN HPROPSHEETPAGE hPropSheetPage,
-        LPARAM lParam)
+        IN OUT LPARAM lParam)
 {
-    FIXME("Need to add a property page!\n");
+    struct ClassDevPropertySheetsData *PropPageData;
+
+    PropPageData = (struct ClassDevPropertySheetsData *)lParam;
+
+    if (PropPageData->NumberOfPages < PropPageData->MaximumNumberOfPages)
+    {
+        *PropPageData->PropertySheetPages = hPropSheetPage;
+        PropPageData->PropertySheetPages++;
+    }
+
+    PropPageData->NumberOfPages++;
     return TRUE;
 }
 
@@ -3605,7 +3622,7 @@
 BOOL WINAPI SetupDiGetClassDevPropertySheetsW(
         IN HDEVINFO DeviceInfoSet,
         IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,
-        IN LPPROPSHEETHEADERW PropertySheetHeader,
+        IN OUT LPPROPSHEETHEADERW PropertySheetHeader,
         IN DWORD PropertySheetHeaderPageListSize,
         OUT PDWORD RequiredSize OPTIONAL,
         IN DWORD PropertySheetType)
@@ -3633,8 +3650,8 @@
         SetLastError(ERROR_INVALID_PARAMETER);
     else if (PropertySheetType != DIGCDP_FLAG_ADVANCED
           && PropertySheetType != DIGCDP_FLAG_BASIC
-          /* FIXME: && PropertySheetType != DIGCDP_FLAG_REMOTE_ADVANCED
-          && PropertySheetType != DIGCDP_FLAG_REMOTE_BASIC*/)
+          && PropertySheetType != DIGCDP_FLAG_REMOTE_ADVANCED
+          && PropertySheetType != DIGCDP_FLAG_REMOTE_BASIC)
         SetLastError(ERROR_INVALID_PARAMETER);
     else
     {
@@ -3643,6 +3660,7 @@
         LPWSTR PropPageProvider = NULL;
         HMODULE hModule = NULL;
         PROPERTY_PAGE_PROVIDER pPropPageProvider = NULL;
+        struct ClassDevPropertySheetsData PropPageData;
         DWORD dwLength, dwRegType;
         DWORD rc;
 
@@ -3696,10 +3714,25 @@
         Request.PageRequested = SPPSR_ENUM_ADV_DEVICE_PROPERTIES;
         Request.DeviceInfoSet = DeviceInfoSet;
         Request.DeviceInfoData = DeviceInfoData;
+        PropPageData.PropertySheetPages = &PropertySheetHeader->phpage[PropertySheetHeader->nPages];
+        PropPageData.MaximumNumberOfPages = PropertySheetHeaderPageListSize;
+        PropPageData.NumberOfPages = 0;
+        ret = pPropPageProvider(&Request, GetClassDevPropertySheetsCallback, (LPARAM)&PropPageData);
+        if (!ret)
+            goto cleanup;
+
         if (RequiredSize)
-            *RequiredSize = 0; /* FIXME */
-        pPropPageProvider(&Request, GetClassDevPropertySheetsCallback, (LPARAM)0);
-        ret = TRUE;
+            *RequiredSize = PropPageData.NumberOfPages;
+        if (PropPageData.NumberOfPages <= PropPageData.MaximumNumberOfPages)
+        {
+            PropertySheetHeader->nPages += PropPageData.NumberOfPages;
+            ret = TRUE;
+        }
+        else
+        {
+            PropertySheetHeader->nPages += PropPageData.MaximumNumberOfPages;
+            SetLastError(ERROR_INSUFFICIENT_BUFFER);
+        }
 
 cleanup:
         if (hKey != INVALID_HANDLE_VALUE)