如何使用CreateFile访问物理磁盘?

Giz*_*eat 4 delphi freepascal lazarus fpc

我在Lazarus编程论坛上询问如何打开物理磁盘.我想允许用户在单击"选择磁盘"按钮时从系统中选择物理磁盘.Stack Overflow中有一些类似但不完全相同的示例(例如Delphi - 使用DeviceIoControl传递IOCTL_DISK_GET_LENGTH_INFO来获取闪存介质的物理大小(非分区)).

有很多C和C++使用的例子CreateFile(在文档中,特别是调用的例子DeviceIoControl)但我找不到任何Free Pascal或Delphi,我还不够好,我还没有找到如何做到这一点.

任何人都可以指向我解释它的链接的方向或更好仍然是用Delphi或Free Pascal编写的实际示例?任何人都可以帮我理解如何使用它吗?

Rob*_*edy 7

您的C示例包含以下代码:

/* LPWSTR wszPath */

hDevice = CreateFileW(wszPath,          // drive to open
                      0,                // no access to the drive
                      FILE_SHARE_READ | // share mode
                      FILE_SHARE_WRITE, 
                      NULL,             // default security attributes
                      OPEN_EXISTING,    // disposition
                      0,                // file attributes
                      NULL);            // do not copy file attributes
Run Code Online (Sandbox Code Playgroud)

将该函数调用转换为Delphi只需更改语法:

// wszPath: PWideChar

hDevice := CreateFileW(wszPath,
                       0,
                       FILE_SHARE_READ or
                       FILE_SHARE_WRITE,
                       nil,
                       OPEN_EXISTING,
                       0,
                       0);
Run Code Online (Sandbox Code Playgroud)

也就是说,:=用于分配,or组合位标志,nil空指针和0空文件句柄.

该函数调用如下:

#define wszDrive L"\\\\.\\PhysicalDrive0"

DISK_GEOMETRY pdg = { 0 }; // disk drive geometry structure

bResult = GetDriveGeometry (wszDrive, &pdg);
Run Code Online (Sandbox Code Playgroud)

再次,只需将语法更改为Delphi:

const wszDrive = '\\.\PhysicalDrive0';

var pdg: DISK_GEOMETRY;

ZeroMemory(@pdg, SizeOf(pdg));
bResult := GetDriveGeometry(wszDrive, @pdg);
Run Code Online (Sandbox Code Playgroud)

Delphi无类型字符串常量自动是它们需要在上下文中的任何类型,因此我们不需要L像C使用的任何前缀.反斜杠在Delphi中并不特殊,因此不需要进行转义.Delphi不允许在声明中初始化局部变量,因此我们使用ZeroMemory将所有内容设置为零.使用@而不是&获取指向变量的指针.

  • 是的,这是有道理的,但这根本不是*你所问的.获取物理磁盘列表与如何调用CreateFile完全无关.如果你无法弄清楚[如何获得这样的列表](http://stackoverflow.com/search?q=list+of+physical+disks),那么请在Stack Overflow上发布一个新问题. (2认同)