我能用Delphi 2010编写Windows驱动程序吗?

19

我一直听说Delphi几乎可以做到C++所能做的一切......除了编写Windows驱动程序。这是正确的吗?如果是,为什么呢?

我最近在网上阅读了一篇博客文章,可能表明了使用Delphi编写驱动程序的可能解决方案,但它已经过去3年了,我不知道这些信息的准确性。

所以,使用最新版本的Delphi(2010),是否有技术可能编写Windows驱动程序?


6
Delphi也不能修复一颗破碎的心(但公平地说,这是C++的GCC扩展)。 - Shog9
3
但是 Delphi 能在夜晚保暖你吗? - PostMan
不错的尝试。http://www.virustotal.com/file-scan/report.html?id=8526bd7996583e572d069e8de46de9a111a8136ed964b571b7d512fdf4fccdcc-1289846438 - Free Consulting
4个回答

20
可能在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调试器之一使用的调试符号格式。那么克服这些问题的真正意义是什么呢? - mghie
64位驱动程序的要求实际上是Vista/Windows 7标志计划的要求。它适用于设备而非驱动程序本身。 - MSalters
这正是我正在寻找的信息。谢谢! - Mick

7
你可以使用任何编译成PE格式的DLL的语言来编写Windows驱动程序,只要它没有外部依赖项(除了核心中允许加载的那些),可以调用STDCALL链接的函数并导出STDCALL链接的函数。
我认为最困难的部分是不包含未批准的外部依赖项。 :)

1
关于不允许未经批准的外部依赖项,John提出了一个好观点(+1)。我的第一反应是“当然”。但是,由于Delphi将提供_winmain(),OP可能会遇到麻烦。 - Mawg says reinstate Monica
它还必须支持函数指针,因为一个不指向驱动程序任何函数的DRIVER_OBJECT是没有什么用处的。并且一些PE头字段必须设置为特殊值(虽然我想这可以在链接后修复)。 - bk1e
@bk1e:说得好。理论上,链接器也可以填充DRIVER_OBJECT的某些部分,但是语言支持的函数指针会更加清晰明了。 - John Knoeller
即使在生成的模块中始终包括 System unit 和 SysInit,仍然使用了一些不可在内核中使用的外部符号。例如,让 Delphi 生成的代码支持外部依赖要求是相当困难的。 - Ritsaert Hornstra
@PhiS:我并不是在说它不能工作,只是即使它不能工作,你也可以(理论上)让它工作。 - John Knoeller

4

1

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

但是还没有提到的最后一个陷阱(我认为)是您需要从DDK头文件中翻译成亿万复杂的结构和宏。特别是翻译一些复杂的宏可能非常棘手。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接