编写第一个HelloWorld驱动程序
开发应用程序需要用到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=first
TARGETTYPE=DRIVER
SOURCES=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驱动程序相关推荐
- JAVA入门级教学之(编写第一个HelloWorld程序)
目录 1.创建一个HelloWorld.java文件 2.用记事本打开HelloWorld.java 3.接下来我们要完成xxx.java-->xxx.class的步骤 怎么解决javac不可用 ...
- 编写第一个Java程序:helloworld
配置好java开发环境后,我们可以编写第一个java程序(helloworld). 在开始编写java程序时,我们要知道java程序开发的三个步骤:编写.编译.运行. 编写阶段主要是由程序员编写后缀为 ...
- 用记事本编写第一个Java程序运行时 出现报错:错误: 类helloworld是公共的, 应在名为 helloworld.java 的文件中声明 public class helloworld {
在书本上盲人摸象的摸索学习Java,Java环境配置完成,安装好eclipse后,便兴冲冲的去在记事本上编写第一个Java程序,结果给破了一盆冷水,略懵 public class helloworld ...
- 06从零开始学Java之编写第一个Java程序HelloWorld
作者:孙玉昌,昵称[ 一一哥],另外[ 壹壹哥]也是我哦 CSDN博客专家.万粉博主.阿里云专家博主.掘金优质作者 配套开源项目资料 GitHub地址: https://github.com/SunL ...
- java 内核驱动程序_内核第三讲,进入ring0,以及编写第一个内核驱动程序.
内核第三讲,进入ring0,以及编写第一个内核驱动程序. 一丶进入ring0之前的简介 进入0环之前,我们要明白操作系统的设计,操作系统允许驱动程序使用In out等等特权指令来操作高2G的内存.那么 ...
- zynq学习02 新建一个Helloworld工程
http://www.cnblogs.com/Rmumu/p/5705502.html http://www.cnblogs.com/151009-on-the-way/p/5777848.html ...
- iOS 11开发教程(二)编写第一个iOS 11应用
iOS 11开发教程(二)编写第一个iOS 11应用 编写第一个iOS 11应用 本节将以一个iOS 11应用程序为例,为开发者讲解如何使用Xcode 9.0去创建项目,以及iOS模拟器的一些功能.编 ...
- 学习spring2--跟我一起学Spring 3(3)–使用Spring开发第一个HelloWorld应用
http://www.importnew.com/13246.html 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 我要投稿 更多频道 » - 导航条 -首页所有文章资讯Web架构基础技 ...
- 用java编写一个图书管理系统_手把手教你编写第一个java程序
安装完jdk后我们就可以试着编写第一个java程序了,让我们一起来试试吧! 第一步 点击开始--所有程序--附件--记事本,新建记事本,输入以下代码: class HelloWorld { publi ...
最新文章
- 里程碑:DTrace 切换到 GPL 许可证
- python画三维立体图-python_matplotlib画三维图
- php注入类,简单实用的PHP防注入类实例
- 《构建之法》读后感之项目计划
- 转正老板让你谈谈你的看法_让我们谈谈逻辑回归
- 如何查看光驱硬盘托架的尺寸_如何确定光驱位的硬盘托架的大小尺寸和接口
- 信息学奥赛C++语言:质因数分解
- 3dvary灯光材质为什么不亮_详解CG灯光渲染师的职业技能
- 5月20日发!索尼Xperia 1国行版官宣:骁龙855+4K“带鱼”屏
- 编程通用知识 文件流
- [ZJOI2006]物流运输
- Linux shell脚本详解及实战(二)——shell脚本之分支
- Python开发Http代理服务器 - socketref,再见!高德 - C++博客
- 学历真的重要吗?当然非常非常非常重要。
- 服务器PCI插槽上的固态硬盘,固态硬盘常见接口图解
- m1的docker-compose
- 事情永远都没有想象中那么好
- 宏碁笔记本关闭安全启动Secure Boot,就是改为Disabled
- Nexus 5设备调试
- ME3616 NBIOT模组对接OneNET教程以及STM32代码
热门文章
- springboot——关于template might not exist or might not be accessible的问题
- 如何卸载Chrome应用程序
- Mysql数据库基础第八章:窗口函数和公用表表达式(CTE)
- mysql 证书双向认证_https证书双向验证
- STM32正交编码器测速
- 【LTspice】【如何手动测量仿真波形的电压(差)值】
- 区块链新零售重构企业商业环境的信任体系,消费环境更安全可靠
- 用计算机来弹洪荒之力,如果不会支撑,纵使有“洪荒之力”也弹不强
- c4d怎么导入fbx_如何将3DMAX模型带材质导入C4D
- STM32玩矩阵开关(输入和输出)