// AppSearch // // Tool for searching a user's hard drives and locating // applications that can be patched // // Author: t-michkr (9 June 2000) // // shiminfo.cpp // Display information on the shims used by an app. #include extern "C" { #include } #include #include #include "main.h" #include "resource.h" HSDB g_hSDBx; struct SShimInfo { TCHAR* szName; TCHAR* szDesc; SShimInfo() : szName(0), szDesc(0) {} ~SShimInfo() { if(szName) delete szName; if(szDesc) delete szDesc; szName = szDesc = 0; } }; const int c_nMaxShimList = 16; static int nNumShims = 0; static SShimInfo* apShimInfo[c_nMaxShimList]; // Shim dialog proc. BOOL CALLBACK ShimInfoDialogProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam); // Shim dialog message handlers. BOOL HandleShimInfoInitDialog(HWND hwnd, TCHAR* szAppPath); void HandleShimInfoCommand(HWND hwnd, UINT uiCtrl, UINT uiNotify); // ShowShimInfo // Display dialog box showing which shims are imported by an app. void ShowShimInfo(HWND hwnd, TCHAR* szAppPath) { if((g_hSDBx = SdbInitDatabase(0, NULL)) == NULL) return; DialogBoxParam(g_hinst, MAKEINTRESOURCE(IDD_SHIMINFO), hwnd, ShimInfoDialogProc, reinterpret_cast(szAppPath)); for(int i = 0; i < nNumShims; i++) { if(apShimInfo[i]) delete apShimInfo[i]; } nNumShims = 0; SdbReleaseDatabase(g_hSDBx); } // Dialog proc for shim info dialog. BOOL CALLBACK ShimInfoDialogProc(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam) { switch(uiMsg) { case WM_INITDIALOG: return HandleShimInfoInitDialog(hwnd, reinterpret_cast(lParam)); break; case WM_COMMAND: HandleShimInfoCommand(hwnd, LOWORD(wParam), HIWORD(wParam)); break; default: return FALSE; } return TRUE; } // Init dialog, add all shims used by app. BOOL HandleShimInfoInitDialog(HWND hwnd, TCHAR* szAppPath) { DWORD dwNumExes = 0; assert(szAppPath); TCHAR szBuffer[c_nMaxStringLength]; GetWindowText(hwnd, szBuffer, c_nMaxStringLength); lstrcat(szBuffer, TEXT(" - ")); if(_tcsrchr(szAppPath, TEXT('\\'))) lstrcat(szBuffer, _tcsrchr(szAppPath, TEXT('\\'))+1); else lstrcat(szBuffer, szAppPath); SetWindowText(hwnd, szBuffer); // Find the EXE in the database SDBQUERYRESULT sdbQuery; ZeroMemory(&sdbQuery, sizeof(SDBQUERYRESULT)); SdbGetMatchingExe(g_hSDBx, szAppPath, NULL, NULL, SDBGMEF_IGNORE_ENVIRONMENT, &sdbQuery); for (dwNumExes = 0; dwNumExes < SDB_MAX_EXES; ++dwNumExes) { if (sdbQuery.atrExes[dwNumExes] == TAGREF_NULL) { break; } } if (dwNumExes) { // // for now, just get the info for the last exe in the list, which will // be the one with specific info for this app. // BUGBUG -- is this the right thing to do? dmunsil // TAGREF trExe = sdbQuery.atrExes[dwNumExes - 1]; // Get all shims used by this app. TAGREF trShimDLL = SdbFindFirstTagRef(g_hSDBx, trExe, TAG_SHIM_REF); while(trShimDLL) { // Get the name of the shim. TCHAR szBuffer[c_nMaxStringLength]; TAGREF trName = SdbFindFirstTagRef(g_hSDBx, trShimDLL, TAG_NAME); if(SdbReadStringTagRef(g_hSDBx, trName, szBuffer, c_nMaxStringLength)) { SShimInfo* pShim = new SShimInfo; if(!pShim) return FALSE; pShim->szName = new TCHAR[lstrlen(szBuffer)+1]; if(!pShim->szName) { delete pShim; return FALSE; } lstrcpy(pShim->szName, szBuffer); // Have to read description from // actual DLL entry, not the reference. TAGREF trRealDLL = SdbGetShimFromShimRef(g_hSDBx, trShimDLL); if(trRealDLL) { TAGREF trDesc = SdbFindFirstTagRef(g_hSDBx, trRealDLL, TAG_DESCRIPTION); if(SdbReadStringTagRef(g_hSDBx, trDesc, szBuffer, c_nMaxStringLength)) { pShim->szDesc = new TCHAR[lstrlen(szBuffer)+1]; if(!pShim->szDesc) { delete pShim; return FALSE; } lstrcpy(pShim->szDesc, szBuffer); } } // Add the shim to the list HWND hwList = GetDlgItem(hwnd, IDC_SHIMLIST); if(hwList) { int i = SendMessage(hwList, LB_ADDSTRING, 0, reinterpret_cast(pShim->szName)); if(i != LB_ERR) { SendMessage(hwList, LB_SETITEMDATA, i, nNumShims); apShimInfo[nNumShims] = pShim; nNumShims++; } else delete pShim; } } // Move to next shim. trShimDLL = SdbFindNextTagRef(g_hSDBx, trExe, trShimDLL); } } return TRUE; } // Handle command messages void HandleShimInfoCommand(HWND hwnd, UINT uiCtrl, UINT uiNotify) { HWND hwList, hwDesc; int iItem, iShim; switch(uiCtrl) { case IDOK: EndDialog(hwnd, 0); break; case IDC_SHIMLIST: switch(uiNotify) { case LBN_SELCHANGE: // On a sel change, show the new shim description. hwList = GetDlgItem(hwnd, IDC_SHIMLIST); iItem = SendMessage(hwList, LB_GETCURSEL, 0, 0); if(iItem == LB_ERR) break; iShim = SendMessage(hwList, LB_GETITEMDATA, iItem, 0); if(iShim == LB_ERR) break; hwDesc = GetDlgItem(hwnd, IDC_SHIMDESC); SetWindowText(hwDesc, apShimInfo[iShim]->szDesc); break; } break; } }