Huw Davies : hhctrl: Fix loading of the wintype data on 64-bit.

Alexandre Julliard julliard at winehq.org
Fri Jan 19 15:43:20 CST 2018


Module: wine
Branch: master
Commit: dcd96f5f7a4e40d2ec7f0d6db766a022a856d68b
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=dcd96f5f7a4e40d2ec7f0d6db766a022a856d68b

Author: Huw Davies <huw at codeweavers.com>
Date:   Fri Jan 19 08:41:32 2018 +0000

hhctrl: Fix loading of the wintype data on 64-bit.

Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/hhctrl.ocx/chm.c | 88 +++++++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 74 insertions(+), 14 deletions(-)

diff --git a/dlls/hhctrl.ocx/chm.c b/dlls/hhctrl.ocx/chm.c
index 39c1eca..8cf2539 100644
--- a/dlls/hhctrl.ocx/chm.c
+++ b/dlls/hhctrl.ocx/chm.c
@@ -353,6 +353,52 @@ BOOL LoadWinTypeFromCHM(HHInfo *info)
     static const WCHAR index_extW[] = {'h','h','k',0};
     static const WCHAR windowsW[] = {'#','W','I','N','D','O','W','S',0};
 
+    /* HH_WINTYPE as stored on disk.  It's identical to HH_WINTYPE except that the pointer fields
+       have been changed to DWORDs, so that the layout on 64-bit remains unchanged. */
+    struct file_wintype
+    {
+        int          cbStruct;
+        BOOL         fUniCodeStrings;
+        DWORD        pszType;
+        DWORD        fsValidMembers;
+        DWORD        fsWinProperties;
+        DWORD        pszCaption;
+        DWORD        dwStyles;
+        DWORD        dwExStyles;
+        RECT         rcWindowPos;
+        int          nShowState;
+        DWORD        hwndHelp;
+        DWORD        hwndCaller;
+        DWORD        paInfoTypes;
+        DWORD        hwndToolBar;
+        DWORD        hwndNavigation;
+        DWORD        hwndHTML;
+        int          iNavWidth;
+        RECT         rcHTML;
+        DWORD        pszToc;
+        DWORD        pszIndex;
+        DWORD        pszFile;
+        DWORD        pszHome;
+        DWORD        fsToolBarFlags;
+        BOOL         fNotExpanded;
+        int          curNavType;
+        int          tabpos;
+        int          idNotify;
+        BYTE         tabOrder[HH_MAX_TABS+1];
+        int          cHistory;
+        DWORD        pszJump1;
+        DWORD        pszJump2;
+        DWORD        pszUrlJump1;
+        DWORD        pszUrlJump2;
+        RECT         rcMinSize;
+        int          cbInfoTypes;
+        DWORD        pszCustomTabs;
+    } file_wintype;
+
+    memset(&wintype, 0, sizeof(wintype));
+    wintype.cbStruct = sizeof(wintype);
+    wintype.fUniCodeStrings = TRUE;
+
     hr = IStorage_OpenStream(pStorage, windowsW, NULL, STGM_READ, 0, &pStream);
     if (SUCCEEDED(hr))
     {
@@ -363,28 +409,42 @@ BOOL LoadWinTypeFromCHM(HHInfo *info)
         if (FAILED(hr)) goto done;
 
         /* read the HH_WINTYPE struct data */
-        hr = IStream_Read(pStream, &wintype, sizeof(wintype), &cbRead);
+        hr = IStream_Read(pStream, &file_wintype, sizeof(file_wintype), &cbRead);
         if (FAILED(hr)) goto done;
 
         /* convert the #STRINGS offsets to actual strings */
-        wintype.pszType     = ConvertChmString(info, (DWORD)wintype.pszType);
-        wintype.pszFile     = ConvertChmString(info, (DWORD)wintype.pszFile);
-        wintype.pszToc      = ConvertChmString(info, (DWORD)wintype.pszToc);
-        wintype.pszIndex    = ConvertChmString(info, (DWORD)wintype.pszIndex);
-        wintype.pszCaption  = ConvertChmString(info, (DWORD)wintype.pszCaption);
-        wintype.pszHome     = ConvertChmString(info, (DWORD)wintype.pszHome);
-        wintype.pszJump1    = ConvertChmString(info, (DWORD)wintype.pszJump1);
-        wintype.pszJump2    = ConvertChmString(info, (DWORD)wintype.pszJump2);
-        wintype.pszUrlJump1 = ConvertChmString(info, (DWORD)wintype.pszUrlJump1);
-        wintype.pszUrlJump2 = ConvertChmString(info, (DWORD)wintype.pszUrlJump2);
+        wintype.pszType         = ConvertChmString(info, file_wintype.pszType);
+        wintype.fsValidMembers  = file_wintype.fsValidMembers;
+        wintype.fsWinProperties = file_wintype.fsWinProperties;
+        wintype.pszCaption      = ConvertChmString(info, file_wintype.pszCaption);
+        wintype.dwStyles        = file_wintype.dwStyles;
+        wintype.dwExStyles      = file_wintype.dwExStyles;
+        wintype.rcWindowPos     = file_wintype.rcWindowPos;
+        wintype.nShowState      = file_wintype.nShowState;
+        wintype.iNavWidth       = file_wintype.iNavWidth;
+        wintype.rcHTML          = file_wintype.rcHTML;
+        wintype.pszToc          = ConvertChmString(info, file_wintype.pszToc);
+        wintype.pszIndex        = ConvertChmString(info, file_wintype.pszIndex);
+        wintype.pszFile         = ConvertChmString(info, file_wintype.pszFile);
+        wintype.pszHome         = ConvertChmString(info, file_wintype.pszHome);
+        wintype.fsToolBarFlags  = file_wintype.fsToolBarFlags;
+        wintype.fNotExpanded    = file_wintype.fNotExpanded;
+        wintype.curNavType      = file_wintype.curNavType;
+        wintype.tabpos          = file_wintype.tabpos;
+        wintype.idNotify        = file_wintype.idNotify;
+        memcpy(&wintype.tabOrder, file_wintype.tabOrder, sizeof(wintype.tabOrder));
+        wintype.cHistory        = file_wintype.cHistory;
+        wintype.pszJump1        = ConvertChmString(info, file_wintype.pszJump1);
+        wintype.pszJump2        = ConvertChmString(info, file_wintype.pszJump2);
+        wintype.pszUrlJump1     = ConvertChmString(info, file_wintype.pszUrlJump1);
+        wintype.pszUrlJump2     = ConvertChmString(info, file_wintype.pszUrlJump2);
+        wintype.rcMinSize       = file_wintype.rcMinSize;
+        wintype.cbInfoTypes     = file_wintype.cbInfoTypes;
     }
     else
     {
         /* no defined window types so use (hopefully) sane defaults */
         static const WCHAR defaultwinW[] = {'d','e','f','a','u','l','t','w','i','n','\0'};
-        memset(&wintype, 0, sizeof(wintype));
-        wintype.cbStruct = sizeof(wintype);
-        wintype.fUniCodeStrings = TRUE;
         wintype.pszType    = strdupW(info->pCHMInfo->defWindow ? info->pCHMInfo->defWindow : defaultwinW);
         wintype.pszToc     = strdupW(info->pCHMInfo->defToc ? info->pCHMInfo->defToc : empty);
         wintype.pszIndex   = strdupW(empty);




More information about the wine-cvs mailing list