YJX_Driver_009_DDK_HelloWorld_NT
Posted DebugSkill
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了YJX_Driver_009_DDK_HelloWorld_NT相关的知识,希望对你有一定的参考价值。
1、
【01:55】.c 后缀名的文件,入口函数DriverEntry() 的默认调用方式是 _stdcall 。
.cpp的话,入口函数DriverEntry() 的默认调用方式是 _cdecl 。
【02:30】入口函数DriverEntry() 必须是以 _stdcall 来传递参数的
【03:45】PDRIVER_OBJECT // 此结构用来传递驱动对象,由I/O管理器传递进来的驱动对象
PUNICODE_STRING // 此结构用来指向此驱动负责的注册表,也就是驱动程序在注册表中的路径
【05:55】mini_ddk.c 的代码为:
1 // _stdcall 2 #include <ntddk.h> 3 4 int DriverEntry(PDRIVER_OBJECT A, PUNICODE_STRING B) 5 { 6 return 1; 7 }
【06:06】这里,用DDK的build来编译
【06:18】创建 文件makefile 和 文件Sources
【06:40】makefile 格式固定,且一般只有一行(不能有前导空格)
【06:52】"#"开始的一行,为注释
1 # 此文件 一般只有一行 并且不需要修改 不能有前导空格 2 !INCLUDE $(NTMAKEENV)\makefile.def
【07:20】重点讲 Sources文件的书写
1 # 下面这行 指定 生成驱动的名字 2 TARGETNAME=DDK_HelloWorld 3 # 下面这行 指定生成文件的类型,DRIVER 指驱动 4 TARGETTYPE=DRIVER 5 # 下面这行 指定生成驱动所在的路径(这样指定的话,DDK_HelloWorld.sys 就会生成在当前目录的 Check文件夹 中) 6 TARGETPATH=Check 7 # 下面这行 指定相关头文件所在的目录路径 8 INCLUDES=$(BASEDIR)\inc; 9 $(BASEDIR)\inc\wxp;10 11 ## 上面必须空一行 (是通过实践证明的,若这里不空一行的话,也是不能通过编译的) 12 # F:\WINDDK\3790.1830 等价于 $(BASEDIR) 13 # 下面这行 指定驱动源代码 *.cpp 或 *.c 14 SOURCES=mini_ddk.c
【11:18】这几个文件 mini_ddk.c / makefile / Sources ,必须放在同一个目录下。
【11:40】顺便讲一下 Sources文件中的 一行末尾的"\"(如上面的INCLUDE中),当含有多个路径的时候 可以继续往后面添加。这个"\"也可以删除,删除的话,后面的内容必须是写在同一行里面的(后面的内容不能写在下一行中),这个"\"就相当于 换行 的作用
【12:03】注意 INCLUDE中 每一个目录写完之后,后面是跟一个 分号,而 SOURCES中 文件名后面 是没有 分号 的。
【12:35】该驱动,什么都不做 它能够被正常的加载,但是不能被正常的卸载 ∵它没有 相关的卸载例程(回调函数)
【12:58】打开 DDK3790.1830 自带的命令行(Windows XP Checked Build Environment)
【13:03】设置目录路径(源代码所在的路径)
【13:10】输入命令 "build",看是否会报错 ==> 有报错信息
ZC:我这里居然么有报错哇
【13:55】他 是把 PUNICODE_STRING 写成了 PUNICDOE_STRING
【14:21】再次编译 通过了
【14:50】再次 强制编译生成驱动 "build -c"
ZC: 我记得 以前用过 类似"build -cZg"
【15:20】以后 将在 mini_ddk 的基础上,完善我们的驱动。如 创建默认的卸载例程
【15:38】这里(mini_ddk)写的不标准,如 DriverEntry 默认是放在init标识的一个内存节里面 但这里我没有这样做
2、
以上是关于YJX_Driver_009_DDK_HelloWorld_NT的主要内容,如果未能解决你的问题,请参考以下文章