18

在我一头扎进 C# 之前...

我一直觉得 C 或者 C++ 最适合在 Windows 上开发驱动程序。我不热衷于在 .NET 机器上开发驱动程序的想法。

但是 .NET 似乎是 MS 走向应用程序开发的方式,所以我现在想知道:

  • 人们是否在使用 C# 开发驱动程序?
  • 您是否必须做很多 API 挂钩,或者 C# 是否具有与内核交互而无需大量黑客的设施?
  • 谁能比通常情况下更接近 Ring 0 运行 C# 程序的可靠性和安全性?

我希望我的设备可以在 C# 中使用,如果 C# 中的驱动程序开发很成熟,那显然是要走的路,但如果不推荐的话,我不想在那里花很多精力。

  • 有哪些很好的入门资源,比如开发一个简单的虚拟串行端口驱动程序?

-亚当

4

8 回答 8

28

您不能在 C# 中制作内核模式设备驱动程序,因为运行时无法安全地加载到 ring0 并按预期运行。

此外,C# 不会创建适合作为设备驱动程序加载的二进制文件,尤其是关于驱动程序需要公开的入口点。在加载过程中对运行时的依赖跳转并分析和 JIT 二进制文件禁止直接访问驱动子系统加载二进制文件所需的直接访问。

然而,将一些设备驱动程序提升到用户模式的工作正在进行中,您可以在这里看到对 UDMF(用户模式驱动程序框架)团队的 Peter Wieland 的采访。

用户模式驱动程序更适合托管工作,但您必须搜索一下以了解是否直接支持 C# 和 .NET。我所知道的是内核级驱动程序仅在 C# 中不可用。

但是,如果您绝对必须用 C# 编写大量代码,则您可以制作 C/C++ 驱动程序和 C# 服务(或类似服务)并让驱动程序与托管代码对话。

于 2008-09-16T19:32:56.583 回答
4

这将以某种方式帮助您:Windows Driver Kit

于 2008-09-16T19:23:10.303 回答
3

这不是对您问题的直接回答,但如果您有兴趣,可以查看Singularity project

于 2008-09-16T19:18:59.877 回答
2

谁能比通常情况下更接近 Ring 0 运行 C# 程序的可靠性和安全性?

C# 在 .NET 虚拟机中运行,您不能将它移到比 VM 更靠近 Ring 0 的位置,并且 VM 在用户空间中运行。

于 2008-09-16T19:38:28.893 回答
2

如果您愿意尝试专有框架,Jungo 的 WinDriver 工具包支持 USB、PCI 和 PCI-E 设备的用户模式驱动程序开发(甚至在托管代码中)。

于 2009-11-18T03:31:12.597 回答
1

微软在托管代码操作系统领域有许多研究项目,换句话说就是用 Win32 API 杀死。

请参阅 Mary Jo Foley 的文章:重建遗产

于 2008-09-16T19:24:09.303 回答
1

在 .net 中编写设备驱动程序对于当前版本的 windows 没有意义。

<推测>
有传言说 MS 正在投入大量资金将 Singularity 提升到一个新的水平。只是寻找Midori。但那是 2015+
</speculation>

于 2008-09-16T20:01:13.223 回答
1

如果我没记错的话,Dokan 项目是一个用户模式文件系统驱动程序,它还允许系统驱动程序执行 .NET 代码:https ://github.com/dokan-dev/dokan-dotnet 。

因此,您可以开发一个 C#“驱动程序”(实际上是用户模式应用程序),然后由 C++ 内核模式驱动程序调用/调用。内核驱动程序可以简单地传递所有内容而无需处理数据并充当简单的包装器。
不用说,这是非常不安全的,你很可能会以 BSOD 结束(我试过了)。


轻度相关:

Cosmos 项目是一个开源操作系统,使用 C# 开发并运行完全
用 C#/F#/VB.NET/... 编写的“(内核)驱动程序”和用户级应用程序。

虽然这些在技术上是内核级别的驱动程序,但操作系统不再是 Windows,而是您自己的,所以我想这不是一个正确的答案......

于 2018-05-12T18:52:57.427 回答