2,640
社区成员
发帖
与我相关
我的任务
分享
void main()
{
hDevice = CreateFile("\\\\.\\PHYSICALDRIVE0" , //普通文件名或者设备文件名
GENERIC_READ, //访问模式(读)
FILE_SHARE_READ | //共享模式
FILE_SHARE_WRITE,
0, //指向安全属性的指针
OPEN_EXISTING, //如何创建
FILE_FLAG_OVERLAPPED, //文件属性 异步IO
0); //用于复制文件句柄
for(qint64 i=0;i<secNum;i+=2048)//遍历硬盘扇区
{
currentSec=startSec+i;
ReadSectors1M(currentSec);
}
}
void ReadSectors1M(qint64 currentSec)) //读扇区
{
overlap.Offset=currentSec * 512; //异步IO 不需要SetFilePointer
overlap.OffsetHigh=(currentSec * 512)>>32 ;
DWORD bDone;
bool rc;
//从文件指针的位置开始读取一个现存的文件中的数据
rc=ReadFile(hDevice,//文件
buf1M,//指向接受读入数据缓存区地址的指针
1048576,//从文件中读入的数据字数
&bDone,//指向实际读入的字节数指针
&overlap);
if(rc)
{
// qDebug()<<"请求立即被返回";
} else
{
if (GetLastError() == ERROR_IO_PENDING)
{
//qDebug()<<"请求已排队,正在等待\n";
WaitForSingleObject(hDevice, INFINITE);
//qDebug()<<"请求已完成.\n";
rc = GetOverlappedResult(
hDevice,
&overlap,
&bDone,
FALSE
);
//qDebug()<<"结果是 "<< rc;
}
else
{
//qDebug()<<"读取文件时出错";
}
}
}
//等待不要 INFINITE
WaitForSingleObject(hDevice, /*INFINITE*/ maxTmOut);
rc = GetOverlappedResult(
hDevice,
&overlap,
&bDone,
FALSE
);
if(! rc)
{
CancelIoEx(hDevice, &overlap);
}