#include "stdafx.h" #include <stdio.h> #include <time.h> #include <windows.h> #include <tchar.h> DWORD nCount = 0; // calculate the keys number HKEY hKey[] = { HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS, HKEY_CURRENT_CONFIG }; TCHAR *tcsKey[] = { TEXT("HEKY_CLASSES_ROOT"), TEXT("HEKY_CURRENT_USER"), TEXT("HEKY_LOCAL_MACHINE"), TEXT("HEKY_USERS"), TEXT("HEKY_CURRENT_CONFIG") }; void EnumKeyValue(HKEY hKey) { DWORD dwIndex = 0; TCHAR tcsValueName[MAX_PATH + 1]; DWORD dwValueNameLen; DWORD dwType; union { BYTE byData[800]; DWORD dwData; }data; DWORD dwDataLen; dwValueNameLen = sizeof(tcsValueName); dwDataLen = sizeof(data); memset(&data, 0, sizeof(data)); if (::RegEnumValue( hKey, dwIndex, tcsValueName, &dwValueNameLen, NULL, &dwType, data.byData, &dwDataLen ) == ERROR_SUCCESS) { do { switch(dwType) { case REG_SZ: _tprintf(TEXT("Value:/t%s/tData:/t%s/n "),tcsValueName,(LPTSTR)data.byData); break; case REG_DWORD: _tprintf(TEXT("Value:/t%s/tData:/t%ld/n "),tcsValueName,data.dwData); break; default: break; } dwIndex++; dwValueNameLen = sizeof(tcsValueName); dwDataLen = sizeof(data); memset(&data, 0, sizeof(data)); } while(::RegEnumValue( hKey, dwIndex, tcsValueName, &dwValueNameLen, NULL, &dwType, data.byData, &dwDataLen ) != ERROR_NO_MORE_ITEMS); } _tprintf(TEXT("/n")); } void EnumKey(HKEY hKey, LPCTSTR ptcsSubKey, LPCTSTR ptcsKeyPath) { HKEY hkResult; DWORD dwIndex = 0; TCHAR tcsKey[720] = {0}; TCHAR tcsName[200] = {0}; DWORD dwNameLen = sizeof(tcsName); FILETIME ftLastWriteTime; if(::RegOpenKeyEx(hKey, ptcsSubKey, 0, KEY_READ, &hkResult) == ERROR_SUCCESS) { _tcscpy(tcsKey, ptcsKeyPath); _tcscat(tcsKey, TEXT("//")); _tcscat(tcsKey, ptcsSubKey); _tprintf(TEXT("%s/n"), tcsKey); EnumKeyValue(hkResult); if (::RegEnumKeyEx( hkResult, dwIndex, tcsName, &dwNameLen, 0, NULL, NULL, &ftLastWriteTime ) == ERROR_SUCCESS) { do { nCount++; EnumKey(hkResult, tcsName, tcsKey); dwIndex += 1; dwNameLen = sizeof(tcsName); //must be specified every time!!! } while(::RegEnumKeyEx( hkResult, dwIndex, tcsName, &dwNameLen, 0, NULL, NULL, &ftLastWriteTime ) != ERROR_NO_MORE_ITEMS); ::RegCloseKey(hkResult); } } } int main() { _tprintf(TEXT("Enum Start!/r/n")); time_t start,end; time(&start); /* for(int i = 0 ; i < 5; i++) { data_set[0] =TEXT('/0'); EnumKey(hKey[i],sKey[i]); } */ EnumKey(hKey[0],TEXT("*"), tcsKey[0]); time(&end); _tprintf(TEXT("altogether %ld keys!!!/n "), nCount); _tprintf(TEXT("using time : %ld seconds!/n "), end - start ); return 0; }