初始化磁盘时访问被拒绝



我有以下代码:

if (APartitionStyle = 0) then //mbr
  begin
    hDevice := CreateFile(
                            PChar(ADisk),
                            GENERIC_WRITE and GENERIC_READ,
                            FILE_SHARE_WRITE and FILE_SHARE_READ,
                            nil,
                            OPEN_EXISTING,
                            0,
                            0);
    error := SysErrorMessage(GetLastError);
    if (hDevice = INVALID_HANDLE_VALUE) then
    begin
      error := SysErrorMessage(GetLastError);
      result := error;
    end;
    dwIoControlCode := IOCTL_DISK_CREATE_DISK;
    dsk.PartitionStyle := PARTITION_STYLE_MBR;
    dsk.mbr.Signature := Random(9999);
    lpInBuffer := @dsk;
    nInBufferSize := sizeof(CREATE_DISK);
    lpOutBuffer := nil;
    nOutBufferSize := 0;
    lpOverlapped := nil;
    bresult := DeviceIOControl(
                                hDevice,
                                dwIoControlCode,
                                lpInBuffer,
                                nInBufferSize,
                                lpOutBuffer,
                                nOutBufferSize,
                                lpBytesReturned,
                                lpOverlapped);
    if not bresult then
    begin
      error := SysErrorMessage(GetLastError);
      result := error;
    end;

我已执行代码为管理员或系统以及用户(使用Admin Privilegs)。

我读过类似的东西:驱动程序已锁定。代码中是否缺少一些东西?

手柄是成功创建的。在deviceiocontrol上,我遇到了一个错误"访问被拒绝"。

您将不正确的值传递给CreateFile()。您正在使用and操作员组合位标志:

hDevice := CreateFile(
                        PChar(ADisk),
                        GENERIC_WRITE and GENERIC_READ, { = 0 ! }
                        FILE_SHARE_WRITE and FILE_SHARE_READ, { = 0 ! }
                        nil,
                        OPEN_EXISTING,
                        0,
                        0);

您需要使用or操作员:

hDevice := CreateFile(
                        PChar(ADisk),
                        GENERIC_WRITE or GENERIC_READ, { = $C0000000 ! }
                        FILE_SHARE_WRITE or FILE_SHARE_READ, { = $00000003 ! }
                        nil,
                        OPEN_EXISTING,
                        0,
                        0);

最新更新