毕业论文开发语言企业开发JAVA技术.NET技术WEB开发Linux/Unix数据库技术Windows平台移动平台嵌入式论文范文英语论文
您现在的位置: 毕业论文 >> 开发语言 >> 正文

SetFilePointer的最大寻址只能到4G如何定位

更新时间:2012-7-18:  来源:毕业论文

正在写一个硬盘修复的工具,开发环境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;
}

设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©youerw.com 优尔论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。