DWORD CSubAction::GetData(DWORD nAction,BYTE* pData_,BOOL bHeader) const { BYTE* pData=pData_; if (bHeader) { *((WORD*)pData)=0xFFEA; pData+=sizeof(WORD); } *((DWORD*)pData)=m_nSubAction; *((DWORD*)(pData+sizeof(DWORD)))=(DWORD)min(LONG_PTR(m_pExtraInfo),MAXDWORD); pData+=2*sizeof(DWORD); switch (nAction) { case CAction::ResultListItems: if (m_nResultList==Execute && m_szVerb!=NULL) { DWORD dwUsed=DWORD(istrlenw(m_szVerb)+1); MemCopyW((LPWSTR)pData,m_szVerb,dwUsed); pData+=dwUsed*2; } else if (m_nResultList==ExecuteCommand && m_szCommand!=NULL) { DWORD dwUsed=DWORD(istrlenw(m_szCommand)+1); MemCopyW((LPWSTR)pData,m_szCommand,dwUsed); pData+=dwUsed*2; } break; case CAction::Misc: if ((m_nMisc==SendMessage || m_nMisc==PostMessage) && m_pSendMessage!=NULL) { DWORD dwUsed=m_pSendMessage->GetData(pData); pData+=dwUsed; } else if (m_nMisc==ExecuteCommandMisc && m_szCommand!=NULL) { DWORD dwUsed=DWORD(istrlenw(m_szCommand)+1); MemCopyW((LPWSTR)pData,m_szCommand,dwUsed); pData+=dwUsed*2; } break; case CAction::Presets: case CAction::ChangeValue: if (m_szPreset!=NULL) { DWORD dwUsed=DWORD(istrlenw(m_szPreset)+1); MemCopyW((LPWSTR)pData,m_szPreset,dwUsed); pData+=dwUsed*2; } break; } return DWORD(pData-pData_); }
DWORD Network::GetComputerNameFromIDList(LPITEMIDLIST lpiil,LPWSTR szName,DWORD dwBufferLen) { // May be computer? IShellFolder *psf; if (!SUCCEEDED(SHGetDesktopFolder(&psf))) return 0; SHDESCRIPTIONID di; if (!SUCCEEDED(SHGetDataFromIDList(psf,lpiil,SHGDFIL_DESCRIPTIONID,&di,sizeof(SHDESCRIPTIONID)))) { psf->Release(); return 0; } if (di.clsid!=CLSID_NetworkPlaces) { psf->Release(); return 0; } STRRET str; if (!SUCCEEDED(psf->GetDisplayNameOf(lpiil,SHGDN_NORMAL | SHGDN_FORPARSING,&str))) { psf->Release(); return 0; } psf->Release(); if (ShellFunctions::StrRetToStr(str,lpiil,szName,dwBufferLen)) return istrlenw(szName); return 0; }
LONG CRegKey::SetValue(LPCWSTR lpValueName,LPCWSTR strData) { if (IsUnicodeSystem()) return ::RegSetValueExW(m_hKey,lpValueName,0,REG_SZ,(CONST BYTE*)strData,(DWORD)((wcslen(strData)+1)*2)); else { int nLen=istrlenw(strData); LPSTR aData=new char[nLen+2]; WideCharToMultiByte(CP_ACP,0,strData,nLen+1,aData,nLen+1,NULL,NULL); LONG lRet=::RegSetValueExA(m_hKey,W2A(lpValueName),0,REG_SZ,(CONST BYTE*)aData,nLen+1); delete[] aData; return lRet; } }
int strcasecmp(LPCWSTR s1,LPCWSTR s2) { WCHAR *tmp1,*tmp2; int ret; DWORD nLen1=(DWORD)istrlenw(s1); DWORD nLen2=(DWORD)istrlenw(s2); tmp1=new WCHAR[nLen1+2]; if (tmp1==NULL) SetHFCError(HFC_CANNOTALLOC); CopyMemory(tmp1,s1,nLen1*2+2); tmp2=new WCHAR[nLen2+2]; if (tmp2==NULL) SetHFCError(HFC_CANNOTALLOC); CopyMemory(tmp2,s2,nLen2*2+2); CharLowerBuffW(tmp1,nLen1); CharLowerBuffW(tmp2,nLen2); ret=wcscmp(tmp1,tmp2); delete[] tmp1; delete[] tmp2; return ret; }
int ShellFunctions::FileOperation(LPSHFILEOPSTRUCTW lpFileOp) { if (IsUnicodeSystem()) return ::SHFileOperationW(lpFileOp); LPCWSTR pFrom=lpFileOp->pFrom; LPCWSTR pTo=lpFileOp->pTo; LPCWSTR pProgressTitle=lpFileOp->fFlags&FOF_SIMPLEPROGRESS?lpFileOp->lpszProgressTitle:NULL; if (pFrom!=NULL) lpFileOp->pFrom=(LPCWSTR)alloccopymultiWtoA(pFrom); if (pTo!=NULL) { if (lpFileOp->fFlags&FOF_MULTIDESTFILES) lpFileOp->pTo=(LPCWSTR)alloccopymultiWtoA(pTo); else lpFileOp->pTo=(LPCWSTR)alloccopyWtoA(pTo,istrlenw(pTo)+1); } if (pProgressTitle!=NULL) lpFileOp->lpszProgressTitle=(LPCWSTR)alloccopyWtoA(pProgressTitle); int nRet=::SHFileOperationA((LPSHFILEOPSTRUCTA)lpFileOp); if (pFrom!=NULL) { delete[] (LPSTR)lpFileOp->pFrom; lpFileOp->pFrom=pFrom; } if (pTo!=NULL) { delete[] (LPSTR)lpFileOp->pTo; lpFileOp->pTo=pTo; } if (pProgressTitle!=NULL) { delete[] (LPSTR)lpFileOp->lpszProgressTitle; lpFileOp->lpszProgressTitle=pProgressTitle; } return nRet; }
BOOL GetIMAPIBurningDevices(CArray<LPWSTR>& aDevicePaths) { CRegKey RegKey; if (RegKey.OpenKey(HKCR,"IMAPI.MSDiscMasterObj\\CLSID",CRegKey::defRead)!=ERROR_SUCCESS) return FALSE; WCHAR szCLSID[50]; if (RegKey.QueryValue(L"",szCLSID,50)==0) return FALSE; CLSID clsid; if (CLSIDFromString(szCLSID,&clsid)!=NO_ERROR) return FALSE; HRESULT hRes; IDiscMaster* pdm; hRes=CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER,IID_IDiscMaster,(void**)&pdm); if (FAILED(hRes)) return FALSE; hRes=pdm->Open(); if (FAILED(hRes)) { pdm->Release(); return FALSE; } IEnumDiscRecorders* pedr; hRes=pdm->EnumDiscRecorders(&pedr); if (SUCCEEDED(hRes)) { IDiscRecorder* pdr; DWORD dwReturned; while ((hRes=pedr->Next(1,&pdr,&dwReturned))==S_OK) { BSTR bPath; hRes=pdr->GetPath(&bPath); if (SUCCEEDED(bPath)) { if (bPath[0]=='\\') { WCHAR szName[MAX_PATH]; WCHAR szTemp[MAX_PATH]=L""; WCHAR drive[]=L" :"; GetLogicalDriveStringsW(MAX_PATH,szTemp); LPWSTR pPtr=szTemp; while (*pPtr!='\0') { *drive=*pPtr; if (QueryDosDeviceW(drive, szName,MAX_PATH)) { if (wcscmp(szName,bPath)==0) aDevicePaths.Add(alloccopy(pPtr)); } pPtr+=istrlenw(pPtr)+1; } } else aDevicePaths.Add(alloccopy(bPath)); } pdr->Release(); } pedr->Release(); } pdm->Close(); pdm->Release(); return TRUE; }
int wmain (int argc,wchar_t ** argv) { CAppData::stdfunc(); SetRegKey(argc,argv); if (!SetLanguageSpecifigHandles(argv[0])) return 1; CArrayFP<CDatabase*> aDatabases; WORD wCurrentThread=0; aDatabases.Add(CDatabase::FromDefaults(TRUE)); aDatabases[0]->SetNamePtr(alloccopy(L"DEFAULTX")); aDatabases[0]->SetThreadId(wCurrentThread); int i,helps=0; #ifndef WIN32 if (getenv("TZ")==NULL) fprintf(stderr,"Timezone is not set. Database may contain invalid file times.\nFor example type "SET TZ=GMT+1" for central european time.\n"); #endif for (i=1;i<argc;i++) { if (argv[i][0]=='-' || argv[i][0]=='/') { switch (argv[i][1]) { case L'X': if (argv[i][2]==L'\0') { if (i<argc-1) i++; // RegKeyName already set } break; case 'l': case 'L': if (wcsncmp(aDatabases.GetLast()->GetName(),L"PARAMX",6)!=0 && wcsncmp(aDatabases.GetLast()->GetName(),L"DEFAULTX",8)!=0) wprintf(ID2W(IDS_UPDATEDB32CANNOTCHANGELOADED),aDatabases.GetLast()->GetName()); else if (argv[i][2]=='1') { aDatabases.GetLast()->AddLocalRoots(); aDatabases.GetLast()->SetNamePtr(alloccopy(L"PARAMX")); } else { CStringW* pStr; if (argv[i][2]==L'\0' && i+1<argc) pStr=new CStringW(argv[++i]); else pStr=new CStringW(argv[i]+2); if ((*pStr)[0]==L'\"') pStr->DelChar(0); if (pStr->LastChar()==L'\"') pStr->DelLastChar(); while (pStr->LastChar()==L'\\') pStr->DelLastChar(); if (pStr->GetLength()>1) { if ((*pStr)[1]==':' && pStr->GetLength()==2) aDatabases.GetLast()->AddRoot(pStr->GiveBuffer()); else if (FileSystem::IsDirectory(*pStr)) aDatabases.GetLast()->AddRoot(pStr->GiveBuffer()); else fwprintf(stderr,ID2W(IDS_UPDATEDB32DIRECTORYISNOTVALID),(LPCWSTR)*pStr); } else fwprintf(stderr,ID2W(IDS_UPDATEDB32DIRECTORYISNOTVALID),(LPCWSTR)*pStr); delete pStr; aDatabases.GetLast()->SetNamePtr(alloccopy(L"PARAMX")); } break; case 'e': if (wcsncmp(aDatabases.GetLast()->GetName(),L"PARAMX",6)!=0 && wcsncmp(aDatabases.GetLast()->GetName(),L"DEFAULTX",8)!=0) wprintf(ID2W(IDS_UPDATEDB32CANNOTCHANGELOADED),aDatabases.GetLast()->GetName()); else { CStringW* pStr; if (argv[i][2]=='\0' && i+1<argc) pStr=new CStringW(argv[++i]); else pStr=new CStringW(argv[i]+2); if ((*pStr)[0]==L'\"') pStr->DelChar(0); if (pStr->LastChar()==L'\"') pStr->DelLastChar(); while (pStr->LastChar()==L'\\') pStr->DelLastChar(); if (pStr->GetLength()>0) aDatabases.GetLast()->SetExcludedFiles(*pStr); aDatabases.GetLast()->SetNamePtr(alloccopy(L"PARAMX")); } break; case 'E': if (wcsncmp(aDatabases.GetLast()->GetName(),L"PARAMX",6)!=0 && wcsncmp(aDatabases.GetLast()->GetName(),L"DEFAULTX",8)!=0) wprintf(ID2W(IDS_UPDATEDB32CANNOTCHANGELOADED),aDatabases.GetLast()->GetName()); else { CStringW* pStr; if (argv[i][2]=='\0' && i+1<argc) pStr=new CStringW(argv[++i]); else pStr=new CStringW(argv[i]+2); if ((*pStr)[0]==L'\"') pStr->DelChar(0); if (pStr->LastChar()==L'\"') pStr->DelLastChar(); while (pStr->LastChar()==L'\\') pStr->DelLastChar(); if (pStr->GetLength()>1) { if (!aDatabases.GetLast()->AddExcludedDirectory(*pStr)) fwprintf(stderr,ID2W(IDS_UPDATEDB32DIRECTORYISNOTVALID),(LPCWSTR)*pStr); } else fwprintf(stderr,ID2W(IDS_UPDATEDB32DIRECTORYISNOTVALID),(LPCWSTR)*pStr); delete pStr; aDatabases.GetLast()->SetNamePtr(alloccopy(L"PARAMX")); } break; case 't': case 'T': if (wcsncmp(aDatabases.GetLast()->GetName(),L"PARAMX",6)!=0 && wcsncmp(aDatabases.GetLast()->GetName(),L"DEFAULTX",8)!=0) wprintf(ID2W(IDS_UPDATEDB32CANNOTCHANGELOADED),aDatabases.GetLast()->GetName()); else if (argv[i][2]==L'c' || argv[i][2]==L'C') { if (argv[i][3]==L'\0') aDatabases.GetLast()->SetCreatorPtr(alloccopy(argv[++i])); else aDatabases.GetLast()->SetCreatorPtr(alloccopy(argv[i]+2)); aDatabases.GetLast()->SetNamePtr(alloccopy(L"PARAMX")); } else if (argv[i][2]==L'd' || argv[i][2]==L'D') { if (argv[i][3]==L'\0') aDatabases.GetLast()->SetDescriptionPtr(alloccopy(argv[++i])); else aDatabases.GetLast()->SetDescriptionPtr(alloccopy(argv[i]+2)); aDatabases.GetLast()->SetNamePtr(alloccopy(L"PARAMX")); } break; case 'i': case 'I': if (wcsncmp(aDatabases.GetLast()->GetName(),L"PARAMX",6)!=0 && wcsncmp(aDatabases.GetLast()->GetName(),L"DEFAULTX",8)!=0) wprintf(ID2W(IDS_UPDATEDB32CANNOTCHANGELOADED),aDatabases.GetLast()->GetName()); else { aDatabases.GetLast()->SetFlag(CDatabase::flagIncrementalUpdate,TRUE); aDatabases.GetLast()->SetNamePtr(alloccopy(L"PARAMX")); } break; case 'c': case 'C': if (wcsncmp(aDatabases.GetLast()->GetName(),L"PARAMX",6)!=0 && wcsncmp(aDatabases.GetLast()->GetName(),L"DEFAULTX",8)!=0) wprintf(ID2W(IDS_UPDATEDB32CANNOTCHANGELOADED),aDatabases.GetLast()->GetName()); else if (argv[i][2]==L'A' || argv[i][2]==L'a') { aDatabases.GetLast()->SetFlag(CDatabase::flagAnsiCharset,TRUE); aDatabases.GetLast()->SetNamePtr(alloccopy(L"PARAMX")); } else if (argv[i][2]==L'U' || argv[i][2]==L'u') { aDatabases.GetLast()->SetFlag(CDatabase::flagAnsiCharset,FALSE); aDatabases.GetLast()->SetNamePtr(alloccopy(L"PARAMX")); } break; case 'N': case 'n': wCurrentThread++; break; case 'q': case 'Q': nQuiet=TRUE; break; case 'v': case 'V': printf("%s\n",szVersionStr); return 0; case 'd': { // Using database file CStringW sFile; if (argv[i][2]=='\0') sFile=argv[++i]; else sFile=(argv[i]+2); if (aDatabases.GetSize()==1 && wcscmp(aDatabases[0]->GetName(),L"DEFAULTX")==0) { aDatabases[0]->SetNamePtr(alloccopy(L"PARAMX")); aDatabases[0]->SetArchiveNamePtr(sFile.GiveBuffer()); } else { CDatabase* pDatabase=CDatabase::FromFile(sFile,(int)sFile.GetLength()); if (pDatabase!=NULL) { aDatabases.Add(pDatabase); pDatabase->SetNamePtr(alloccopy(L"PARAMX")); pDatabase->SetThreadId(wCurrentThread); } } } break; case 'D': { // Loading database 'name' from registry, cannot be changed CStringW sName; if (argv[i][2]=='\0') sName=argv[++i]; else sName=(argv[i]+2); if (CDatabase::FindByName(aDatabases,sName,(int)sName.GetLength())==NULL) { CDatabase* pDatabase=CDatabase::FromName(HKCU, CString(g_szRegKey)+"\\Databases",sName); if (pDatabase!=NULL) { pDatabase->SetFlag(CDatabase::flagGlobalUpdate); // Is only default loaded if (aDatabases.GetSize()==1 && wcscmp(aDatabases[0]->GetName(),L"DEFAULTX")==0) { delete aDatabases[0]; aDatabases[0]=pDatabase; } else { aDatabases.Add(pDatabase); pDatabase->SetThreadId(wCurrentThread); } } } } break; case 'h': case 'H': case '?': helps=1; break; default: helps=1; break; } } } if (helps==1) { #ifdef WIN32 fprintf(stdout,"%s\n",szVersionStr); #else fprintf(stdout,"%s\nusage updatedb",szVersionStr); #endif HRSRC hRc=FindResource(GetLanguageSpecificResourceHandle(),MAKEINTRESOURCE(IDR_UPDATEDBHELP),"HELPTEXT"); HGLOBAL hGlobal=LoadResource(GetLanguageSpecificResourceHandle(),hRc); LPCSTR pStr=(LPCSTR)LockResource(hGlobal); // Counting length int len; for (len=0;pStr[len]!='\0';len++) { if (pStr[len]=='E' && pStr[len+1]=='O' && pStr[len+2]=='F') break; } fwrite(pStr,1,len,stdout); FreeLibrary(GetLanguageSpecificResourceHandle()); return 1; } // Checking databases // First, check that there is database if (aDatabases.GetSize()==0) CDatabase::LoadFromRegistry(HKCU,CString(g_szRegKey)+"\\Databases",aDatabases); else if (aDatabases.GetSize()==1 && wcsncmp(aDatabases[0]->GetName(),L"DEFAULTX",8)==0) { aDatabases.RemoveAll(); CDatabase::LoadFromRegistry(HKCU,CString(g_szRegKey)+"\\Databases",aDatabases); // No registry values? if (aDatabases.GetSize()==0) { aDatabases.Add(CDatabase::FromDefaults(TRUE)); aDatabases[0]->SetNamePtr(alloccopy(L"DEFAULTX")); } } CDatabase::CheckValidNames(aDatabases); CDatabase::CheckDoubleNames(aDatabases); for (int i=0;i<aDatabases.GetSize();) { if (!aDatabases[i]->IsGloballyUpdated()) aDatabases.RemoveAt(i); else { if ((wcsncmp(aDatabases[i]->GetName(),L"PARAMX",6)==0 || wcsncmp(aDatabases[i]->GetName(),L"DEFAULTX",8)==0)) { BOOL bNameChanged=FALSE; if (aDatabases[i]->GetRoots()==0) { BOOL bFree; LPWSTR pFile=aDatabases[i]->GetResolvedArchiveName(bFree); CDatabaseInfo* pDatabaseInfo=CDatabaseInfo::GetFromFile(pFile); if (bFree) delete[] pFile; if (pDatabaseInfo!=NULL) { CDatabase* pDatabase; if (!pDatabaseInfo->sExtra2.IsEmpty()) pDatabase=CDatabase::FromExtraBlock(pDatabaseInfo->sExtra2); if (pDatabase==NULL && !pDatabaseInfo->sExtra1.IsEmpty()) pDatabase=CDatabase::FromExtraBlock(pDatabaseInfo->sExtra1); wprintf(ID2W(IDS_UPDATEDB32USINGEXISTINGSETTINGS), aDatabases[i]->GetArchiveName(),pDatabase->GetName()); pDatabase->SetArchiveType(aDatabases[i]->GetArchiveType()); pDatabase->SetArchiveName(aDatabases[i]->GetArchiveName()); delete aDatabases[i]; aDatabases[i]=pDatabase; delete pDatabaseInfo; bNameChanged=TRUE; } } if (!bNameChanged) { ULONG_PTR nFirst=LastCharIndex(aDatabases[i]->GetArchiveName(),L'\\')+1; int nLength=LastCharIndex(aDatabases[i]->GetArchiveName()+nFirst,L'.'); if (nLength==-1) nLength=istrlenw(aDatabases[i]->GetArchiveName()+nFirst); aDatabases[i]->SetNamePtr(alloccopy(aDatabases[i]->GetArchiveName()+nFirst,nLength)); } } i++; } } // Starting to update WORD dwTheads=CDatabase::CheckIDs(aDatabases); if (dwTheads==0) { FreeLibrary(GetLanguageSpecificResourceHandle()); return FALSE; } if (dwTheads==1) { CDatabaseUpdater Updater(aDatabases,aDatabases.GetSize(),UpdateProc); Updater.Update(FALSE); } else { WORD wThread; ppUpdaters=new CDatabaseUpdater*[dwTheads+1]; for (wThread=0;wThread<dwTheads;wThread++) { ppUpdaters[wThread]=new CDatabaseUpdater(aDatabases,aDatabases.GetSize(), UpdateProc,wThread,(DWORD)0); } ppUpdaters[dwTheads]=NULL; // Starting DWORD dwRunning=0; UpdateError ueCode; for (wThread=0;wThread<dwTheads;wThread++) { ueCode=ppUpdaters[wThread]->Update(TRUE); if (ueCode==ueSuccess) dwRunning++; else { delete ppUpdaters[wThread]; ppUpdaters[wThread]=UPDATER_EXITED(ueCode); } } if (dwRunning==0) delete ppUpdaters; else { while (ppUpdaters!=NULL) Sleep(100); } } FinishRegKey(); FreeLibrary(GetLanguageSpecificResourceHandle()); return 1; }
INT IsDirectory(LPCWSTR szDirectoryName) { HANDLE hFind; WIN32_FIND_DATAW fd; int ret=TRUE; if (szDirectoryName[0]==L'\0') return 0; if (szDirectoryName[1]==L'\0') return 0; if (szDirectoryName[2]==L'\0') return 0; if (szDirectoryName[1]==L':' && szDirectoryName[2]==L'\\' && szDirectoryName[3]==L'\0') { switch (GetDriveTypeW(szDirectoryName)) { case DRIVE_UNKNOWN: case DRIVE_NO_ROOT_DIR: return 0; case DRIVE_FIXED: return 1; default: return 2; } } // Taking last '\\' LPWSTR szPath; SIZE_T dwPathLen=istrlenw(szDirectoryName); if (szDirectoryName[dwPathLen-1]==L'\\' && dwPathLen>3) { szPath=new WCHAR[dwPathLen+5]; --dwPathLen; MemCopyW(szPath,szDirectoryName,dwPathLen); szPath[dwPathLen]='\0'; } else szPath=LPWSTR(szDirectoryName); hFind=FindFirstFileW(szPath,&fd); if (hFind!=INVALID_HANDLE_VALUE) { while (!(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) && ret) ret=FindNextFileW(hFind,&fd); if (szPath!=szDirectoryName) delete[] szPath; FindClose(hFind); if (ret) { if (szDirectoryName[0]==L'\\') { if (szDirectoryName[1]==L'\\') return 2; switch (GetDriveType(NULL)) { case DRIVE_UNKNOWN: case DRIVE_NO_ROOT_DIR: return 0; case DRIVE_FIXED: return 1; default: return 2; } } if (szDirectoryName[1]==L':' && szDirectoryName[2]==L'\\') { WCHAR szTemp[4]=L"X:\\"; szTemp[0]=szDirectoryName[0]; switch (GetDriveTypeW(szTemp)) { case DRIVE_UNKNOWN: return 0; case DRIVE_FIXED: return 1; default: return 2; } } } return 0; } else if (szDirectoryName[0]==L'\\' && szDirectoryName[1]==L'\\') { // UNC share name if (szPath==szDirectoryName) { szPath=new WCHAR[dwPathLen+5]; CopyMemory(szPath,szDirectoryName,dwPathLen*2); } CopyMemory(szPath+dwPathLen,L"\\*.*",5*2); hFind=FindFirstFileW(szPath,&fd); delete[] szPath; if (hFind==INVALID_HANDLE_VALUE) return 0; // Is this really needed, e.g. \\pc\c$ does not have '.' in directory list //ret=1; //while ((fd.cFileName[0]!='.' || fd.cFileName[1]!='\0') && ret==1) // ret=FindNextFile(hFind,&fd); FindClose(hFind); //return ret?2:0; return 2; } if (szPath!=szDirectoryName) delete[] szPath; return 0; }
void CCheckFileNotificationsThread::UpdateItemsInRoot(LPCWSTR szRoot,CLocateDlg* pLocateDlg) { //BkgDebugFormatMessage("CCheckFileNotificationsThread::UpdateItemsInRoot BEGIN szRoot=%s",szRoot); if (pLocateDlg->m_pListCtrl==NULL) return; if (pLocateDlg->m_pListCtrl->GetItemCount()==0) return; // Updating changed items by checking all items if (szRoot[1]=='\0') { //BkgDebugMessage("CCheckFileNotificationsThread::UpdateItemsInRoot 1a"); WCHAR szDriveLower=szRoot[0]; WCHAR szDriveUpper=szRoot[0]; MakeUpper(&szDriveUpper,1); //BkgDebugMessage("CCheckFileNotificationsThread::UpdateItemsInRoot 2a"); int nItem=pLocateDlg->m_pListCtrl->GetNextItem(-1,LVNI_ALL); while (nItem!=-1) { if (m_lFlags&fwStopWhenPossible) break; CLocatedItem* pItem=(CLocatedItem*)pLocateDlg->m_pListCtrl->GetItemData(nItem); if (pItem!=NULL) { // Checking whether path is in changed volume LPCWSTR szPath=pItem->GetPath(); if ((szPath[0]==szDriveLower || szPath[0]==szDriveUpper) && szPath[1]==L':') { // Just disabling flags, let background thread do the rest if (pItem->RemoveFlagsForChanged()) pLocateDlg->m_pListCtrl->RedrawItems(nItem,nItem); } } nItem=pLocateDlg->m_pListCtrl->GetNextItem(nItem,LVNI_ALL); } } else { DWORD dwLength=(DWORD)istrlenw(szRoot); //BkgDebugMessage("CCheckFileNotificationsThread::UpdateItemsInRoot 1b"); int nItem=pLocateDlg->m_pListCtrl->GetNextItem(-1,LVNI_ALL); while (nItem!=-1) { if (m_lFlags&fwStopWhenPossible) break; CLocatedItem* pItem=(CLocatedItem*)pLocateDlg->m_pListCtrl->GetItemData(nItem); if (pItem!=NULL) { if (pItem->GetPathLen()>=dwLength) { LPWSTR szPath=alloccopy(pItem->GetPath(),pItem->GetPathLen()); MakeLower(szPath); if (wcsncmp(szPath,szRoot,dwLength)==0) { // Just disabling flags, let background thread do the rest if (pItem->RemoveFlagsForChanged()) pLocateDlg->m_pListCtrl->RedrawItems(nItem,nItem); } delete[] szPath; } } nItem=pLocateDlg->m_pListCtrl->GetNextItem(nItem,LVNI_ALL); } } //DebugMessage("CCheckFileNotificationsThread::UpdateItemsInRoot END"); }