//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 2000. // // File: GetReg.cpp // // Contents: Routines to get the registry, and dump the contents into // a text file. // // // Objects: // // Coupling: // // Notes: // // History: 9/21/00 SHeffner Created // //---------------------------------------------------------------------------- //+--------------------------------------------------------------------------- // // Common Includes // //---------------------------------------------------------------------------- #include #include #include //+--------------------------------------------------------------------------- // // Function Proto types // //---------------------------------------------------------------------------- void RegType(DWORD dwType, WCHAR *szString); //+--------------------------------------------------------------------------- // // Function: GetSRRegistry // // Synopsis: Routine will recursivly call this routine to enumerate the keys and values for the registry // // Arguments: [szFileName] -- Simple ANSI string to log file // [szPath] -- Simple ANSI string to the path to start at the registry // [bRecurse] -- Bool to indicate if I should recurse into sub paths // // Returns: true if successful // // History: 9/21/00 SHeffner Created // // //---------------------------------------------------------------------------- bool GetSRRegistry(char *szFileName, WCHAR *szPath, bool bRecurse) { WCHAR szKeyString[_MAX_PATH +1], szValueString[_MAX_PATH +1], szString[_MAX_PATH +1]; DWORD dwIndex=0, dwValueSize, dwDataSize, dwType; long lResult; HKEY mHkey; FILE *fStream; // Open the Log file for append fStream = fopen(szFileName, "a"); //Initialize local variables before processing path dwIndex =0; dwDataSize = dwValueSize = _MAX_PATH +1; //log current path, and then open the registry hive, and start enumerating the Values. fprintf(fStream, "\n[%S]\n", szPath); lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, szPath, 0, KEY_READ, &mHkey); lResult = RegEnumValue(mHkey, dwIndex, szKeyString, &dwDataSize, 0, &dwType, (unsigned char *)szValueString, &dwValueSize); while( ERROR_SUCCESS == lResult ) { RegType(dwType, szString); //BUGBUG.. If it is type 4, then we do the special type casting, // if not then we just pass it through as a string if (4 == dwType) fprintf(fStream, "\"%S\"=%S:%lu\n", szKeyString, szString, (DWORD &) szValueString); else fprintf(fStream, "\"%S\"=%S:%S\n", szKeyString, szString, (unsigned char *) szValueString); //Update local variables for next iteration. dwDataSize = dwValueSize = _MAX_PATH +1; dwIndex ++; lResult = RegEnumValue(mHkey, dwIndex, szKeyString, &dwDataSize, 0, &dwType, (unsigned char *)szValueString, &dwValueSize); } //Close out the file, for next recursion loop. fclose(fStream); //Now lets find all of the Key's under this key, and kick off a another enumeration for each one found if ( true == bRecurse ) { dwIndex = 0; dwDataSize = _MAX_PATH +1; lResult = RegEnumKey(mHkey, dwIndex, szKeyString, dwDataSize); while( ERROR_SUCCESS == lResult) { //Build the path, and then call this function again. wcscpy(szString, szPath); wcscat(szString, TEXT("\\")); wcscat(szString, szKeyString); GetSRRegistry(szFileName, szString, bRecurse); //Now do next run through. dwDataSize = _MAX_PATH +1; dwIndex ++; lResult = RegEnumKey(mHkey, dwIndex, szKeyString, dwDataSize); } } //Close key, and return back. RegCloseKey(mHkey); return true; } //+--------------------------------------------------------------------------- // // Function: RegType // // Synopsis: Routine returns in the string pass in, the description of registry key it is // // Arguments: [dwType] -- DWord Type // [szString] -- Simple ANSI string receive a string description // // Returns: void // // History: 9/21/00 SHeffner Created // //---------------------------------------------------------------------------- void RegType(DWORD dwType, WCHAR *szString) { switch(dwType) { case REG_BINARY: wcscpy(szString, TEXT("REG_BINARY")); break; case REG_DWORD: wcscpy(szString, TEXT("REG_DWORD")); break; case REG_DWORD_BIG_ENDIAN: wcscpy(szString, TEXT("REG_DWORD_BIG_ENDIAN")); break; case REG_EXPAND_SZ: wcscpy(szString, TEXT("REG_EXPAND_SZ")); break; case REG_LINK: wcscpy(szString, TEXT("REG_LINK")); break; case REG_MULTI_SZ: wcscpy(szString, TEXT("REG_MULTI_SZ")); break; case REG_NONE: wcscpy(szString, TEXT("REG_NONE")); break; case REG_QWORD: wcscpy(szString, TEXT("REG_QWORD")); break; case REG_RESOURCE_LIST: wcscpy(szString, TEXT("REG_RESOURCE_LIST")); break; case REG_SZ: wcscpy(szString, TEXT("REG_SZ")); break; default: wcscpy(szString, TEXT("UnKnown")); break; } }