【问题标题】:How do I use CreateFile to access a physical disk?如何使用 CreateFile 访问物理磁盘?
【发布时间】:2011-12-14 15:08:45
【问题描述】:

我在 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 编写的实际示例?谁能帮我理解如何使用它?

【问题讨论】:

标签: delphi freepascal lazarus fpc


【解决方案1】:

您的 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 将所有内容设置为零。使用@ 而不是& 来获取指向变量的指针。

【讨论】:

  • 感谢大家迄今为止的帮助。第一个链接 re USB 很有用,转换后的代码对我的理解同样有帮助。但是,在我的问题中我不清楚的一件事是,当我的程序的用户按下按钮时,我希望程序询问操作系统“你有什么磁盘?”所以它返回所有物理磁盘的列表。我不想做的是硬编码“\\.\PHYSICALDISKX” - 我需要程序来计算出有哪些磁盘,以便用户可以选择一个。从那里,我可以将其转换为 \\.\PHYSICALDISKX,如果有意义的话?
  • 是的,这是有道理的,但这不是你问的根本。获取物理磁盘列表与如何调用 CreateFile 完全无关。如果你不知道how to get such a list,那么请在 Stack Overflow 上发布一个新问题。
  • 我将查看这些示例并试一试,尤其是 Delphi 示例,尽管我需要一些东西来查询连接的设备,无论它们是否已安装(例如来自 Apple 的磁盘连接到 Windows PC 的计算机 - 将实际在总线上,但不一定安装)。 dskwipe 示例正是我所需要的,但那是另一个 C 示例。我已经按照您的建议做了,并提出了一个更具体的问题,如何在此处使用 Delph\Free Pascal 调用物理连接的磁盘列表:stackoverflow.com/questions/8519658/how-to-call-a-list-of-
猜你喜欢
  • 1970-01-01
  • 2010-09-24
  • 2011-11-01
  • 2012-12-28
  • 1970-01-01
  • 2015-01-23
  • 1970-01-01
  • 2015-01-19
  • 2016-12-10
相关资源
最近更新 更多