正在写一个硬盘修复的工具,开发环境vc6.0,操作系统是winXP,实验的硬盘250GB(四个分区),开发过程中遇到如下问题:
需要利用SetFilePointer对各分区的引导扇区进行定位后再做备份,但SetFilePointer的最大寻址只能到4G(64位),实验硬盘上除了第一分区,其他分区的引导扇区地址都远远的超过了4G,因此自己想当然的将SetFilePointer放到了一个循环中想以此突破4G的界限,结果并不成功,可以读出数据,但数据并非是引导扇区的数据(已经和WinHex读到的数据对比过),现在请问将SetFilePointer嵌套到一个循环中这样的方法有什么不妥?除了内存映射外是否还有其他办法可以用以定位超过4G的地址?
以下是代码:
C/C++ code
HANDLE HardDriver=CreateFile(_T( "\\\\.\\PHYSICALDRIVE0 "), GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
BYTE buffer[512];//用以接收引导扇区数据的缓冲区,一个扇区大小
DWORD ReadSize=0;
int Sec2Address=39070143;//这是第二个分区的引导扇区所在的扇区地址,实际地址应该是39070143*512B
for(int count=0;count<Sec2Address;count++)//每次循环将文件指针移动一个扇区,循环39070143次后定位到引导扇区
{
::SetFilePointer(HardDriver,512,NULL,FILE_CURRENT);
}
ReadFile(HardDriver,buffer,512*512,&ReadSize,NULL);
4G(64位),
64位不是4G,32位才是,64位是T级别了吧
LONGLONG MyFileSeek(HANDLE handle, LONGLONG llDistance, DWORD dwMoveMethod)
{
LARGE_INTEGER li;
li.QuadPart = llDistance;
li.LowPart = SetFilePointer(handle, li.LowPart, &li.HighPart, dwMoveMethod);
if (li.LowPart == INVALID_SET_FILE_POINTER && GetLastError() != NO_ERROR)
{
li.QuadPart = -1;
}
return li.QuadPart;
}