[COMCTL32] Sync with Wine Staging 2.9. CORE-13362
[reactos.git] / reactos / dll / win32 / comctl32 / propsheet.c
index 5965282..39e9d9a 100644 (file)
@@ -2973,11 +2973,25 @@ static LPWSTR load_string( HINSTANCE instance, LPCWSTR str )
 HPROPSHEETPAGE WINAPI CreatePropertySheetPageA(
                           LPCPROPSHEETPAGEA lpPropSheetPage)
 {
-  PROPSHEETPAGEW* ppsp = Alloc(sizeof(PROPSHEETPAGEW));
+    PROPSHEETPAGEW *ppsp;
 
-  memcpy(ppsp,lpPropSheetPage,min(lpPropSheetPage->dwSize,sizeof(PROPSHEETPAGEA)));
+    if (lpPropSheetPage->dwSize < PROPSHEETPAGEA_V1_SIZE)
+        return NULL;
 
-  ppsp->dwFlags &= ~ PSP_INTERNAL_UNICODE;
+    /* original data is used for callback notifications */
+    if ((lpPropSheetPage->dwFlags & PSP_USECALLBACK) && lpPropSheetPage->pfnCallback)
+    {
+        ppsp = Alloc(2 * sizeof(*ppsp));
+        memcpy(ppsp, lpPropSheetPage, min(lpPropSheetPage->dwSize, sizeof(PROPSHEETPAGEA)));
+        memcpy(ppsp + 1, lpPropSheetPage, min(lpPropSheetPage->dwSize, sizeof(PROPSHEETPAGEA)));
+    }
+    else
+    {
+        ppsp = Alloc(sizeof(*ppsp));
+        memcpy(ppsp, lpPropSheetPage, min(lpPropSheetPage->dwSize, sizeof(PROPSHEETPAGEA)));
+    }
+
+    ppsp->dwFlags &= ~PSP_INTERNAL_UNICODE;
 
     if ( !(ppsp->dwFlags & PSP_DLGINDIRECT) )
     {
@@ -3029,8 +3043,8 @@ HPROPSHEETPAGE WINAPI CreatePropertySheetPageA(
     else
         ppsp->pszHeaderSubTitle = NULL;
 
-    if ((ppsp->dwFlags & PSH_USECALLBACK) && ppsp->pfnCallback)
-        ppsp->pfnCallback(0, PSPCB_ADDREF, ppsp);
+    if ((ppsp->dwFlags & PSP_USECALLBACK) && ppsp->dwSize > PROPSHEETPAGEA_V1_SIZE && ppsp->pfnCallback)
+        ppsp->pfnCallback(0, PSPCB_ADDREF, ppsp + 1);
 
     return (HPROPSHEETPAGE)ppsp;
 }
@@ -3042,11 +3056,25 @@ HPROPSHEETPAGE WINAPI CreatePropertySheetPageA(
  */
 HPROPSHEETPAGE WINAPI CreatePropertySheetPageW(LPCPROPSHEETPAGEW lpPropSheetPage)
 {
-  PROPSHEETPAGEW* ppsp = Alloc(sizeof(PROPSHEETPAGEW));
+    PROPSHEETPAGEW *ppsp;
 
-  memcpy(ppsp,lpPropSheetPage,min(lpPropSheetPage->dwSize,sizeof(PROPSHEETPAGEW)));
+    if (lpPropSheetPage->dwSize < PROPSHEETPAGEW_V1_SIZE)
+        return NULL;
+
+    /* original data is used for callback notifications */
+    if ((lpPropSheetPage->dwFlags & PSP_USECALLBACK) && lpPropSheetPage->pfnCallback)
+    {
+        ppsp = Alloc(2 * sizeof(*ppsp));
+        memcpy(ppsp, lpPropSheetPage, min(lpPropSheetPage->dwSize, sizeof(PROPSHEETPAGEW)));
+        memcpy(ppsp + 1, lpPropSheetPage, min(lpPropSheetPage->dwSize, sizeof(PROPSHEETPAGEW)));
+    }
+    else
+    {
+        ppsp = Alloc(sizeof(*ppsp));
+        memcpy(ppsp, lpPropSheetPage, min(lpPropSheetPage->dwSize, sizeof(PROPSHEETPAGEW)));
+    }
 
-  ppsp->dwFlags |= PSP_INTERNAL_UNICODE;
+    ppsp->dwFlags |= PSP_INTERNAL_UNICODE;
 
     if ( !(ppsp->dwFlags & PSP_DLGINDIRECT) )
     {
@@ -3078,8 +3106,8 @@ HPROPSHEETPAGE WINAPI CreatePropertySheetPageW(LPCPROPSHEETPAGEW lpPropSheetPage
     else
         ppsp->pszHeaderSubTitle = NULL;
 
-    if ((ppsp->dwFlags & PSH_USECALLBACK) && ppsp->pfnCallback)
-        ppsp->pfnCallback(0, PSPCB_ADDREF, ppsp);
+    if ((ppsp->dwFlags & PSP_USECALLBACK) && ppsp->dwSize > PROPSHEETPAGEW_V1_SIZE && ppsp->pfnCallback)
+        ppsp->pfnCallback(0, PSPCB_ADDREF, ppsp + 1);
 
     return (HPROPSHEETPAGE)ppsp;
 }
@@ -3102,8 +3130,8 @@ BOOL WINAPI DestroyPropertySheetPage(HPROPSHEETPAGE hPropPage)
   if (!psp)
      return FALSE;
 
-  if ((psp->dwFlags & PSH_USECALLBACK) && psp->pfnCallback)
-     psp->pfnCallback(0, PSPCB_RELEASE, psp);
+  if ((psp->dwFlags & PSP_USECALLBACK) && psp->pfnCallback)
+     psp->pfnCallback(0, PSPCB_RELEASE, psp + 1);
 
   if (!(psp->dwFlags & PSP_DLGINDIRECT) && !IS_INTRESOURCE( psp->u.pszTemplate ))
      Free ((LPVOID)psp->u.pszTemplate);
@@ -3393,7 +3421,7 @@ static LRESULT PROPSHEET_Paint(HWND hwnd, HDC hdcParam)
         (psInfo->ppshheader.dwFlags & (PSH_WIZARD97_OLD | PSH_WIZARD97_NEW)) &&
 #ifdef __REACTOS__
         (psInfo->ppshheader.dwFlags & PSH_WATERMARK) &&
-     (psInfo->ppshheader.u4.hbmWatermark) ) 
+        (psInfo->ppshheader.u4.hbmWatermark) ) 
 #else
         (psInfo->ppshheader.dwFlags & PSH_WATERMARK) ) 
 #endif