当我包含ddk / winddk.h时,mingw32会出错

时间:2012-05-04 22:23:59

标签: winapi kernel mingw32 wdk

我是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退出状态

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

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

我切换到Visual C ++ Express,下载了WDK,给出了Project Property-&gt; c / c ++的其他包含路径.. - &gt;其他包含目录(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;
     */
}

如果有人有意,请帮助!

2 个答案:

答案 0 :(得分:3)

您是否确定ntdef.h是明确包含还是由某些#define值设置?这是定义NTSTATUS的标头,并且当未定义符号/类型时,错误消息是通常吐出的gcc

在任何情况下,使用非MS编译器开发Windows设备驱动程序几乎肯定比使用Microsoft自己的工具链有更多问题。

答案 1 :(得分:1)

达拉达基,你还不太清楚我以前写的是什么。它不仅仅是工具链的重要组成部分。正如我所指出的那样,你将无法获得驾驶员的认证(尽管你可能会得到它 - 或者.cat - 交叉签名)。我支持评论中的每一句话:

  

嗯,你应该知道你的工具。在Windows上开发KM(至于   许多其他平台)不是孩子的游戏。如果您的UM应用程序崩溃了,那么   应用程序死了如果您的驱动程序崩溃,系统将死亡。请重新考虑   使用不受支持的工具来创建Windows KM驱动程序。不是   提到你的驱动程序的想法似乎是不存在的   上面的代码片段。它与UM完全不同,不应该   小心翼翼。

即使现在在您的上一次尝试中,除了拼写错误的main(作为mian),您似乎也不知道驱动程序需要一个名为DriverEntry的入口点,并且这个参数与经典main完全不同。

正如我之前所指出的,您正在混合用户模式(UM)和内核模式(KM)概念。这根本行不通。没有ifs和buts。几年前,人们甚至认为C ++不是编写KM代码的正确语言。主要是因为new的语义以及分页和非分页池的含义。这些天C ++被接受进行类型检查。在那里我们有下一个“池”,这是什么?你必须至少学习Windows内部的基础知识,而且我担心至少我读过的“Windows ???? Internals”版本并没有完全削减它。你想要得到一本关于驱动程序的正确书籍,例如Oney的“编写Microsoft Windows驱动程序模型”或者来自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是用于构建OS(即Windows)本身的环境的子集。这意味着你可以使用Vim或任何你喜欢的编辑器,仍然可以构建你的驱动程序。 毕竟,WDK的构建环境是nmake - 基于,顶部有一个名为build的应用程序,文件夹中的sources文件是中心生成过程中的文件。看看WDK中的任何一个样本,都有很多。但最重要的是RTFM(阅读友好手册)。 WDK文档非常出色,特别是如果您从Windows NT4,2000或甚至XP时间进行比较。