C++ 如何将某些内容读取到原始磁盘,然后在C++;?
我想先向磁盘设备写入一些内容,然后读取相同的数据并进一步写入。我的代码如下所示:C++ 如何将某些内容读取到原始磁盘,然后在C++;?,c++,windows,memory,filesystems,disk,C++,Windows,Memory,Filesystems,Disk,我想先向磁盘设备写入一些内容,然后读取相同的数据并进一步写入。我的代码如下所示: std::string devicePath = "\\\\.\\PhysicalDrive0"; //'0' is only example here HANDLE source = CreateFile(disk.c_str(), GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, NULL,
std::string devicePath = "\\\\.\\PhysicalDrive0"; //'0' is only example here
HANDLE source = CreateFile(disk.c_str(), GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, NULL, NULL);
BOOST_TEST_REQUIRE(source, "Failed to create file handle.");
std::unique_ptr<CHAR[]> primaryBuffer(new CHAR[DEFAULT_FILESIZE]);
std::unique_ptr<CHAR[]> checkBuffer(new CHAR[DEFAULT_FILESIZE]);
for (auto i = 0; i < DEFAULT_FILESIZE; ++i) {
primaryBuffer[i] = 'x';
checkBuffer[i] = ' ';
}
WriteFile(source, primaryBuffer.get(), DEFAULT_FILESIZE, NULL, NULL);
//Here I move the pointer to write data in new place.
DWORD destination = SetFilePointer(source, DEFAULT_FILESIZE, NULL, FILE_BEGIN);
WriteFile(&destination, source, DEFAULT_FILESIZE, NULL, NULL);
ReadFile(source, primaryBuffer.get(), DEFAULT_FILESIZE, NULL, NULL);
ReadFile(&destination, checkBuffer.get(), DEFAULT_FILESIZE, NULL, NULL);
BOOST_TEST_MESSAGE(checkBuffer.get());
BOOST_TEST_MESSAGE(primaryBuffer.get());
std::string devicePath=“\\\.\\PhysicalDrive0”/'“0”是这里唯一的示例
HANDLE source=CreateFile(disk.c_str(),GENERIC_WRITE | GENERIC_READ,FILE_SHARE | READ | FILE_SHARE _WRITE,NULL,OPEN_ALWAYS,NULL,NULL);
BOOST_TEST_REQUIRE(源代码,“未能创建文件句柄”);
std::unique_ptr primaryBuffer(新字符[默认文件大小]);
std::unique_ptr checkBuffer(新字符[默认文件大小]);
用于(自动i=0;i
不幸的是,两个缓冲区都是不同的,我已经尝试了几乎所有的方法来检查出了什么问题。也许有人知道我做错了什么?将
&destination
作为1传递。WriteFile()
的参数看起来非常荒谬,传递source
为2也是如此。WriteFile的参数。你到底想做什么?@nos我正试图将内容从地址源
(我知道这是句柄
)复制到地址目标
。我不确定是否正确传递了地址,但您的destination
变量只是SetFilePointer()的返回值?将其作为WriteFile()所需的句柄传递没有任何意义。另外,如果您想从一个句柄读取数据并将其写入另一个句柄,则需要分两步执行,读取到缓冲区,然后将该缓冲区写入另一个句柄。请参阅WriteFile文档。物理驱动器0可能是系统驱动器,因此正在使用中。在这种情况下,使用重叠会更简单。如果您编辑问题并添加试图使用重叠的代码版本,我们可以建议出了什么问题。确保包含错误处理。需要检查的一点是,DEFAULT\u FILESIZE
是驱动器扇区大小的倍数,可能是512或4096。原始磁盘上的I/O必须是扇区对齐的。您可能还需要创建扇区对齐的缓冲区,例如,使用VirtualAlloc
而不是new
。哦,如果磁盘上安装了文件系统,您可能需要FSCTL\u LOCK\u VOLUME
。