//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1995 // // File: dclassInfo.cxx // // Contents: Display registry class information // // Functions: classInfoHelp // displayclassInfo // // // History: 06-01-95 BruceMa Created // // //-------------------------------------------------------------------------- // BUGBUG: Add threading model flags #include #include #include "ole.h" #include "dinfolvl.h" #include "debnot.h" BOOL ScanCLSID(char *szClsid, CLSID *pClsid); void FormatCLSID(REFGUID rguid, LPSTR lpsz); static void GetSomeClsidValues(HKEY hKey, char *szName, char *szInprocHandler, char *szInprocHandler32, char *szInprocServer, char *szInprocServer32, char *szLocalServer, char *szLocalServer32, char *szProgid, char *szTreatAs, char *szAutoConvertTo, char *szOle1Class); static void DisplayValues(PNTSD_EXTENSION_APIS lpExtensionApis, char *szName, char *szInprocHandler, char *szInprocHandler32, char *szInprocServer, char *szInprocServer32, char *szLocalServer, char *szLocalServer32, char *szProgid, char *szTreatAs, char *szAutoConvertTo, char *szOle1Class); static void MungePath(char *szPath); static DWORD dwRESERVED = 0; //+------------------------------------------------------------------------- // // Function: classInfoHelp // // Synopsis: Display a menu for the command 'id' // // Arguments: - // // Returns: - // // History: 07-Mar-95 BruceMa Created // //-------------------------------------------------------------------------- void classInfoHelp(PNTSD_EXTENSION_APIS lpExtensionApis) { Printf("ci - Display registry class information\n"); Printf("ci clsid - Display registry class information for clsid\n"); } //+------------------------------------------------------------------------- // // Function: displayclassInfo // // Synopsis: Display/set debug info levels // // Arguments: [hProcess] - Handle of this process // [lpExtensionApis] - Table of extension functions // [CLSID *] - Get info for this clsid // // Returns: - // // History: 07-Mar-95 BruceMa Created // //-------------------------------------------------------------------------- BOOL displayClassInfo(HANDLE hProcess, PNTSD_EXTENSION_APIS lpExtensionApis, CLSID *pClsid) { HKEY hKey; char szCLSID[CLSIDSTR_MAX]; char szClsid[5 + 1 + CLSIDSTR_MAX]; char szName[64]; char szInprocHandler[64]; char szInprocHandler32[64]; char szInprocServer[64]; char szInprocServer32[64]; char szLocalServer[64]; char szLocalServer32[64]; char szProgid[64]; char szTreatAs[64]; char szAutoConvertTo[64]; char szOle1Class[64]; // Information for a specific clsid? if (pClsid) { // Prepare to open the "...CLSID\" key FormatCLSID(*pClsid, szCLSID); lstrcpy(szClsid, "CLSID\\"); lstrcat(szClsid, szCLSID); // Open the key for the specified clsid if (RegOpenKeyEx(HKEY_CLASSES_ROOT, szClsid, dwRESERVED, KEY_READ, &hKey) != ERROR_SUCCESS) { return FALSE; } // Read interesting values for this clsid GetSomeClsidValues(hKey, szName, szInprocHandler, szInprocHandler32, szInprocServer, szInprocServer32, szLocalServer, szLocalServer32, szProgid, szTreatAs, szAutoConvertTo, szOle1Class); // Only display "interesting" entries if ((szInprocHandler[0] && _stricmp(szInprocHandler, "ole2.dll") != 0) || (szInprocHandler32[0] && _stricmp(szInprocHandler32, "ole32.dll") != 0) || (szInprocServer[0] && _stricmp(szInprocServer, "ole2.dll") != 0) || (szInprocServer32[0] && _stricmp(szInprocServer32, "ole32.dll") != 0) || szLocalServer[0] || szLocalServer32[0] || szTreatAs[0] || szAutoConvertTo[0]) { // Display them DisplayValues(lpExtensionApis, szName, szInprocHandler, szInprocHandler32, szInprocServer, szInprocServer32, szLocalServer, szLocalServer32, szProgid, szTreatAs, szAutoConvertTo, szOle1Class); } // Close registry handle and return success CloseHandle(hKey); return TRUE; } // Else display all of them else { HKEY hKey2; DWORD dwErr; DWORD cbSubKey = 0; char szClsid[64]; DWORD cbClsid; DWORD cbClass; FILETIME sLastWrite; // Open the key for the root "CLSID" if (RegOpenKeyEx(HKEY_CLASSES_ROOT, "CLSID", dwRESERVED, KEY_ENUMERATE_SUB_KEYS, &hKey) != ERROR_SUCCESS) { return FALSE; } // Enumerate over the keys under "HKEY_CLASSES_ROOT\CLSID" do { // Enumerate the next subkey cbClsid = 64; dwErr = RegEnumKeyEx(hKey, cbSubKey, szClsid, &cbClsid, NULL, NULL, NULL, &sLastWrite); // Prepare for next subkey cbSubKey++; // If it does look like a clsid, skip it CLSID clsid; if (!ScanCLSID(szClsid, &clsid)) { continue; } // Open this clsid key if (RegOpenKeyEx(hKey, szClsid, dwRESERVED, KEY_READ, &hKey2) != ERROR_SUCCESS) { return FALSE; } // Get the interesting values GetSomeClsidValues(hKey2, szName, szInprocHandler, szInprocHandler32, szInprocServer, szInprocServer32, szLocalServer, szLocalServer32, szProgid, szTreatAs, szAutoConvertTo, szOle1Class); // Only display "interesting" entries if ((szInprocHandler[0] && _stricmp(szInprocHandler, "ole2.dll") != 0) || (szInprocHandler32[0] && _stricmp(szInprocHandler32, "ole32.dll") != 0) || (szInprocServer[0] && _stricmp(szInprocServer, "ole2.dll") != 0) || (szInprocServer32[0] && _stricmp(szInprocServer32, "ole32.dll") != 0) || szLocalServer[0] || szLocalServer32[0] || szTreatAs[0] || szAutoConvertTo[0]) { // Display the clsid Printf("%s ", szClsid); // Display its values DisplayValues(lpExtensionApis, szName, szInprocHandler, szInprocHandler32, szInprocServer, szInprocServer32, szLocalServer, szLocalServer32, szProgid, szTreatAs, szAutoConvertTo, szOle1Class); } // Close registry handle CloseHandle(hKey2); } until_(dwErr == ERROR_NO_MORE_ITEMS || dwErr != ERROR_SUCCESS); // Close clsid registry handle CloseHandle(hKey); return TRUE; } } //+------------------------------------------------------------------------- // // Function: GetSomeClsidValues // // Synopsis: Given an open registry key to a clsid, read some of // the more interesting subkey values // // Arguments: [hkey] Open registry key // [szName] Where to store the name // [szInprocHandler] Where to store the InprocHandler // [szInprocHandler32] Where to store the InprocHandler32 // [szInprocServer] Where to store the InprocServer // [szInprocServer32] Where to store the InprocServer32 // [szLocalServer] Where to store the LocalServer // [szLocalServer32] Where to store the LocalServer32 // [ProgId] Where to store the ProgId // [TreatAs] Where to store the TreatAs // [AutoConvertTo] Where to store the AutoConvertTo // [Ole1Class] Where to store the Ole1Class // // Returns: - // // History: 01-Jun-95 BruceMa Created // //-------------------------------------------------------------------------- static void GetSomeClsidValues(HKEY hKey, char *szName, char *szInprocHandler, char *szInprocHandler32, char *szInprocServer, char *szInprocServer32, char *szLocalServer, char *szLocalServer32, char *szProgId, char *szTreatAs, char *szAutoConvertTo, char *szOle1Class) { DWORD dwRESERVED = 0; HKEY hKey2; DWORD dwValueType; DWORD cbValue; // Initialize szName[0] = '\0'; szInprocHandler[0] = '\0'; szInprocHandler32[0] = '\0'; szInprocServer[0] = '\0'; szInprocServer32[0] = '\0'; szLocalServer[0] = '\0'; szLocalServer32[0] = '\0'; szProgId[0] = '\0'; szTreatAs[0] = '\0'; szAutoConvertTo[0] = '\0'; szOle1Class[0] = '\0'; // Name cbValue = 64; if (RegQueryValueEx(hKey, NULL, NULL, &dwValueType, (LPBYTE) szName, &cbValue) != ERROR_SUCCESS) { return; } // InprocHandler if (RegOpenKeyEx(hKey, "InprocHandler", dwRESERVED, KEY_READ, &hKey2) == ERROR_SUCCESS) { cbValue = 64; RegQueryValueEx(hKey2, NULL, NULL, &dwValueType, (LPBYTE) szInprocHandler, &cbValue); MungePath(szInprocHandler); CloseHandle(hKey2); } // InprocHandler32 if (RegOpenKeyEx(hKey, "InprocHandler32", dwRESERVED, KEY_READ, &hKey2) == ERROR_SUCCESS) { cbValue = 64; RegQueryValueEx(hKey2, NULL, NULL, &dwValueType, (LPBYTE) szInprocHandler32, &cbValue); MungePath(szInprocHandler32); CloseHandle(hKey2); } // InprocServer if (RegOpenKeyEx(hKey, "InprocServer", dwRESERVED, KEY_READ, &hKey2) == ERROR_SUCCESS) { cbValue = 64; RegQueryValueEx(hKey2, NULL, NULL, &dwValueType, (LPBYTE) szInprocServer, &cbValue); MungePath(szInprocServer); CloseHandle(hKey2); } // InprocServer32 if (RegOpenKeyEx(hKey, "InprocServer32", dwRESERVED, KEY_READ, &hKey2) == ERROR_SUCCESS) { cbValue = 64; RegQueryValueEx(hKey2, NULL, NULL, &dwValueType, (LPBYTE) szInprocServer32, &cbValue); MungePath(szInprocServer32); CloseHandle(hKey2); } // LocalServer if (RegOpenKeyEx(hKey, "LocalServer", dwRESERVED, KEY_READ, &hKey2) == ERROR_SUCCESS) { cbValue = 64; RegQueryValueEx(hKey2, NULL, NULL, &dwValueType, (LPBYTE) szLocalServer, &cbValue); MungePath(szLocalServer); CloseHandle(hKey2); } // LocalServer32 if (RegOpenKeyEx(hKey, "LocalServer32", dwRESERVED, KEY_READ, &hKey2) == ERROR_SUCCESS) { cbValue = 64; RegQueryValueEx(hKey2, NULL, NULL, &dwValueType, (LPBYTE) szLocalServer32, &cbValue); MungePath(szLocalServer32); CloseHandle(hKey2); } // ProgId if (RegOpenKeyEx(hKey, "ProgId", dwRESERVED, KEY_READ, &hKey2) == ERROR_SUCCESS) { cbValue = 64; RegQueryValueEx(hKey2, NULL, NULL, &dwValueType, (LPBYTE) szProgId, &cbValue); CloseHandle(hKey2); } // TreatAs if (RegOpenKeyEx(hKey, "TreatAs", dwRESERVED, KEY_READ, &hKey2) == ERROR_SUCCESS) { cbValue = 64; RegQueryValueEx(hKey2, NULL, NULL, &dwValueType, (LPBYTE) szTreatAs, &cbValue); CloseHandle(hKey2); } // AutoConvertTo if (RegOpenKeyEx(hKey, "AutoConvertTo", dwRESERVED, KEY_READ, &hKey2) == ERROR_SUCCESS) { cbValue = 64; RegQueryValueEx(hKey2, NULL, NULL, &dwValueType, (LPBYTE) szAutoConvertTo, &cbValue); CloseHandle(hKey2); } // Ole1Class if (RegOpenKeyEx(hKey, "Ole1Class", dwRESERVED, KEY_READ, &hKey2) == ERROR_SUCCESS) { szOle1Class[0] = '1'; CloseHandle(hKey2); } } //+------------------------------------------------------------------------- // // Function: DisplayValues // // Synopsis: Display the values read above // // Arguments: [hkey] Open registry key // [szName] Where to store the name // [szInprocHandler] Where to store the InprocHandler // [szInprocHandler32] Where to store the InprocHandler32 // [szInprocServer] Where to store the InprocServer // [szInprocServer32] Where to store the InprocServer32 // [szLocalServer] Where to store the LocalServer // [szLocalServer32] Where to store the LocalServer32 // [ProgId] Where to store the ProgId // [TreatAs] Where to store the TreatAs // [AutoConvertTo] Where to store the AutoConvertTo // [Ole1Class] Where to store the Ole1Class // // Returns: - // // History: 01-Jun-95 BruceMa Created // //-------------------------------------------------------------------------- static void DisplayValues(PNTSD_EXTENSION_APIS lpExtensionApis, char *szName, char *szInprocHandler, char *szInprocHandler32, char *szInprocServer, char *szInprocServer32, char *szLocalServer, char *szLocalServer32, char *szProgId, char *szTreatAs, char *szAutoConvertTo, char *szOle1Class) { // Display the name Printf("%s ", szName); // Display ProgId (if unique) if (szProgId[0] && lstrcmp(szProgId, szName) != 0) { Printf("%s ", szProgId); } // Display the server executable if (szLocalServer[0]) { Printf("%s ", szLocalServer32); } else if (szInprocServer32[0]) { Printf("%s ", szInprocServer32); } else if (szLocalServer[0]) { Printf("%s(16) ", szLocalServer); } else if (szInprocServer[0]) { Printf("%s(16) ", szInprocServer); } // Display handler information if (szInprocHandler32[0] && _stricmp(szInprocHandler32, "ole32.dll") != 0) { Printf("Hndlr: %s ", szInprocHandler32); } else if (szInprocHandler[0] && _stricmp(szInprocHandler, "ole2.dll") != 0) { Printf("Hndlr: %s(16) ", szInprocHandler); } // Display any TreatAs or AutoConvertTo information if (szTreatAs[0]) { Printf("TA: %s", szTreatAs); } if (szAutoConvertTo[0]) { Printf("ACT: %s", szAutoConvertTo); } // Check if this is an ole1 class if (szOle1Class[0]) { Printf("ole1 class"); } // We're done Printf("\n"); } //+------------------------------------------------------------------------- // // Function: MungePath // // Synopsis: Remove directory components from a file path // // Arguments: [szPath] Path to munge // // Returns: - // // History: 01-Jun-95 BruceMa Created // //-------------------------------------------------------------------------- static void MungePath(char *szPath) { int cbLen = lstrlen(szPath); DWORD cbPath; for (cbPath = cbLen; cbPath > 0 && szPath[cbPath] != '\\'; cbPath--) { } if (cbPath > 0) { lstrcpy(szPath, &szPath[cbPath + 1]); } }