레지스트리 감시
http://msdn.microsoft.com/en-us/library/ms724892(VS.85).aspx
레지스트리의 특정 키값을 변경을 통지 받을 수 있다.
LONG WINAPI RegNotifyChangeKeyValue( __in HKEY hKey, __in BOOL bWatchSubtree, __in DWORD dwNotifyFilter, __in_opt HANDLE hEvent, __in BOOL fAsynchronous ); |
아래는 Thread에서 특정 Registry Key를 감시하는 샘플이다.
int MonitoringRegChange( WCHAR *pwKey ) { DWORD dwFilter = REG_NOTIFY_CHANGE_NAME | REG_NOTIFY_CHANGE_LAST_SET; HKEY hKey = NULL; LONG lErrorCode = ::RegOpenKeyEx( HKEY_CURRENT_USER, pwKey, 0, KEY_NOTIFY, &hKey); if ( lErrorCode != ERROR_SUCCESS ) { if ( lErrorCode != ERROR_FILE_NOT_FOUND ) { return -1; } lErrorCode = RegCreateKeyEx( HKEY_CURRENT_USER, pwKey, 0, NULL, 0, KEY_NOTIFY, NULL, &hKey, NULL) ; if ( lErrorCode != ERROR_SUCCESS ) { return -1; } } HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (hEvent == NULL) { CloseHandle(hEvent); RegCloseKey(hKey); return -1; } HANDLE hEvents[2]; hEvents[0] = m_hExitEvent; hEvents[1] = hEvent; while( TRUE ) { lErrorCode = RegNotifyChangeKeyValue( hKey, TRUE, dwFilter, hEvent, TRUE ); if (lErrorCode != ERROR_SUCCESS) // Reg감시중, key삭제되는경우의복구루틴 { RegCloseKey(hKey); if ( lErrorCode != ERROR_KEY_DELETED ) { return -1; } lErrorCode = RegCreateKeyEx( HKEY_CURRENT_USER, pwKey, 0, NULL, 0, KEY_NOTIFY, NULL, &hKey, NULL) ; if ( lErrorCode != ERROR_SUCCESS ) { return -1; } // Detect Registry Changed – Key is Deleted continue; } if ( WaitForSingleObject( hEvent, 0 ) == WAIT_OBJECT_0 ) { // 첫번째 RegNotifyChangeKeyValue() Call과두번째 RegNotifyChangeKeyValue() // Call사이에 변경이있을경우, Envent가 바로활성화되어, // 한번의 레지스트리 변경에 대해 두번의 noty를받게되는 문제 Fix // http://support.microsoft.com/kb/236570/en-us lErrorCode = RegNotifyChangeKeyValue( hKey, TRUE, dwFilter, hEvent, TRUE ); if (lErrorCode != ERROR_SUCCESS) { CloseHandle(hEvent); RegCloseKey(hKey); return -1; } } DWORD dwResult = ::WaitForMultipleObjects( 2, hEvents, FALSE, INFINITE ); if ( dwResult == WAIT_FAILED ) { CloseHandle(hEvent); RegCloseKey(hKey); return -1; } else if ( dwResult == WAIT_OBJECT_0 ) { // recevie Stop monitoring noty return 0; } else if ( dwResult == WAIT_OBJECT_0 + 1 ) { // Detect Registry Changed continue; } } CloseHandle(hEvent); RegCloseKey(hKey); return 0; } |
'Windows Programming' 카테고리의 다른 글
Thread별로 관리되는 혹은 초기화 해주어야 하는 것들 (0) | 2010.04.01 |
---|---|
Shell_NotifyIcon, NOTIFYICONDATA struct Size (1) | 2010.03.03 |
Url parsing (0) | 2010.02.05 |
Visual Studio 소스편집창 분할하기 (0) | 2009.08.05 |
API Hooking - 2. PE File Format (0) | 2009.07.31 |