【问题标题】:mingw32 gives error when I include ddk/winddk.h当我包含 ddk/winddk.h 时,mingw32 给出错误
【发布时间】:2012-05-04 22:23:58
【问题描述】:

我是 Win 环境的新手,尝试编写使用 win 内核 API 但在 Ubuntu 10.04 上的代码......使用 mingw32(更具体地说,i586-mingw32msvc)

我的代码:

#include<ddk/winddk.h>
int main()
{
        return 0;
}

但是我在 ddk/winddk.h 标头中遇到了很多错误: 编译为:i586-mingw32msvc-gcc WaitForSingleObj_2.c

所有错误都是这样的:

/usr/lib/gcc/i586-mingw32msvc/4.2.1-sjlj/../../../../i586-mingw32msvc/include/ddk/winddk.h:9208: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'NTSTATUS'

我错过了什么吗?当我尝试使用头文件 iostream 和 windows.h 进行编译时,效果很好。

编辑:

#include<ntdef.h>
#include<ddk/ntddk.h>
#include<ddk/winddk.h>
#include<ddk/ntddndis.h>

int main()
{
        KTIMER *timer;
        KeInitializeTimer(timer);
        return 0;
}

直到 KTIMER 没问题,现在是新错误: /tmp/cc0epAQA.o:WaitForSingleObj_2.c:(.text+0x1d): 未定义引用`_imp_KeInitializeTimer@4' collect2: ld 返回 1 个退出状态

谁能告诉我,现在要包含哪个头文件?

编辑:[正如其他人已经评论过的,我经历过(!)请尽量避免使用其他平台进行 Windonws 内核开发]

我切换到 Visual C++ Express,下载了 WDK,从 Project Property->c/c++ .. ->Additional Include directory (C:\WinDDK\7600.16385.1\inc\ddk;C:\WinDDK \7600.16385.1\inc\api;)

但是(我讨厌这个但是!)我遇到了很多编译错误,比如

    1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\crtdefs.h(543): error C2143: syntax error : missing ')' before 'const'
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\crtdefs.h(543): error C2143: syntax error : missing '{' before 'const'
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\crtdefs.h(543): error C2059: syntax error : ','
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\crtdefs.h(543): error C2059: syntax error : ')'
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\crtdefs.h(550): error C2143: syntax error : missing ')' before 'const'

我的代码:

#include <wdm.h>
int mian()
{
    /*
     * PKTIMER Timer;
     */
}

如果有人有想法请帮忙!

【问题讨论】:

  • 你确定这是顶级头文件吗?您需要哪些功能和类型?这是要包含的正确头文件吗?
  • 好吧,Windows.h 在内核模式代码中也没有意义。此外,即使您不喜欢听到它,也应该避免使用非 WDK 编译器编写驱动程序。如果需要,请使用 WINE。无论哪种方式,顶级标题取决于您的驱动程序模型,并且是 ntddk.hwdm.h ...
  • 我会使用微软的工具链来做这件事,否则在交叉编译中会出错的地方太多了。 VmWare Player 是免费的,因此您仍然可以“在”Linux 下进行开发,尽管您可能需要 Windows 本身的许可证。 VS Express 也是免费的,但您必须确认它可以执行设备驱动程序。
  • @Dhara Darji:不需要 VS。需要的是 WDK 构建环境,它完全独立于 VS 和 VS 编译器(过去一直依赖于 XP DDK,可能会在 VS 11 中再次依赖)。它们都是命令行工具,出于所有实际目的,它们都应该在 WINE 中工作。这意味着您仍然可以在 Linux 上使用您最喜欢的 IDE/编辑器...
  • 由于@STATUS_ACCESS_DENIED 和paxdiablo 解释的原因,您的计划几乎肯定会失败。我建议用锋利的棍子戳自己的眼睛,而不是尝试使用不受支持的工具开发 Windows KM 驱动程序。哦,你的司机获得 MS 认证的几率是多少?几乎为零。

标签: winapi kernel mingw32 wdk


【解决方案1】:

您确定包含ntdef.h,无论是显式还是通过设置某些#define 值?那是定义 NTSTATUS 的标头,并且该错误消息是 gcc 通常在未定义符号/类型时吐出的消息。

无论如何,使用非 MS 编译器开发 Windows 设备驱动程序几乎肯定会比使用 Microsoft 自己的工具链遇到更多问题。

【讨论】:

  • 我尝试包含 ... 得到相同的错误,错误消息不仅针对 NTSTATUS,还针对 'void'、'PBOLEAN'、'ULONG' 等!!跨度>
  • @DharaDarji:paxdiablo 是对的。尝试使用 Windows DDK 以外的工具开发 Windows 设备驱动程序几乎肯定会失败,或者至少非常困难。使用 Visual Studio 编译器(WDK 编译器识别 VS 不识别的选项)开发驱动程序甚至不容易,有时甚至是不可能的。设备驱动程序通常是操作系统特定的东西。尝试使用其他操作系统的工具在任何平台上都是一个糟糕的选择。
  • @CareyGregory 对,我同意你的看法,我修改了,现在我相信使用 VC++ express,Windows7 上的 WDK 套件应该没问题......让我删除我的第一次尝试,现在这是误导
【解决方案2】:

Dhara Darji,你还没有完全理解我之前写的内容。重要的不仅仅是工具链。正如我指出的那样,您将无法获得驱动程序认证(尽管您可能会获得它 - 或 .cat - 交叉签名)。我支持我评论中的每一个字:

嗯,你应该知道你的工具。在 Windows 上为 KM 开发(至于 许多其他平台)不是孩子的游戏。如果您的 UM 应用程序崩溃,则 应用程序死了。如果您的驱动程序崩溃,系统就会死机。请重新考虑 使用不受支持的工具来创建 Windows KM 驱动程序。不 提到您对驱动程序的想法似乎不存在 上面的代码sn-p。它与UM完全不同,不应该 掉以轻心。

即使现在在您最后一次尝试中,除了拼写错误的main(如mian),您似乎并不知道驱动程序需要一个名为DriverEntry 的入口点,并且它使用的参数与经典的main

正如我之前指出的,您正在混合用户模式 ​​(UM) 和内核模式 (KM) 的概念。这根本行不通。没有如果和但是。几年前,人们甚至认为 C++ 不是编写 KM 代码的正确语言。主要是因为new 的语义以及分页和非分页池的含义。如今,C++ 因其类型检查而被接受。我们有下一个东西“池”,那是什么?你必须至少学习 Windows 内部的基础知识,而且我恐怕至少我在那些日子里读到的“Windows ???? Internals”版本并没有完全削减它。你会想要一本关于驱动程序的合适的书,例如 Oney 的“Programming the Microsoft Windows Driver Model”或一些来自 OSR 的书——包括旧书名。即使是来自 NT4 时代的非常古老的书籍仍然包含许多有价值的信息,尽管您可能会想要至少适用于 Windows 2000 的东西,因为 PnP 系统的大修以及 Windows 2000 中的更多功能。

OSR 也是一个出色的在线资源,但我必须提醒您:他们正在销售课程,而且这些课程非常出色。自然,他们不会提供在线可用资源中的所有细节。我以为我对驱动程序编程有所了解,直到 2005 年我参加了他们的两门课程。他们还托管了三个邮件列表

除了分页池和非分页池之间的区别之外,您还必须学习诸如 IRQL 之类的概念以及在哪个 IRQL 上可以做什么。此外,大多数人将驱动程序视为“程序”,这是另一个谬误。人们可以将它们与 DLL 进行比较,尽管这种比较也有其缺点。驱动程序很难维护全局状态,因为来自 UM 和 KM 中不同进程的许多线程可能会通过请求来敲击它。所有这一切仍然必须以合理的速度运行。您可能还想学习 WinDbg 等工具,即使有了新的 VS 11 WDK 集成,您可能不再需要这些工具(VisualKD 是解决相同问题的较旧选项)。

如果您认为您可以在 KM 中掌握 Windows UM 编程技能,请再想一想!我能想象的最好的情况是,你的驱动程序写得不好,并且只能工作,因为你使用了 WDF 中最新的驱动程序模型之一,它简化了许多原本需要深入了解的事情。但是,它会可靠运行吗?您必须考虑到崩溃的程序只会使程序崩溃,但您的崩溃驱动程序将不可避免地导致操作系统崩溃,其影响可能要到以后才会清楚。尤其是考虑到 PC 也用于医院或核电站。

还有最后一点:正如我之前指出的那样,您根本不需要 Visual Studio。无论是 Express 版本还是其他版本。原因是据说 WDK 是用于构建操作系统(即 Windows)本身的环境的子集。这意味着您可以使用 Vim 或任何您喜欢的编辑器并仍然构建您的驱动程序。 毕竟,WDK 的构建环境是基于nmake,顶部有一个名为build 的应用程序,您的文件夹中的sources 文件是您制作过程中的中心文件。看看 WDK 中的任何一个样本,都有很多。但最重要的是 RTFM(阅读友好手册)。 WDK 文档非常好,特别是如果您有 Windows NT4、2000 甚至 XP 时代的比较。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 2016-09-05
    • 1970-01-01
    • 2013-06-08
    相关资源
    最近更新 更多