https://git.reactos.org/?p=reactos.git;a=commitdiff;h=4293704ecb004a673d5910322d0d132165940251
commit 4293704ecb004a673d5910322d0d132165940251 Author: Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com> AuthorDate: Tue Dec 26 15:21:39 2023 +0900 Commit: GitHub <nore...@github.com> CommitDate: Tue Dec 26 15:21:39 2023 +0900 [CTFMON] Unlink RegNotifyChangeKeyValue (#6232) Dynamic load advapi32!RegNotifyChangeKeyValue function. Output log if RegNotifyChangeKeyValue failed. CORE-19362 --- base/applications/ctfmon/CRegWatcher.cpp | 39 ++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/base/applications/ctfmon/CRegWatcher.cpp b/base/applications/ctfmon/CRegWatcher.cpp index 1905956cb91..264d4f22d65 100644 --- a/base/applications/ctfmon/CRegWatcher.cpp +++ b/base/applications/ctfmon/CRegWatcher.cpp @@ -83,6 +83,31 @@ CRegWatcher::Uninit() } } +// advapi32!RegNotifyChangeKeyValue +typedef LONG (WINAPI *FN_RegNotifyChangeKeyValue)(HKEY, BOOL, DWORD, HANDLE, BOOL); + +LONG WINAPI +DelayedRegNotifyChangeKeyValue( + HKEY hKey, + BOOL bWatchSubtree, + DWORD dwNotifyFilter, + HANDLE hEvent, + BOOL fAsynchronous) +{ + static FN_RegNotifyChangeKeyValue s_fnRegNotifyChangeKeyValue = NULL; + + if (!s_fnRegNotifyChangeKeyValue) + { + HINSTANCE hAdvApi32 = cicGetSystemModuleHandle(TEXT("advapi32.dll"), FALSE); + s_fnRegNotifyChangeKeyValue = + (FN_RegNotifyChangeKeyValue)GetProcAddress(hAdvApi32, "RegNotifyChangeKeyValue"); + if (!s_fnRegNotifyChangeKeyValue) + return ERROR_CALL_NOT_IMPLEMENTED; + } + + return s_fnRegNotifyChangeKeyValue(hKey, bWatchSubtree, dwNotifyFilter, hEvent, fAsynchronous); +} + BOOL CRegWatcher::InitEvent( _In_ SIZE_T iEvent, @@ -112,11 +137,15 @@ CRegWatcher::InitEvent( } // Start registry watching - error = ::RegNotifyChangeKeyValue(entry.hKey, - TRUE, - REG_NOTIFY_CHANGE_LAST_SET | REG_NOTIFY_CHANGE_NAME, - s_ahWatchEvents[iEvent], - TRUE); + error = DelayedRegNotifyChangeKeyValue(entry.hKey, + TRUE, + REG_NOTIFY_CHANGE_LAST_SET | REG_NOTIFY_CHANGE_NAME, + s_ahWatchEvents[iEvent], + TRUE); +#ifndef NDEBUG + if (error != ERROR_SUCCESS) + OutputDebugStringA("RegNotifyChangeKeyValue failed\n"); +#endif return error == ERROR_SUCCESS; }