0

我是 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): undefined reference to `_ imp _KeInitializeTimer@4' collect2: ld returned 1 exit status

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

编辑:[正如其他人已经评论过的,我经历过(!)请尽量避免使用其他平台进行 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;
     */
}

如果有人有想法请帮忙!

4

2 回答 2

3

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

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

于 2012-05-04T22:34:52.727 回答
1

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

好吧,你应该知道你的工具。在 Windows(与许多其他平台一样)上为 KM 开发不是儿戏。如果您的 UM 应用程序崩溃,该应用程序就会死掉。如果您的驱动程序崩溃,系统就会死机。请重新考虑使用不受支持的工具来创建 Windows KM 驱动程序。更不用说上面的代码片段似乎不存在您对驱动程序的想法。它与UM完全不同,不应掉以轻心。

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

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

于 2012-05-15T10:37:50.520 回答