【发布时间】:2015-05-29 23:50:12
【问题描述】:
我正在编写一个程序来检查文件是否为 PE 文件。为此,我只需要读取文件的文件头(我猜它占用的文件不超过文件的前 1024 个字节)。
我尝试使用 creatfile() + readfile() 组合,结果速度较慢,因为我正在遍历系统驱动器中的所有文件。仅遍历它们就需要 15-20 分钟。
您能否告诉一些替代方法来打开和读取文件以使其更快?
注意:请注意我不需要阅读整个文件。我只需要读取文件的初始部分——DOS 头、PE 头等,我猜它们占用的文件不超过文件的前 512 个字节。
这是我的代码:
bool IsPEFile(const String filePath)
{
HANDLE hFile = CreateFile(filePath.c_str(),
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
DWORD dwBytesRead = 0;
const DWORD CHUNK_SIZE = 2048;
BYTE szBuffer[CHUNK_SIZE] = {0};
LONGLONG size;
LARGE_INTEGER li = {0};
if (hFile != INVALID_HANDLE_VALUE)
{
if(GetFileSizeEx(hFile, &li) && li.QuadPart > 0)
{
size = li.QuadPart;
ReadFile(hFile, szBuffer, CHUNK_SIZE, &dwBytesRead, NULL);
if(dwBytesRead > 0 && (WORDPTR(szBuffer[0]) == ('M' << 8) + 'Z' || WORDPTR(szBuffer[0]) == ('Z' << 8) + 'M'))
{
LONGLONG ne_pe_header = DWORDPTR(szBuffer[0x3c]);
WORD signature = 0;
if(ne_pe_header <= dwBytesRead-2)
{
signature = WORDPTR(szBuffer[ne_pe_header]);
}
else if (ne_pe_header < size )
{
SetFilePointer(hFile, ne_pe_header, NULL, FILE_BEGIN);
ReadFile(hFile, &signature, sizeof(signature), &dwBytesRead, NULL);
if (dwBytesRead != sizeof(signature))
{
return false;
}
}
if(signature == 0x4550) // PE file
{
return true;
}
}
}
CloseHandle(hFile);
}
return false;
}
提前致谢。
【问题讨论】:
-
您是否尝试过使用 C 的
FILE或 C++fstream看看它们是否足够快? -
如果您的问题是关于 C++ 的,为什么您的问题会被标记为 c?这没有任何意义,儿子。
-
什么是creatfile和readfile?
-
很难说什么是最快的——它可能取决于各种因素,例如驱动器的固件、寻道时间、操作系统版本等。我怀疑它们之间会有很大差异,但是如果我是你并且真的在乎,我会进行基准测试以将
ifstream与内存映射进行比较(如果你不想自己编写代码,boost 有一个实现)。 -
你在制造病毒吗? ))
标签: c++ c winapi visual-c++ readfile