编写第一个HelloWorld驱动程序
来源:互联网 发布:npm 淘宝源 编辑:程序博客网 时间:2024/06/06 02:58
开发应用程序需要用到SDK,内核编程需要使用WDK(Windows Driver Kit),WDK已经自带所需要的头文件,库,C/C++语言及汇编语言的编译器与链接器,所有完全可以不用安装Visual Studio。
1.首先我们下载安装WinDDK,安装过程没有需要特备注意的地方,只有两点:
(1)安装到一个简单一点的路径,最好是根目录。而且尤其要注意避免在安装路径上出现空格,否则会出现编译问题
(2)选择“完全安装”,否则会错过一些代码例子。
2.编写第一个C文件
首先打开记事本新建一个文件,然后把文件命名为first.c,在first.c中写入下列代码:
////// @file first.c/// @author /// @date /// #include <ntddk.h>// 提供一个Unload函数只是为了VOID DriverUnload(PDRIVER_OBJECT driver){// 但是实际上我们什么都不做,只打印一句话:DbgPrint("goodbye");}// DriverEntry,入口函数。相当于main。NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path){// 这是我们的内核模块的入口,可以在这里写入我们想写的东西。// 我在这里打印一句话。因为”Hello,world” 常常被高手耻笑,所以// 我们打印一点别的。DbgPrint("first: Hello, my salary!");// 设置一个卸载函数便于这个函数能退出。driver->DriverUnload = DriverUnload;return STATUS_SUCCESS;}上面的DriverEntry是每个内核模块的入口,相当于应用程序编程中的main函数,在加载这个模块时被系统进程System调用一次。在其中我们写了DriverUnload函数,这个模块可以被动态的卸载(这样方便我们调试程序)。
现在建立一个文件夹first,然后把first.c文件保存在这个目录下,下面简单介绍下编译的方法。
3.编译一个工程
前面已经建立了工程first,虽然这个工程只有一个first.c文件作为代码文件,现在必须在这个目录下增加这两个文件,以便WDK的build工具可以build它。其中一个文件的名字必须是makefile,这个文件的内容是固定的,如下:
## DO NOT EDIT THIS FILE!!! 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的文件,这个文件的内容关系到这个模块要编译哪些文件,以及编译出来的.sys文件的名字,我的内容是这样的:
TARGETNAME=firstTARGETTYPE=DRIVERSOURCES=first.c其中TARGETNAME表示名字,编译出来之后,模块的名字为first.sys,SOURCES表示要编译的.c文件,如果有多个,请用空格分隔。
下面从开始菜单中打开WDK的build环境配置,如图:
如果你最终是在XP系统中运行这个程序,则选择XP,根据你最终运行程序的系统来选择。然后会有checkd和free另种版本可供选择,测试选择checkd版本,最后发布选择free版本。
出现了一个控制台,这个控制台已经配置好了编译环境,进入到我们需要编译的目录中,然后build即可
编译结束,first.sys出现在\first\objchk_wxp_x86\i386下。
这个文件不像普通的exe文件可以双击执行,它需要一个安装工具进行安装。
4.安装编译好的内核模块
这里选择的是srvinstw.exe。安装好之后打开:
(1)选择安装服务并单击下一步按钮,然后找到first.sys,这时需要输入服务名称,可以任意取名,在这里输入first,名字只要不和已经存在的服务名称冲突即可。
(2)输入.sys的路径,注意要进行手工输入,浏览是找不到的
(3)选择设备驱动,下一步
(4)输入“NT设备驱动器名”,不需要输入任何东西,直接点击下一步
(5)选择手动,方便操作。
5.运行安装好的内核模块。
cmd打开控制台,输入net start first 看到服务启动成功就可以了。net stop first用于停止服务。
输出的结果如何看到呢?下一篇将介绍Windbg的配置以及在虚拟机中运行内核模块。
- 编写第一个HelloWorld驱动程序
- helloworld第一个驱动程序
- Linux设备驱动程序(1)【第一个驱动程序:HelloWorld】
- 编写第一个Android程序------HelloWorld
- VScode编写第一个Python程序HelloWorld
- Eclipse + vs2013 编写第一个JNI HelloWorld
- 第一个Java程序(HelloWorld)的编写
- 嵌入式驱动编写-第一个驱动程序
- 编写第一个程序HelloWorld(你好,世界)
- ccsv6 c6455第一个helloWorld程序的编写调试
- 第一个驱动程序环境配置,编写与调试(1)
- 第一个驱动程序环境配置,编写与调试(2)
- 第一个java HelloWorld
- 第一个模块HelloWorld
- 第一个helloworld程序
- D3D 第一个HelloWorld
- Android第一个HelloWorld
- 第一个程序:HelloWorld
- R语言适配问题集锦
- Default Access Modifiers (C#)
- corosync+pacemaker高可用
- matlab代码
- eclipse自定义右键菜单选项
- 编写第一个HelloWorld驱动程序
- Apache Kafka 0.9.0 教程 中文版 1. Getting Started
- MVC模式
- ubuntu 12.04下软件原更新、软件安装及卸载
- osg的材质共享问题
- 获取网页缓存图片 --- 转至4app海浪whde
- php pChart库使用笔记
- The Java™ Tutorials — Concurrency :Starvation and Livelock 饥饿和活锁
- TinyOS视频第七集内容介绍