VOID WINAPI RegistryEventCallback( PEVENT_TRACE pEvent ) { if(!CheckCurrentProcess( (DWORD)pEvent->Header.ThreadId ) ) return; if( pEvent->Header.Flags & WNODE_FLAG_USE_MOF_PTR != WNODE_FLAG_USE_MOF_PTR ) return; LPTSTR szName = NULL; switch( pEvent->Header.Class.Type ) { case EVENT_TRACE_TYPE_REGCREATE: szName = «EVENT_TRACE_TYPE_REGCREATE»; break; case EVENT_TRACE_TYPE_REGDELETE: szName = «EVENT_TRACE_TYPE_REGDELETE»; break; ... case EVENT_TRACE_TYPE_REGSETVALUE: szName = «EVENT_TRACE_TYPE_REGSETVALUE»; break; } if( szName != NULL ) { DWORD dwOSVersion = GetWindowsVersion(); DWORD dwStatus = 0; LPWSTR wszKey = NULL; HANDLE hKey = NULL; if( dwOSVersion != WIN_VERSION_NONE ) { printf( «Event : %s »,szName ); switch( dwOSVersion ) { case WIN_VERSION_WIN2K: dwStatus = ((LPMOF_REGISTRY_2K)(pEvent->MofData))->dwStatus; wszKey = ((LPMOF_REGISTRY_2K)(pEvent->MofData))->wszKeyName; hKey = ((LPMOF_REGISTRY_2K)(pEvent->MofData))->hKey; break; case WIN_VERSION_WINXP: case WIN_VERSION_WINSRV2003: dwStatus = ((LPMOF_REGISTRY_XP)(pEvent->MofData))->dwStatus; wszKey = ((LPMOF_REGISTRY_XP)(pEvent->MofData))->wszKeyName; hKey = ((LPMOF_REGISTRY_XP)(pEvent->MofData))->hKey; break; } if( wcslen( wszKey ) > 0 ) wprintf( L» Status: %d Key: % s »,dwStatus,wszKey ); else wprintf( L» Status: %d Handle: %d »,dwStatus,hKey ); } } }