1、程序是调用汤总的程序,应该没什么问题。只是改了某些读取的分区的信息。
2、我把所有的地方都添加了日志,结果却发现还是那个地方出问题:在使用ReadFile读扇区的时候提示,“文件已经存在,不能创建”的错误。
3、听路哥的建议,把这个函数拆的简单点儿,啥都不带,只含日志。结果竟然报“error 87:参数错误”的错误,我更是无语了。
4、后来只能把错误定位在读取扇区的长度上了。一问汤总,才发现读扇区时,只能512位地读,而不是只读4位。
5、读扇区只能一下子读512字节的倍数,读其他的长度只会失败。
正确的代码如下:
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;
void main(int argc,char *argv[])
{
if (argc<2)
{
return ;
}
DWORD dwCB;
bool ret;
LARGE_INTEGER newoffset;
LARGE_INTEGER alignedOffset;
unsigned long alignedLength = sizeof(unsigned char)*512; //一开始这里是sizeof(unsiged char)*4,于是就出现那个错误。
unsigned int * lpSectBuff = (unsigned int *)malloc(sizeof(unsigned int));
alignedOffset.LowPart = 5*512;
alignedOffset.HighPart = 0;
char devName[100]="\\\\.\\PhysicalDrive0";
HANDLE hDev = CreateFile(devName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
cout<<hDev<<endl;
if (hDev == INVALID_HANDLE_VALUE)
{
printf("ReadSectors device CreateFile handle error ,GetLastError:%lu\n",GetLastError());
return ;
}
else
{
printf("ReadSectors device CreateFile handle succeed");
}
ret = SetFilePointerEx(hDev, alignedOffset, &newoffset, FILE_BEGIN);
if (ret== false)
{
printf(" ReadSectors SetFilePointerEx error fail11,GetLastError:%lu\n",GetLastError());
CloseHandle(hDev);
return ;
}
else
{
printf(" ReadSectors SetFilePointerEx succeed\n");
}
BOOL bRet = ReadFile(hDev, lpSectBuff, alignedLength, &dwCB, NULL);
if (bRet == FALSE)
{
printf("ReadSectors_l error,getlasterror:%lu. length= %x\n",GetLastError(),dwCB);
CloseHandle(hDev);
return ;
}
else
{
printf(" ReadSectors_l succeed ,already read length= %x\n",dwCB);
}
CloseHandle(hDev);
return ;
}