我尝试使用SetFilePointerEx()
将磁盘的文件指针移动到特定的偏移量(文件的最后一个群集)。计算出的偏移量见:
LARGE_INTEGER dist;
dist.QuadPart = (output1.QuadPart * dwBytesPerSect) + ((lastExtent + lengthOfExtent - 1) * totalClusterSize);
BOOL res = SetFilePointerEx(hDevice, dist, nullptr, FILE_BEGIN);
if (!res){
// handle error
DWORD error = GetLastError();
cout<<GetLastError()<<endl;
cout << "'There is an error with SetFilePointerEX" << endl;
}
cout<<"This is the SetFilePointer distance: \n\n"<<dist.QuadPart;
然后我使用Readfile()
读取最后4k群集块:
DWORD nRead;
unsigned char *buff;
buff = new unsigned char[totalClusterSize];
BOOL fileFromVol = ReadFile(hDevice, //C drive
buff,
4096,
&nRead,
NULL);
if (fileFromVol == 0){ //Error handling
cout << "Error with fileFromVol" << "\n\n";
DWORD error = GetLastError();
cout<<error<<endl;
if (error == ERROR_ACCESS_DENIED){
cout << "error_access_denied"<<endl;
}
}
cout<<"\n\n"<<buff<<"\n\n";
memset(buff,NULL,4096);
因此,我的文件偏移量dist.QuadPart
始终是常量,但每次在同一文件上运行程序时,我的读缓冲区(buff
)都会更改十六进制值。
首先运行的例子:
This is the SetFilePointer distance:
3689362889266376704
008F4264
第二轮示例:
This is the SetFilePointer distance:
3689362889266376704
00E53CE8
为什么它不断变化的任何想法?
对于我的下一步,我需要向群集写入零。我可以使用memset()
在最后一个群集位置写入零吗?
答案 0 :(得分:0)
您要打印的值是缓冲区的地址,而不是其内容。并且缓冲区的地址不固定。当然,争论为什么缓冲区的地址可以改变是有点没有实际意义,因为你真的想打印出缓冲区的内容。
打印出数组的第一个元素:
cout<<"\n\n"<<buff[0]<<"\n\n";
你应该看到从磁盘读取的值。
其他一些评论:
unsigned char*
,而不是unsigned int*
。nRead
。