mingw32 在我包含 ddk/winddk.h 时给出错误



我是 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"的未定义引用收集2:LD 返回 1 个退出状态

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

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

我切换到Visual C++ Express,下载了WDK,从Project Property->c/c ++.. ->附加包含目录(C:\WinDDK\7600.16385.1\inc\ddk;C:\WinDDK\7600.16385.1\inc\api;(

但是

(我讨厌这个,但是!我收到许多编译错误,例如

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

我的代码:

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

如果有人有想法,请帮忙!

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

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

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

好吧,您应该了解您的工具。在Windows上开发KM(至于 许多其他平台(不是孩子的游戏。如果 UM 应用崩溃,则 应用程序死亡。如果驱动程序崩溃,系统将死亡。请重新考虑 使用不受支持的工具创建 Windows KM 驱动程序。不要 提到您对驱动程序的想法似乎不存在 上面的代码片段。它与 UM 完全不同,不应该 掉以轻心。

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

正如我之前指出的,您混合了用户模式 (UM( 和内核模式 (KM( 概念。这根本行不通。没有如果和但是。几年前,人们甚至认为C++不是编写KM代码的正确语言。主要是因为new的语义以及分页和非分页池的含义。如今,C++被接受进行类型检查。那里我们有下一件事"池",那是什么?你至少要学习Windows内部的基础知识,恐怕至少"Windows ????内部"我当年读过并没有完全削减它。你会想要一本关于驱动程序的书,比如Oney的"编程Microsoft Windows驱动程序模型",或者从OSR的人那里得到一些书 - 包括旧书。即使是NT4时代的非常古老的书籍仍然包含许多有价值的信息,即使你可能想要至少Windows 2000的东西,因为Windows 2000中的PnP系统以及更多内容。

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

除了页面缓冲

池和非页面缓冲池之间的区别之外,您还必须学习诸如 IRQL 之类的概念以及您可以在哪个 IRQL 上执行的操作。此外,大多数人认为驱动程序是"程序",这是另一个谬误。人们可以更多地将它们与 DLL 进行比较,即使这种比较也有其缺点。驱动程序很难维护全局状态,因为来自 UM 和 KM 中各种进程的许多线程可能会用请求敲击它。所有这些仍然必须以合理的速度运行。您可能还想学习WinDbg等工具,即使使用新的VS 11 WDK集成,您可能不再需要它(VisualKD是同一问题的较旧选项(。

如果您认为您可以在KM中摆脱Windows UM编程技能,请再想一想!我能想象到的最佳方案是,你的驱动程序编写得很糟糕,并且只能工作,因为你使用了 WDF 中较新的驱动程序模型之一,它简化了许多原本需要深入了解的内容。但是,它会可靠地运行吗?您必须考虑到崩溃的程序只会使程序崩溃,但崩溃的驱动程序将不可避免地使操作系统崩溃,其影响可能仅在以后才会变得清晰。特别是考虑到PC也用于医院或核电站。

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

相关内容

最新更新