Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将某些内容读取到原始磁盘,然后在C++;?_C++_Windows_Memory_Filesystems_Disk - Fatal编程技术网

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