Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.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++ CreateFile:对原始磁盘的直接写入操作;“访问被拒绝”Vista,Win7_C++_.net_C_Winapi_Windows 7 - Fatal编程技术网

C++ CreateFile:对原始磁盘的直接写入操作;“访问被拒绝”Vista,Win7

C++ CreateFile:对原始磁盘的直接写入操作;“访问被拒绝”Vista,Win7,c++,.net,c,winapi,windows-7,C++,.net,C,Winapi,Windows 7,相关的Microsoft文档是: 可执行文件是用C++编写的,它调用 CurrimeFILE()/Cuffe >打开SD卡,它有“强>没有文件系统< /强>。CreateFile()和连续的ReadFile()调用对于GENERIC\u READ来说是成功的,无需管理员权限 CreateFile对于GENERIC\u WRITE即使具有管理员权限也会失败。在资源管理器中,我在“属性”>“兼容性”>“权限级别”下设置了“以管理员身份运行”。我还尝试从管理员cmd运行可执行文件(以Ctrl+Sh

相关的Microsoft文档是:

可执行文件是用C++编写的,它调用<代码> CurrimeFILE()/Cuffe >打开SD卡,它有“强>没有文件系统< /强>。

CreateFile()
和连续的
ReadFile()
调用对于
GENERIC\u READ
来说是成功的,无需管理员权限

CreateFile
对于
GENERIC\u WRITE
即使具有管理员权限也会失败。在资源管理器中,我在“属性”>“兼容性”>“权限级别”下设置了“以管理员身份运行”。我还尝试从管理员cmd运行可执行文件(以Ctrl+Shift+Enter开始,“Administrator:”在窗口标题中,适当提升)。尽管如此,我还是得到了
错误\访问被拒绝
(0x5)

我是否必须向
CreateFile
传递其他内容?
我不知道安全属性是什么,我只在第92行和第48行传递NULL

或者,是否还应设置其他内容以使用管理员权限运行该流程?
A有关问题:






CreateFile文档中的MSDN中有注释:

对磁盘或卷的直接访问受到限制。有关详细信息,请参阅“帮助和支持知识库”中的“在Windows Vista和Windows Server 2008中更改文件系统和存储堆栈以限制直接磁盘访问和直接卷访问”


它指的是Vista/2008,但也可能适用于Win7。

我在从x86代码移植到x64代码时遇到了类似的问题。您提到您正在为SECURITY\u ATTRIBUTES参数传递
null
;在我真正开始创建/传递此参数之前,我自己使用此方法获得拒绝访问的错误。

很少只需要
泛型\u写入
。您很可能想要
通用的|读的|通用的|写的

虽然@MSalters的答案有道理,但这不是我的代码的工作方式。事实上,这是如此违反直觉,我花了几天时间确保代码确实有效

这些代码片段存在于经过验证的大众消费市场软件产品中。当需要修改磁盘上的结构时,它会卸载win32卷,以便修改NTFS或FAT文件系统结构。有趣的是,卷访问句柄是只读的:

    char    fn [30];
    snprintf (fn, sizeof fn, "\\\\.\\%s:", vol -> GetVolName ());

    vol_handle = CreateFile (fn, GENERIC_READ,
                            FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
                            OPEN_EXISTING,
                            FILE_FLAG_NO_BUFFERING | FILE_FLAG_RANDOM_ACCESS,
                            NULL);

    if (vol_handle == INVALID_HANDLE_VALUE)
    {
          // show error message and exit
    }
如果无法获得对卷或分区的写访问权限,如果用户在发出警告后授权卸载,则此代码将强制卸载:

if (!DeviceIoControl (vol_handle, FSCTL_DISMOUNT_VOLUME,
                                            NULL, 0, NULL, 0, &status, NULL))
{
    DWORD err = GetLastError ();
    errormsg ("Error %d attempting to dismount volume: %s",
                                                        err, w32errtxt (err));
}

// lock volume
if (!DeviceIoControl (vol_handle, FSCTL_LOCK_VOLUME,
                                            NULL, 0, NULL, 0, &status, NULL))
{
     // error handling; not sure if retrying is useful
}
然后,除了按512字节扇区定位文件指针外,写入操作相当简单:

    long    hipart = sect >> (32-9);
    long    lopart = sect << 9;
    long    err;

    SetLastError (0);       // needed before SetFilePointer post err detection
    lopart = SetFilePointer (vol_handle, lopart, &hipart, FILE_BEGIN);

    if (lopart == -1  &&  NO_ERROR != (err = GetLastError ()))
    {
            errormsg ("HWWrite: error %d seeking drive %x sector %ld:  %s",
                            err, drive, sect, w32errtxt (err));
            return false;
    }

    DWORD   n;

    if (!WriteFile (vol_handle, buf, num_sects*512, &n, NULL))
    {
            err = GetLastError ();
            errormsg ("WriteFile: error %d writing drive %x sectors %lu..%lu:  %s",
                            err, drv, sect, sect + num_sects - 1,
                            w32errtxt (err));
            return false;
    }
long hipart=sect>>(32-9);

long lopart=sect如果没有文件系统,则创建文件应失败。也许在读操作中,至少读一个字节才会失败,而写操作则试图在打开时创建一个实际的(空)文件。@DannyVarod读操作就像一个符咒,我读了大量的数据,数据是正确的。请参阅,
CreateFile
是处理没有文件系统的驱动器的方法。将什么值作为访问参数传递给
open\u device()
?@wallyk
GENERIC\u WRITE
,另请参阅。我已经在这个问题上设置了一个悬赏。让我们从基本问题开始:是否已请求独占写入访问权限?我已经读过,但我应该怎么做?有什么问题?在文档中,我读到“如果卷未装入或卷没有文件系统,则对文件系统和存储堆栈的更改不适用。”在我的情况下,没有文件系统。不幸的是,我只有VB.NET代码来显示这一点,由于我使用的是.NET framework,发布它可能只是浪费您的时间,但如果您希望我这样做,请告诉我。好的,这就是问题:)您能解释一下原因吗?不是100%确定,您还没有查看您的全部代码。许多“修改”式操作通过读取大量数据、更改所需的位并将整个数据块写回来工作。例如,你不能实际地将一个字节写入硬盘,但文件系统却假装你可以。显然,您需要读写权限。顺便提一下,SD卡的数据块大小非常大,通常为128k,这可能值得注意。我不知道Windows如何在较低的级别上处理此问题,但很可能您需要读取访问权限才能写入小于此级别的数量(在硬件级别,您需要将128k读到内存中,更改需要更改的部分,擦除块并将其写回;Windows内核可能会决定执行此操作需要读取访问权限,即使读取不是由用户级代码启动的)@Jules:这是对操作系统隐藏的。对不起,当我注意到你的答案时,我已经奖励了赏金。不管怎样,你能把你的答案说得更清楚一点吗?你是想说泛型单读可能足以获得写访问权限吗?@Ali:泛型单读确实是这样。一旦锁定成功,后续的写操作就可以正常工作了成功。至于分数,也许你可以高估一下?:-)是的,对于赏金我真的很抱歉,我高估了你的问题。我会试试你写的东西,如果它真的有效,我会在问题的末尾加一条注释。这是我现在能做的最好的了…谢谢你,它救了我一天。但是我仍然需要五个小时来弄清楚,对于\\.\PhysicalDriveX路径,没有通用的写,它不允许你在Windows 7上写。@daminetreg:我不知道自从几年前该公司出售以来,在Vista/Win7/Win8上运行我的代码的客户有什么反馈,但是从你的评论来看,API似乎更直观了。