#include "compatadmin.h" #include "dbsearch.h" // Taken from sdbp.h #define PDB_MAIN 0x00000000 #define PDB_TEST 0x10000000 #define PDB_LOCAL 0x20000000 #define TAGREF_STRIP_TAGID 0x0FFFFFFF #define TAGREF_STRIP_PDB 0xF0000000 HANDLE g_hSearchThread = NULL; CDBSearch * g_pSearch = NULL; HWND g_hUpdateWnd; HWND g_hListWnd; CRITICAL_SECTION g_CritSect; DWORD g_dwMainThread; BOOL g_bAbort; typedef struct { TCHAR szDrive[MAX_PATH_BUFFSIZE]; BOOL bSearch; } DRIVELIST, *PDRIVELIST; #define MAX_DRIVES 128 DRIVELIST g_SearchDrives[MAX_DRIVES]; TCHAR g_szWildcard[MAX_PATH_BUFFSIZE]; BOOL PopulateFromExes (PSEARCHLIST pNew, TAGID ID,PDB pDB, TAGREF tagref); BOOL PopulateFromLayers (PSEARCHLIST pNew, TAGID ID,PDB pDB, TAGREF tagref, CSTRING strLayersInExes[]); CDBSearch::CDBSearch() { m_pList = NULL; m_hListView = NULL; InitializeCriticalSection(&g_CritSect); g_dwMainThread = GetCurrentThreadId(); } BOOL CDBSearch::Initialize(void) { if ( !Create( TEXT("DBViewClass"), TEXT("Search View"),//Not displayed, used for diagnostics with SPY++ 0,0, 10,10, &g_theApp, (HMENU)VIEW_DATABASE, 0, WS_CHILD | WS_CLIPSIBLINGS | WS_CLIPCHILDREN) ) { return FALSE; } m_hMenu = LoadMenu(g_hInstance,MAKEINTRESOURCE(IDR_SEARCHMENU)); m_hListView = CreateWindowEx( 0, WC_LISTVIEW, TEXT(""), WS_CHILD | WS_VISIBLE | WS_BORDER | WS_CLIPSIBLINGS | LVS_REPORT | LVS_OWNERDRAWFIXED, 0,0, 10,10, m_hWnd, NULL, g_hInstance, NULL); g_hListWnd = m_hListView; LONG uStyle = ListView_GetExtendedListViewStyle(m_hListView); ListView_SetExtendedListViewStyle(m_hListView,LVS_EX_FULLROWSELECT | uStyle); // Add the list view columns LV_COLUMN Col; Col.mask = LVCF_TEXT | LVCF_WIDTH; Col.pszText = TEXT("Affected File"); Col.cchTextMax = lstrlen(Col.pszText); Col.cx = 200; ListView_InsertColumn(m_hListView,0,&Col); Col.pszText = TEXT("Application"); Col.cchTextMax = lstrlen(Col.pszText); Col.cx = 150; ListView_InsertColumn(m_hListView,1,&Col); Col.pszText = TEXT("Action"); Col.cchTextMax = lstrlen(Col.pszText); Col.cx = 100; ListView_InsertColumn(m_hListView,2,&Col); Col.pszText = TEXT("Database"); Col.cchTextMax = lstrlen(Col.pszText); Col.cx = 100; ListView_InsertColumn(m_hListView,3,&Col); /* // This was for the settings field Col.pszText = TEXT("Settings"); Col.cchTextMax = lstrlen(Col.pszText); Col.cx = 100; ListView_InsertColumn(m_hListView,4,&Col); */ /* Col.pszText = "Local Setting"; Col.cchTextMax = lstrlen(Col.pszText); Col.cx = 100; ListView_InsertColumn(m_hListView,5,&Col); */ m_hFillBrush = CreateSolidBrush(RGB(235,235,235)); return TRUE; } void CDBSearch::Update(BOOL fNotUsed) { while ( NULL != m_pList ) { PSEARCHLIST pHold = m_pList->pNext; delete m_pList; m_pList = pHold; } ListView_DeleteAllItems(m_hListView); g_pSearch = this; PostMessage(m_hWnd,WM_USER+1024,0,0); // Add everything to the list view. } BOOL CDBSearch::Activate(BOOL fNotUsed) { //K if (NULL == m_pList) Update(fNotUsed); return TRUE; } void CDBSearch::msgCommand(UINT uID, HWND hSender) { switch ( uID ) { case ID_SEARCH_NEWSEARCH: { Update(); } break; } } void CDBSearch::msgResize(UINT uWidth, UINT uHeight) { MoveWindow(m_hListView,0,0,uWidth,uHeight,TRUE); InvalidateRect(m_hListView,NULL,TRUE); UpdateWindow(m_hListView); Refresh(); } LRESULT CDBSearch::MsgProc(UINT uMsg,WPARAM wParam, LPARAM lParam) { switch ( uMsg ) { case WM_USER+1024: { g_hListWnd = m_hWnd; // Enumerate the drives and ask for query if ( 0 != DialogBox(g_hInstance,MAKEINTRESOURCE(IDD_DRIVELIST),m_hWnd,(DLGPROC)SelectDrivesProc) ) PostMessage(m_hWnd,WM_USER+1025,0,0); } break; case WM_USER+1025: { UINT uCount; for ( uCount=0; uCountszFilename; Item.cchTextMax = lstrlen(Item.pszText); Item.lParam = (LPARAM) pWalk; ListView_InsertItem(m_hListView,&Item); Item.mask = TVIF_TEXT; Item.iItem = nItem; Item.iSubItem = 1; Item.pszText = pWalk->szApplication; Item.cchTextMax = lstrlen(Item.pszText); Item.lParam = (LPARAM) pWalk; ListView_InsertItem(m_hListView,&Item); ++nItem; pWalk = pWalk->pNext; } LeaveCriticalSection(&g_CritSect); } break; case WM_DRAWITEM: { LPDRAWITEMSTRUCT pDraw = (LPDRAWITEMSTRUCT) lParam; HDC hDC = CreateCompatibleDC(pDraw->hDC); HBITMAP hBmp = CreateCompatibleBitmap(pDraw->hDC,pDraw->rcItem.right - pDraw->rcItem.left,pDraw->rcItem.bottom - pDraw->rcItem.top); HBITMAP hOldBmp = (HBITMAP) SelectObject(hDC,hBmp); HFONT hFont = (HFONT) SendMessage(m_hListView,WM_GETFONT,0,0); PSEARCHLIST pList; LVITEM Item; RECT rBmpRect; hFont = (HFONT) SelectObject(hDC,hFont); SetRect(&rBmpRect,0,0,pDraw->rcItem.right - pDraw->rcItem.left,pDraw->rcItem.bottom - pDraw->rcItem.top); Item.mask = LVIF_PARAM; Item.iItem = pDraw->itemID; Item.iSubItem = 0; LV_COLUMN Col; Col.mask = LVCF_WIDTH; ListView_GetColumn(m_hListView,0,&Col); Col.cx = pDraw->rcItem.right; ListView_GetItem(m_hListView,&Item); if ( 0 != (pDraw->itemState & ODS_FOCUS) ) { FillRect(hDC,&rBmpRect,GetSysColorBrush(COLOR_HIGHLIGHT)); SetBkColor(hDC,GetSysColor(COLOR_HIGHLIGHT)); } else{ FillRect(hDC,&rBmpRect,(HBRUSH) GetStockObject(WHITE_BRUSH)); SetBkColor(hDC,RGB(255,255,255)); } MoveToEx(hDC,Col.cx-1,0,NULL); //LineTo(hDC,Col.cx-1,rBmpRect.bottom); MoveToEx(hDC,0,rBmpRect.bottom-1,NULL); //LineTo(hDC,rBmpRect.right,rBmpRect.bottom-1); // Draw the actual name. pList = (PSEARCHLIST) Item.lParam; LPTSTR szText = pList->Record.szEXEName; RECT rClipRect = rBmpRect; rClipRect.left = 20; rClipRect.right = Col.cx - 2; --rClipRect.bottom; // Icon SHFILEINFO Info; ZeroMemory(&Info,sizeof(Info)); SHGetFileInfo(pList->szFilename,FILE_ATTRIBUTE_NORMAL,&Info,sizeof(Info),SHGFI_ICON | SHGFI_SMALLICON); // NOTE: We don't use ImageList_Draw because it cannot stretch. DrawIconEx(hDC,5,0,Info.hIcon,rBmpRect.bottom,rBmpRect.bottom,0,NULL,DI_NORMAL); // Filename ExtTextOut( hDC, 10 + rBmpRect.bottom, 0, ETO_OPAQUE | ETO_CLIPPED, &rClipRect, szText, lstrlen(szText), NULL); // App name. Col.mask = LVCF_WIDTH; ListView_GetColumn(m_hListView,0,&Col); rClipRect.left = Col.cx; ListView_GetColumn(m_hListView,1,&Col); rClipRect.right = rClipRect.left + Col.cx; CSTRING strText; strText.sprintf(TEXT("%s"),TEXT(" ")); if ( ! pList->Record.szAppName.isNULL() ) strText.strcat( pList->Record.szAppName ); ExtTextOut( hDC, rClipRect.left, 0, ETO_OPAQUE | ETO_CLIPPED, &rClipRect, strText, strText.Length(), NULL); Col.mask = LVCF_WIDTH; ListView_GetColumn(m_hListView,2,&Col); rClipRect.left = rClipRect.right; rClipRect.right = rClipRect.left + Col.cx; CSTRING szTemp; if ( pList->Record.szLayerName.Length() > 0 ) szTemp.sprintf(TEXT("Layer: %s;"),(LPCTSTR) pList->Record.szLayerName); PDBENTRY pEntry = pList->Record.pEntries; BOOL bShim = FALSE, bAppHelp = FALSE, bPatchFlag = FALSE; while ( NULL != pEntry ) { if ( ENTRY_SHIM == pEntry->uType ){ bShim = TRUE; } else if ( ENTRY_APPHELP == pEntry->uType ){ bAppHelp = TRUE; } else if (ENTRY_MATCH != pEntry->uType) { bPatchFlag = TRUE; } pEntry = pEntry->pNext; } if (bShim) { szTemp.strcat(TEXT("Custom Fix")); szTemp.strcat(TEXT(";")); } if (bAppHelp) { szTemp.strcat(TEXT("AppHelp")); szTemp.strcat(TEXT(";")); } if (bPatchFlag) { szTemp.strcat(TEXT("Patch/Flag")); szTemp.strcat(TEXT(";")); } if(szTemp.Length() == 0 ){ szTemp = TEXT("Patch/Flag;"); } szTemp.SetChar(szTemp.Length()-1, TEXT('\0')); strText.sprintf(TEXT("%s"),TEXT(" ")); if ( !szTemp.isNULL() ) strText.strcat( szTemp ); ExtTextOut( hDC, rClipRect.left, 0, ETO_OPAQUE | ETO_CLIPPED, &rClipRect, strText, strText.Length(), NULL); Col.mask = LVCF_WIDTH; ListView_GetColumn(m_hListView,3,&Col); rClipRect.left = rClipRect.right; rClipRect.right = rClipRect.left + Col.cx; strText.sprintf(TEXT("%s"),TEXT(" ")); if ( ! pList->szDatabase.isNULL() ) strText.strcat( pList->szDatabase ); ExtTextOut( hDC, rClipRect.left, 0, ETO_OPAQUE | ETO_CLIPPED, &rClipRect, strText, strText.Length(), NULL); /* This was for the settings field. Col.mask = LVCF_WIDTH; ListView_GetColumn(m_hListView,4,&Col); rClipRect.left = rClipRect.right; rClipRect.right = rClipRect.left + Col.cx; if ( 0 == pList->Record.dwGlobalFlags ) szText = TEXT("Enabled"); else szText = TEXT("Disabled"); strText.sprintf(TEXT("%s %s"),TEXT(" "),szText ); ExtTextOut( hDC, rClipRect.left, 0, ETO_OPAQUE | ETO_CLIPPED, &rClipRect, strText, strText.Length(), NULL); */ Col.mask = LVCF_WIDTH; ListView_GetColumn(m_hListView,5,&Col); rClipRect.left = rClipRect.right; rClipRect.right = rClipRect.left + Col.cx; BitBlt( pDraw->hDC, pDraw->rcItem.left, pDraw->rcItem.top, (pDraw->rcItem.right - pDraw->rcItem.left), (pDraw->rcItem.bottom - pDraw->rcItem.top)+1, hDC, 0,0, SRCCOPY); SelectObject(hDC,hOldBmp); SelectObject(hDC,hFont); DeleteObject(hBmp); DeleteDC(hDC); } break; } return CView::MsgProc(uMsg,wParam,lParam); } void SearchDrive(LPCTSTR szDir) { HANDLE hFile; WIN32_FIND_DATA Data; TCHAR szCurrentDir[MAX_PATH_BUFFSIZE]; BOOL bAbort = FALSE; GetCurrentDirectory(sizeof(szCurrentDir)/sizeof(TCHAR),szCurrentDir); // Make a check here. This can fail if removable media is not present and // user selects cancel. if ( !SetCurrentDirectory(szDir) ) return; SetWindowText(g_hUpdateWnd,szDir); hFile = FindFirstFile(g_szWildcard,&Data); if ( INVALID_HANDLE_VALUE != hFile ) { do { CSTRING szStr; szStr.sprintf(TEXT("%s"),szDir); if ( TEXT('\\') != szDir[lstrlen(szDir)-1] ) szStr.strcat(TEXT("\\")); szStr.strcat(Data.cFileName); SDBQUERYRESULT Res; ZeroMemory(&Res,sizeof(SDBQUERYRESULT)); // Determine if this file is affected in any way. if ( 0 == (Data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) { if ( SdbGetMatchingExe(g_hSDB, (LPCTSTR)szStr,NULL, NULL, SDBGMEF_IGNORE_ENVIRONMENT, &Res) ) { // Yes, it is. Add it to the list of managed files. TAGID ID; PDB pDB; // //First read in the exes // CSTRING strLayersInExes[SDB_MAX_EXES]; for (int nExeLoop = 0; nExeLoop < SDB_MAX_EXES; ++nExeLoop) { if (Res.atrExes[nExeLoop] ) { SdbTagRefToTagID(g_hSDB,Res.atrExes[nExeLoop],&pDB,&ID); PSEARCHLIST pNew = new SEARCHLIST; if (pNew == NULL) { MEM_ERR; return; } pNew->szFilename = szStr; PopulateFromExes(pNew,ID,pDB,Res.atrExes[nExeLoop]); strLayersInExes[nExeLoop] = pNew->Record.szLayerName; } } // //Now look for the layers. // for (int nLayerLoop = 0; nLayerLoop < SDB_MAX_LAYERS; ++nLayerLoop) { if (Res.atrLayers[nLayerLoop] ) { SdbTagRefToTagID(g_hSDB,Res.atrLayers[nLayerLoop],&pDB,&ID); PSEARCHLIST pNew = new SEARCHLIST; if (pNew == NULL) { MEM_ERR; return; } pNew->szFilename = szStr; PopulateFromLayers(pNew,ID,pDB,Res.atrLayers[nLayerLoop], strLayersInExes); } } // NOTE: SendNotifyMessage is thread safe. SendNotifyMessage(g_hListWnd,WM_USER+1026,0,0); } } EnterCriticalSection(&g_CritSect); bAbort = g_bAbort; LeaveCriticalSection(&g_CritSect); } while ( FindNextFile(hFile,&Data) && !bAbort ); FindClose(hFile); }//if (INVALID_HANDLE_VALUE != hFile) // Now go through separately and walk the sub-directories. hFile = FindFirstFile(TEXT("*.*"),&Data); if ( INVALID_HANDLE_VALUE != hFile ) { do { if ( 0 != (Data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) { BOOL bForbidden = FALSE; if ( TEXT('.') == Data.cFileName[0] ) bForbidden = TRUE; if ( 0 == lstrcmp(TEXT("LocalService"),Data.cFileName) ) bForbidden = TRUE; if ( 0 == lstrcmp(TEXT("NetworkService"),Data.cFileName) ) bForbidden = TRUE; if ( 0 == lstrcmp(TEXT("System Volume Information"),Data.cFileName) ) bForbidden = TRUE; if ( !bForbidden ) { TCHAR szPath[MAX_PATH_BUFFSIZE]; lstrcpy(szPath,szDir); if ( lstrlen(szPath) > 3 ) lstrcat(szPath,TEXT("\\")); lstrcat(szPath,Data.cFileName); SearchDrive(szPath); } } EnterCriticalSection(&g_CritSect); bAbort = g_bAbort; LeaveCriticalSection(&g_CritSect); } while ( FindNextFile(hFile,&Data) && !bAbort ); FindClose(hFile); } SetCurrentDirectory(szCurrentDir); } DWORD WINAPI SearchThread(LPVOID pParam) { SearchDrive((LPCTSTR)pParam); return 0; } BOOL CALLBACK SearchProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch ( uMsg ) { case WM_INITDIALOG: { DWORD dwID; SetTimer(hDlg,0,1,NULL); g_hUpdateWnd = GetDlgItem(hDlg,IDC_SEARCHTEXT); // Begin searching the drive on a separate thread. g_hSearchThread = CreateThread(NULL, 0, SearchThread, (PVOID)lParam, 0, &dwID); } return TRUE; case WM_TIMER: { // Done searching? If not, wait if ( NULL != g_hSearchThread ) { if ( WAIT_OBJECT_0 == WaitForSingleObject(g_hSearchThread,0) ) { CloseHandle(g_hSearchThread); g_hSearchThread = NULL; } } else EndDialog(hDlg,0); } break; case WM_COMMAND: { switch ( LOWORD(wParam) ) { case IDCANCEL: { EnterCriticalSection(&g_CritSect); g_bAbort = TRUE; LeaveCriticalSection(&g_CritSect); } break; } } break; } return FALSE; } BOOL CALLBACK SelectDrivesProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch ( uMsg ) { case WM_INITDIALOG: { SendMessage( GetDlgItem(hWnd,IDC_WILDCARD), // handle to destination window EM_LIMITTEXT, // message to send (WPARAM) MAX_PATH, // text length (LPARAM) 0 ); TCHAR szDrives[4096]; *szDrives = 0; LPTSTR szWalk = szDrives; int nCount = 0; TCHAR szIcons[MAX_PATH_BUFFSIZE]; g_bAbort = FALSE; GetSystemDirectory(szIcons,MAX_PATH); lstrcat(szIcons,TEXT("\\shell32.dll")); HIMAGELIST hImage = ImageList_Create(16,16,ILC_COLORDDB | ILC_MASK,0,1); HICON hIcon; // Floppy: 0 ExtractIconEx(szIcons,6,NULL,&hIcon,1); ImageList_AddIcon(hImage,hIcon); // Fixed disk: 1 ExtractIconEx(szIcons,8,NULL,&hIcon,1); ImageList_AddIcon(hImage,hIcon); // Network: 2 ExtractIconEx(szIcons,9,NULL,&hIcon,1); ImageList_AddIcon(hImage,hIcon); // CD ROM: 3 ExtractIconEx(szIcons,11,NULL,&hIcon,1); ImageList_AddIcon(hImage,hIcon); // RAM Disk: 4 ExtractIconEx(szIcons,12,NULL,&hIcon,1); ImageList_AddIcon(hImage,hIcon); TreeView_SetImageList(GetDlgItem(hWnd,IDC_DRIVELIST),hImage,TVSIL_NORMAL); SetWindowText(GetDlgItem(hWnd,IDC_WILDCARD),TEXT("*.EXE")); GetLogicalDriveStrings(sizeof(szDrives)/sizeof(TCHAR),szDrives); while ( lstrlen(szWalk) > 0 ) { //Can be replaced by while(*szWalk). TVINSERTSTRUCT Item; TCHAR szString[MAX_PATH_BUFFSIZE]; UINT uType = GetDriveType(szWalk); if ( DRIVE_REMOVABLE != uType && DRIVE_NO_ROOT_DIR != uType ) { TCHAR szVolume[MAX_PATH_BUFFSIZE]; TCHAR szDriveFormat[MAX_PATH_BUFFSIZE]; DWORD dwSerial; DWORD dwLen; DWORD dwFlags; szVolume[0] = 0; szDriveFormat[0] = 0; GetVolumeInformation(szWalk, szVolume, sizeof(szVolume)/sizeof(TCHAR), &dwSerial, &dwLen, &dwFlags, szDriveFormat, sizeof(szDriveFormat)/sizeof(TCHAR)); if ( lstrlen(szVolume) == 0 ) lstrcpy(szVolume,TEXT("No Volume")); _snwprintf(szString,sizeof(szString)/sizeof(TCHAR), TEXT("%s - %s"),szWalk,szVolume); } else lstrcpy(szString,szWalk); Item.hParent = TVI_ROOT; Item.hInsertAfter = TVI_LAST; Item.item.mask = TVIF_TEXT | TVIF_PARAM | TVIF_IMAGE | TVIF_SELECTEDIMAGE; Item.item.pszText = szString; Item.item.cchTextMax = lstrlen(Item.item.pszText); switch ( uType ) { case DRIVE_REMOVABLE: Item.item.iImage = 0; Item.item.iSelectedImage = 0; break; case DRIVE_FIXED: Item.item.iImage = 1; Item.item.iSelectedImage = 1; break; case DRIVE_REMOTE: Item.item.iImage = 2; Item.item.iSelectedImage = 2; break; case DRIVE_CDROM: Item.item.iImage = 3; Item.item.iSelectedImage = 3; break; case DRIVE_RAMDISK: Item.item.iImage = 4; Item.item.iSelectedImage = 4; break; } Item.item.lParam = nCount; lstrcpy(g_SearchDrives[nCount].szDrive,szWalk); g_SearchDrives[nCount].bSearch = FALSE; nCount++; TreeView_InsertItem(GetDlgItem(hWnd,IDC_DRIVELIST),&Item); szWalk += lstrlen(szWalk) + 1; } } return TRUE; case WM_NOTIFY: { NMHDR * pHdr = (NMHDR *) lParam; switch ( pHdr->code ) { case NM_CLICK: { TVHITTESTINFO ht; HWND hTree = GetDlgItem(hWnd,IDC_DRIVELIST); GetCursorPos(&ht.pt); ScreenToClient(hTree, &ht.pt); TreeView_HitTest(hTree,&ht); if ( 0 != ht.hItem ) TreeView_SelectItem(hTree,ht.hItem); } break; /* case TVN_SELCHANGED: HWND hTree = GetDlgItem(hWnd,IDC_DRIVELIST); LPNMTREEVIEW pnmtv = (LPNMTREEVIEW) lParam; //((pnmtv->itemNew).state & TVIS_SELECTED) ? TreeView_SelectItem(hTree,(pnmtv->itemNew).hItem); break; */ }//switch(pHdr->code) } break; case WM_COMMAND: switch ( LOWORD(wParam) ) { case IDCANCEL: EndDialog(hWnd,0); break; case IDOK: { HTREEITEM hItem; HWND hTree = GetDlgItem(hWnd,IDC_DRIVELIST); GetWindowText(GetDlgItem(hWnd,IDC_WILDCARD),g_szWildcard,MAX_PATH); hItem = TreeView_GetRoot(hTree); //EFF: Probably we can make the change that when we select or click the //Tree control, then we can make toggle g_SearchDrives[Item.lParam].bSearch while ( NULL != hItem ) { TVITEM Item; Item.mask = TVIF_STATE | TVIF_PARAM; Item.hItem = hItem; TreeView_GetItem(hTree,&Item); if ( 0 != (Item.state & 0x2000) ) g_SearchDrives[Item.lParam].bSearch = TRUE; hItem = TreeView_GetNextSibling(hTree,hItem); } EndDialog(hWnd,1); } break; } } return FALSE; } void CDBSearch::msgChar(TCHAR ch) { SendMessage(this->m_hListView,WM_CHAR,(WPARAM)ch, 0x8000 ); } BOOL PopulateFromExes(PSEARCHLIST pNew, TAGID ID,PDB pDB, TAGREF tagref) { // //We have to populate the pNew->szFileName before calling this function. // BOOL valid = CDatabase::ReadRecord(ID,&pNew->Record,pDB); switch ( tagref & TAGREF_STRIP_PDB ) { case PDB_MAIN: pNew->szDatabase = TEXT("Global"); break; case PDB_TEST: pNew->szDatabase = TEXT("Test"); break; case PDB_LOCAL: pNew->szDatabase = TEXT("Local"); break; } pNew->pNext = g_pSearch->m_pList; pNew->Record.szEXEName = pNew->szFilename; EnterCriticalSection(&g_CritSect); g_pSearch->m_pList = pNew; LeaveCriticalSection(&g_CritSect); return valid; } BOOL PopulateFromLayers(PSEARCHLIST pNew, TAGID ID,PDB pDB, TAGREF tagref, CSTRING strLayersInExes[] ) { // //We have to populate the pNew->szFileName before calling this function. // // //For those global entries which do not have layers but shims etc. // BOOL valid = CDatabase::ReadRecord(ID,&pNew->Record,pDB); pNew->Record.szLayerName = pNew->Record.szEXEName; pNew->Record.szEXEName = pNew->szFilename; pNew->Record.pEntries = NULL; if (pNew->Record.szLayerName.isNULL() ) { return TRUE; } // //We are looking for the layers and must not add a layer that has already been found // for (int nLoop = 0; nLoop < SDB_MAX_EXES; ++nLoop ){ if (strLayersInExes[nLoop] == pNew->Record.szLayerName) { return FALSE; } }//for (int nLoop = 0; nLoop < MAX_EXES, ++nLoop) switch ( tagref & TAGREF_STRIP_PDB ) { case PDB_MAIN: pNew->szDatabase = TEXT("Global"); break; case PDB_TEST: pNew->szDatabase = TEXT("Test"); break; case PDB_LOCAL: pNew->szDatabase = TEXT("Local"); break; } pNew->pNext = g_pSearch->m_pList; pNew->Record.szEXEName = pNew->szFilename; pNew->Record.szAppName = TEXT(""); EnterCriticalSection(&g_CritSect); g_pSearch->m_pList = pNew; LeaveCriticalSection(&g_CritSect); return TRUE; }