- SetupDiGetClassDevPropertySheetsW: Improve the way property sheet pages are added to a property sheet. This change enables us to retrieve the number of property sheet pages provided by a property sheet provider without leaking property sheets.
svn path=/trunk/; revision=51959
struct ClassDevPropertySheetsData
{
struct ClassDevPropertySheetsData
{
- HPROPSHEETPAGE *PropertySheetPages;
- DWORD MaximumNumberOfPages;
+ LPPROPSHEETHEADERW PropertySheetHeader;
+ DWORD PropertySheetHeaderPageListSize;
PropPageData = (struct ClassDevPropertySheetsData *)lParam;
PropPageData = (struct ClassDevPropertySheetsData *)lParam;
- if (PropPageData->NumberOfPages < PropPageData->MaximumNumberOfPages)
+ PropPageData->NumberOfPages++;
+
+ if (PropPageData->PropertySheetHeader->nPages < PropPageData->PropertySheetHeaderPageListSize)
- *PropPageData->PropertySheetPages = hPropSheetPage;
- PropPageData->PropertySheetPages++;
+ PropPageData->PropertySheetHeader->phpage[PropPageData->PropertySheetHeader->nPages] = hPropSheetPage;
+ PropPageData->PropertySheetHeader->nPages++;
+ return TRUE;
- PropPageData->NumberOfPages++;
- return TRUE;
+ return PropPageData->DontCancel;
}
/***********************************************************************
}
/***********************************************************************
PROPERTY_PAGE_PROVIDER pPropPageProvider = NULL;
struct ClassDevPropertySheetsData PropPageData;
DWORD dwLength, dwRegType;
PROPERTY_PAGE_PROVIDER pPropPageProvider = NULL;
struct ClassDevPropertySheetsData PropPageData;
DWORD dwLength, dwRegType;
+ DWORD InitialNumberOfPages;
DWORD rc;
if (DeviceInfoData)
DWORD rc;
if (DeviceInfoData)
+ InitialNumberOfPages = PropertySheetHeader->nPages;
+
Request.cbSize = sizeof(SP_PROPSHEETPAGE_REQUEST);
Request.PageRequested = SPPSR_ENUM_ADV_DEVICE_PROPERTIES;
Request.DeviceInfoSet = DeviceInfoSet;
Request.DeviceInfoData = DeviceInfoData;
Request.cbSize = sizeof(SP_PROPSHEETPAGE_REQUEST);
Request.PageRequested = SPPSR_ENUM_ADV_DEVICE_PROPERTIES;
Request.DeviceInfoSet = DeviceInfoSet;
Request.DeviceInfoData = DeviceInfoData;
- PropPageData.PropertySheetPages = &PropertySheetHeader->phpage[PropertySheetHeader->nPages];
- PropPageData.MaximumNumberOfPages = PropertySheetHeaderPageListSize - PropertySheetHeader->nPages;
+
+ PropPageData.PropertySheetHeader = PropertySheetHeader;
+ PropPageData.PropertySheetHeaderPageListSize = PropertySheetHeaderPageListSize;
PropPageData.NumberOfPages = 0;
PropPageData.NumberOfPages = 0;
- ret = pPropPageProvider(&Request, SETUP_GetClassDevPropertySheetsCallback, (LPARAM)&PropPageData);
- if (!ret)
- goto cleanup;
+ PropPageData.DontCancel = (RequiredSize != NULL) ? TRUE : FALSE;
+
+ pPropPageProvider(&Request, SETUP_GetClassDevPropertySheetsCallback, (LPARAM)&PropPageData);
- *RequiredSize = PropPageData.NumberOfPages + PropertySheetHeader->nPages;
- if (PropPageData.NumberOfPages <= PropPageData.MaximumNumberOfPages)
+ *RequiredSize = PropPageData.NumberOfPages;
+
+ if (InitialNumberOfPages + PropPageData.NumberOfPages <= PropertySheetHeaderPageListSize)
- PropertySheetHeader->nPages += PropPageData.NumberOfPages;
- PropertySheetHeader->nPages += PropPageData.MaximumNumberOfPages;
SetLastError(ERROR_INSUFFICIENT_BUFFER);
}
SetLastError(ERROR_INSUFFICIENT_BUFFER);
}