Skip to content

Commit 7726948

Browse files
authored
Merge pull request #93 from katahiromz/copilot/fix-freeze-in-destroypropertysheetpage
Fix ntdll!RtlFreeHeap freeze: correct WM_INITDIALOG lParam extraction for property sheet pages
2 parents e744514 + 7c7dceb commit 7726948

1 file changed

Lines changed: 27 additions & 3 deletions

File tree

GUI.cpp

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4914,6 +4914,30 @@ HWND xg_ahSyncedDialogs[I_SYNCED_MAX] = { 0 };
49144914
#include "XgDictList.cpp"
49154915
#include "XG_HiddenDialog.cpp"
49164916

4917+
// プロパティシートページ用ダイアログプロシージャーのラッパー。
4918+
// プロパティシートページでは WM_INITDIALOG の lParam は PROPSHEETPAGEW* であるため、
4919+
// ダイアログオブジェクトのポインターを PROPSHEETPAGEW::lParam から正しく取得する。
4920+
static INT_PTR CALLBACK XgSettingsPageProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
4921+
{
4922+
if (uMsg == WM_INITDIALOG)
4923+
lParam = reinterpret_cast<PROPSHEETPAGEW*>(lParam)->lParam;
4924+
return XG_SettingsDialog::DialogProc(hwnd, uMsg, wParam, lParam);
4925+
}
4926+
4927+
static INT_PTR CALLBACK XgRulePresetPageProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
4928+
{
4929+
if (uMsg == WM_INITDIALOG)
4930+
lParam = reinterpret_cast<PROPSHEETPAGEW*>(lParam)->lParam;
4931+
return XG_RulePresetDialog::DialogProc(hwnd, uMsg, wParam, lParam);
4932+
}
4933+
4934+
static INT_PTR CALLBACK XgHiddenPageProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
4935+
{
4936+
if (uMsg == WM_INITDIALOG)
4937+
lParam = reinterpret_cast<PROPSHEETPAGEW*>(lParam)->lParam;
4938+
return XG_HiddenDialog::DialogProc(hwnd, uMsg, wParam, lParam);
4939+
}
4940+
49174941
// 全般設定。
49184942
void XgGeneralSettings(HWND hwnd, DWORD nStartPage = I_SYNCED_FILE_SETTINGS)
49194943
{
@@ -4943,7 +4967,7 @@ void XgGeneralSettings(HWND hwnd, DWORD nStartPage = I_SYNCED_FILE_SETTINGS)
49434967
// 「見た目の設定」。
49444968
XG_SettingsDialog dialog1;
49454969
psp.pszTemplate = MAKEINTRESOURCEW(IDD_CONFIG);
4946-
psp.pfnDlgProc = XG_SettingsDialog::DialogProc;
4970+
psp.pfnDlgProc = XgSettingsPageProc;
49474971
psp.dwFlags = PSP_DEFAULT;
49484972
psp.hInstance = xg_hInstance;
49494973
psp.lParam = (LPARAM)&dialog1;
@@ -4952,7 +4976,7 @@ void XgGeneralSettings(HWND hwnd, DWORD nStartPage = I_SYNCED_FILE_SETTINGS)
49524976
// 「ルール」設定。
49534977
XG_RulePresetDialog dialog2;
49544978
psp.pszTemplate = MAKEINTRESOURCEW(IDD_RULEPRESET);
4955-
psp.pfnDlgProc = XG_RulePresetDialog::DialogProc;
4979+
psp.pfnDlgProc = XgRulePresetPageProc;
49564980
psp.dwFlags = PSP_DEFAULT;
49574981
psp.hInstance = xg_hInstance;
49584982
psp.lParam = (LPARAM)&dialog2;
@@ -4977,7 +5001,7 @@ void XgGeneralSettings(HWND hwnd, DWORD nStartPage = I_SYNCED_FILE_SETTINGS)
49775001
// 「上級者向け」設定。
49785002
XG_HiddenDialog dialog3;
49795003
psp.pszTemplate = MAKEINTRESOURCEW(IDD_HIDDEN);
4980-
psp.pfnDlgProc = XG_HiddenDialog::DialogProc;
5004+
psp.pfnDlgProc = XgHiddenPageProc;
49815005
psp.dwFlags = PSP_DEFAULT;
49825006
psp.hInstance = xg_hInstance;
49835007
psp.lParam = (LPARAM)&dialog3;

0 commit comments

Comments
 (0)