Chinaunix首页 | 论坛 | 博客
  • 博客访问: 303162
  • 博文数量: 48
  • 博客积分: 2635
  • 博客等级: 少校
  • 技术积分: 495
  • 用 户 组: 普通用户
  • 注册时间: 2005-02-16 18:07
个人简介

软件开发领域都关心。

文章分类

全部博文(48)

文章存档

2013年(1)

2012年(1)

2011年(4)

2010年(3)

2009年(4)

2008年(7)

2007年(13)

2006年(3)

2005年(12)

分类: WINDOWS

2007-09-26 19:32:16

Hello World是程序设计的经典,几乎所有的语言教学都以此为开头。本教程也借此开篇。
先看看C的Hello World:

int main()
{
    printf("Hello World!\n");
    return 0;
}

把它存为hello.c,用VC或者gcc hello.c就可以生成执行文件,运行执行文件就可以看到结果。
驱动程序的Hello World来的稍微复杂一点。
驱动程序的入口函数是DriveEntery.所以最简单的WDM驱动代码如下:

NTSTATUS
DriverEntry (
    IN PDRIVER_OBJECT DriverObject,
    IN PUNICODE_STRING RegistryPath
    )
{
    DbgPrint(("Hello World!\n"));
    return STATUS_SUCCESS;
}

要编译,运行并且看到这个Hello World的结果就要麻烦一些了。首先你得有(Driver Develpment Kit)DDK,可以到网上下载,或者买光盘。DDK里面提供了丰富的例子,一般的驱动程序,可以参考DDK里面的例子。

将文件存为hello.c, 当然前面先要include ddk的头文件:

#include <ntddk.h>

要编译这个文件,需要建一个make文件和resource文件。在ddk里面,make文件可以都一样。

makefile的内容应该是如下:

#
# DO NOT EDIT THIS Edit .\sources. if you want to add a new source
# file to this component. This file merely indirects to the real make file
# that is shared by all the driver components of the Windows NT DDK
#

!INCLUDE $(NTMAKEENV)\makefile.def

一般不要更改这个文件,如果要加入源文件应该编辑sources文件。

简单的source文件如下:

TARGETNAME=hello
TARGETPATH=obj
TARGETTYPE=DRIVER


SOURCES=hello.c

有了这3个文件就可以编译出驱动程序hello.sys了。

首先进入编译环境,开始->Development Kits->DDK XXXX->build enviorenments->windows XP->Windows XP Checked Build Environment.

进入这三个文件的存放目录,执行build。编译完成后,目录下产生了objchk_wxp_x86\i386,下面有个文件hello.sys,这就是我们第一步的成果了。

如何才能看到运行的结果呢?我们需要把这个驱动程序加载到操作系统中。最简单的加载办法是通过写注册表。这里有个.reg的文件,帮助修改注册表,也可以手动来修改。hello.reg如下:
 

REGEDIT4
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\hello]

"ErrorControl"=dword:00000001

#
# When to start the driver:
# At boot: Start=1
# Manually: Start=3
#
"Start"=dword:00000001

"Type"=dword:00000001

把我们编译好的hello.sys拷贝到系统的驱动程序目录下C:\WINDOWS\system32\drivers,然后重新启动操作系统,这个驱动就可以在启动的时候被加载了。要看到Hello World!可以按照debugview这个软件,这是简单好用的驱动调试工具,它可以显示DbgPrint打印出来的log。要选择debugview的capture菜单里面的log boot,可以buffer操作系统boot的时候的log。

重启之后可以从debugview里面看到log。

阅读(4541) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-07-13 09:34:07

嘿嘿嘿嘿,你真是太好啦~,向你学习,向你致敬~, 我看了您的第四章,但是我主要想知道代码怎么写的,发个给我吧~,谢谢啦~ 我的邮箱:sunorr@gmail.com

chinaunix网友2009-07-09 08:52:55

除了在启动的时候加载驱动,可以在启动后加载吗?我在网上查的用scm加载,但是都不成功,这是为什么捏?想你求教。