Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1074 lines
31 KiB

#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; uCount<MAX_DRIVES; ++uCount ) {
if ( g_SearchDrives[uCount].bSearch )
DialogBoxParam(g_hInstance,MAKEINTRESOURCE(IDD_SEARCH),m_hWnd,(DLGPROC)SearchProc,(LPARAM)g_SearchDrives[uCount].szDrive);
}
}
// DON'T BREAK. Allow a natural update.
case WM_USER+1026:
{
// Now add everything we've found to the list view.
EnterCriticalSection(&g_CritSect);
ListView_DeleteAllItems(m_hListView);
PSEARCHLIST pWalk = m_pList;
int nItem = 0;
while ( NULL != pWalk ) {
LV_ITEM Item;
Item.mask = TVIF_TEXT | TVIF_PARAM;
Item.iItem = nItem;
Item.iSubItem = 0;
Item.pszText = pWalk->szFilename;
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("<No name available: Fix possibly created using Compatibility Wizard>");
EnterCriticalSection(&g_CritSect);
g_pSearch->m_pList = pNew;
LeaveCriticalSection(&g_CritSect);
return TRUE;
}