我乱谈几句吧:
1.把你的abc.exe 上传一下,大家好一起测试啊
2.我没仔细看你的算法,但是我在你原来的程序你基础上增加6行,查找速度会提高一倍甚至几倍
3.我增加后的代码:
#include "stdafx.h"
#include <windows.h>
#define MAX_BUF 1024*1024
LPBYTE FindBin(LPBYTE lpBuf, size_t iBufBytes, LPBYTE lpMarkBuf, LPBYTE lpMarkFormat, size_t iMarkBufBytes);
LPBYTE *buf=new LPBYTE[MAX_BUF+1];//定义了一个大空间
int _tmain(int argc, _TCHAR* argv[])
{
//BYTE data[] = {0x80, 0x39, 0x00, 0x75, '?', '?', 0xff};
//BYTE format[] = {'-', '-', '-', '-', '?', '?', '-'};
memset(buf,0x00,MAX_BUF+1); //将其初始化为0
unsigned char data[] = {0x80, 0x39, 0x00, 0x75, 0x03, 0x0};
unsigned char format[] = {'-', '-', '-', '-', '-', '-',};
TCHAR *lpszFileName = _T("abc.exe");
HANDLE hFile = CreateFile( lpszFileName,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL );
DWORD dwFileSize = GetFileSize(hFile, NULL);
HANDLE hMapFile = CreateFileMapping( hFile,
NULL,
PAGE_READONLY,
0,
0,
NULL );
LPBYTE lpFile = (LPBYTE)MapViewOfFile( hMapFile,
FILE_MAP_READ,
0,
0,
0 );
DWORD i=10000;
LPBYTE lpAddr;
DWORD dw1 = GetTickCount();
while (--i)
lpAddr = FindBin(lpFile, dwFileSize, data, format, sizeof(data));
DWORD dw2 = GetTickCount();
printf("%x \n", lpAddr);
printf("%d \n", dw2-dw1);
UnmapViewOfFile(lpFile); //楼主忘了取消映射了
CloseHandle(hFile); //还有关闭文件句柄
delete [] buf; //将临时内存释放
return 0;
}
LPBYTE FindBin(LPBYTE lpBuf, size_t iBufBytes, LPBYTE lpMarkBuf, LPBYTE lpMarkFormat, size_t iMarkBufBytes)
{
LPBYTE lpdata = lpBuf;
size_t size = iBufBytes;
BYTE CmpData = *lpMarkBuf;
BOOL result = FALSE;
if(memcmp(lpMarkBuf,buf,iMarkBufBytes)==0) //比较看要查找的内容是否是上次查找过了,如果是,则直接返回上次查找的结果
{
return *buf;
}
while (size > 0)
{
// 查找第1个字符
while ((--size) && (*lpdata != CmpData))
lpdata++;
if (*lpdata != CmpData)
break; // 没有找到
if (size < iMarkBufBytes)
break; // 剩余比较的字节不够
// 比较特征字符
LPBYTE lp1 = lpdata + 1;
LPBYTE lp2 = lpMarkBuf + 1;
LPBYTE lp3 = lpMarkFormat + 1;
size_t j = iMarkBufBytes - 1;
while (--j)
{
if ((*lp3 != '?') && (*lp1 != *lp2))
break;
lp1++, lp2++, lp3++;
}
if (*lp1 == *lp2)
{ // 找到了
result = TRUE;
break;
}
lpdata++;
}
if (result)
{
memcpy(buf,lpdata,iMarkBufBytes); //找到了之后将找到的内容暂时存储到内存空间
return lpdata;
}
else
return NULL;
}