【问题标题】:Can I write Windows drivers with Delphi 2010?我可以用 Delphi 2010 编写 Windows 驱动程序吗?
【发布时间】:2011-01-16 20:02:05
【问题描述】:

我一直听说Delphi 几乎可以做任何 C++ 可以做的事情...除了编写 Windows 驱动程序。这是正确的,如果是,为什么?

我最近在网上阅读了一篇博文,可能标有possible solution for writing drivers with Delphi,但它已经有 3 年历史了,我不知道这个信息有多准确。

那么,使用最新版本的 Delphi (2010),在技术上是否可以编写 Windows 驱动程序?

【问题讨论】:

  • Delphi 也无法修复破碎的心(但公平地说,这是对 C++ 的 GCC 扩展)
  • 但是delphi可以让你在晚上保持温暖吗?
  • 不错的尝试。 virustotal.com/file-scan/…

标签: c++ delphi kernel delphi-2010 driver


【解决方案1】:

使用 Delphi 编写一些驱动程序在技术上是可行的,但就一般答案而言,我会说:你不能使用 Delphi 轻松编写驱动程序

首先,用户模式驱动程序(UMDF) 驱动程序和内核模式驱动程序(KMDF) 驱动程序之间存在差异。 Delphi 应该可以使用 UMDF 驱动程序。不过,KMDF 驱动程序并不容易实现,因为

1) Delphi 的链接器无法生成它们并且

2) Delphi 的目标文件格式与 Microsoft 链接器默认使用的 COFF 格式不同。

3) Delphi 的 RTL 假设它存在于用户模式中,并且可能会做某些在内核领域不应该做的事情(我认为例如处理异常的方式;还有不同的内存管理),所以你必须非常小心哪些 RTL 函数可以安全使用。 System 和 SysInit 单元也存在困难(请参阅 Ritsaert Hornstra 对此处另一个答案的评论)。

我并不是说如果你真的很投入,这些不是无法克服的问题(参见你链接到的帖子),但这并不简单。

其次,用于 Win64 的 KMDF 驱动程序(实际上我不了解 UMDF - 任何人都可以评论吗?)必须使用 64 位代码。由于目前还没有 64 位的 Delphi 编译器,所以绝对不能编写它们。

【讨论】:

  • +1,所有优点。除了能够使用 Delphi 创建驱动程序之外,您仍然无法正确调试它 - Delphi 不能自己做,也不能以 MS 调试器可以使用的格式创建调试符号。那么,克服这些问题的真正意义是什么?
  • 64位驱动要求实际上是Vista/Windows 7 logo程序的要求。它不适用于驱动程序本身,而是适用于设备。
  • 这正是我正在寻找的信息。谢谢!
【解决方案2】:

您可以使用任何语言编写 Windows 驱动程序,该驱动程序可编译为 PE 格式的 DLL,没有外部依赖项(批准加载到内核中的除外),可以使用 STDCALL 链接调用函数,并使用 STDCALL 链接导出函数STDCALL 链接。

没有未经批准的外部依赖项将是我认为的困难部分。 :)

【讨论】:

  • 关于没有未经批准的外部依赖的好点,约翰 (+1)。我的下意识反应是“当然”。但是 OP 会遇到麻烦,因为 Delphi 会提供 _winmain()
  • 它还必须支持函数指针,因为不指向任何驱动程序函数的DRIVER_OBJECT 不是很有用。并且某些 PE 标头字段必须设置为特殊值(尽管我认为可以在链接后修复)。
  • @bk1e:好点。理论上,链接器也可以填充 DRIVER_OBJECT 的部分内容,但语言支持的函数指针会如此干净得多。
  • 即使系统单元和 SysInit 总是包含在生成的模块中,也使用了一些在内核中不可用的外部符号。例如,让 Delphi 生成的代码支持外部依赖要求是一项壮举。
  • @PhiS:我并不是说它没有,只是你可以(理论上)让它工作,即使它没有。
【解决方案3】:
【解决方案4】:

我同意前面的两个答案。 我实际上是在一个特殊情况下完成的:打印监视器。这是在用户模式下运行的驱动程序的一种特殊情况,我可以在 Delphi 中编写一个。在那里使用 Delphi 肯定有一些好处。

但尚未提及的最后一个陷阱(我认为)是您需要从 DDK 头文件中翻译数以百万计的复杂结构和宏。尤其是翻译一些复杂的宏可能非常棘手。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多