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

时间:2011-12-14 15:08:46

标签: delphi freepascal lazarus fpc

我在Lazarus编程论坛how to open a physical disk上问道。我想允许用户在单击“选择磁盘”按钮时从系统中选择物理磁盘。 Stack Overflow中有一些示例相似但不完全相同(例如Delphi - Using DeviceIoControl passing IOCTL_DISK_GET_LENGTH_INFO to get flash media physical size (Not Partition))。

有很多使用CreateFilein the documentation,尤其是an example of calling DeviceIoControl)的C和C ++示例,但我找不到任何Free Pascal或Delphi,我不够好尚未弄清楚如何做到这一点。

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

1 个答案:

答案 0 :(得分: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

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

// wszPath: PWideChar

hDevice := CreateFileW(wszPath,
                       0,
                       FILE_SHARE_READ or
                       FILE_SHARE_WRITE,
                       nil,
                       OPEN_EXISTING,
                       0,
                       0);

即,使用:=进行赋值,or用于组合位标志,nil用于空指针,0用于空文件句柄。

使用以下函数调用该函数:

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

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

bResult = GetDriveGeometry (wszDrive, &pdg);

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

const wszDrive = '\\.\PhysicalDrive0';

var pdg: DISK_GEOMETRY;

ZeroMemory(@pdg, SizeOf(pdg));
bResult := GetDriveGeometry(wszDrive, @pdg);

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