
驱动基础
花熊
毕业于西安交通大学
展开
-
6.driverbase-WDM和NT驱动
WDM要导入的的头文件是WDM.h和NT式驱动程序一样,入口函数同样是DriverEntry,且在C++编译的时候需要用extern"C"修饰 pDriverObject->DriverExtension->AddDevice = HelloWDMAddDevice; pDriverObject->MajorFunction[IRP_MJ_PNP] = HelloWDMPnp; p原创 2013-11-24 22:09:14 · 1483 阅读 · 0 评论 -
7.driverbase-驱动编译环境--x86 Checked Build Environment
x86:Windows是32位版本,和CPU是32位还是64位无关x64:64位版本的WindowsIA64:Intel的与x86不兼容的64位平台原创 2013-12-17 15:50:25 · 2989 阅读 · 0 评论 -
8.driverbase-makefile和source简单语法
makefile总是一句话不变:!INCLUDE $(NTMAKEENV)\makefile.defsourceTARGETNAME=HelloWDM //编译出来的驱动程序的名称TARGETTYPE=DRIVER //编译的类型是驱动程序编译DRIVERTYPE=WDM //驱动程序的类型是WDM驱动程序TARGETPATH=OBJ原创 2013-12-18 11:23:43 · 2344 阅读 · 0 评论 -
9.driverbase-WDM驱动在win7和XP下系统方式加载
xp:控制面板-->添加硬件再再ok,在设备管理器中可以看到:win7:点击添加过时设备后,操作就和xp一样了原创 2013-12-18 13:50:13 · 2170 阅读 · 0 评论 -
10.driverbase-prefmon查看驱动性能
1.查看性能,可以直接在命令行输入:perfmon打开性能管理器Processor: % Privileged Time:对应于处理器执行 Microsoft Windows 内核命令(例如处理 SQL Server I/O 请求)所用时间的百分比。 如果 Physical Disk 计数器的值很高时该计数器的值也一直很高,则考虑安装速度更快或效率更高的磁盘子系统。原创 2013-12-18 17:11:27 · 1080 阅读 · 0 评论 -
11.driverbase-IoGetDeviceObjectPointer源码(need ObDereferenceObject)
DDK Build编译的时候,使用3个文件来描述被编译的源码,其中SOURCES和Makefile是必须的,而DIRS则只在划分目录的时候有用。Makefile在这里作用并不大但是必须和SOURCES文件成对出现,关键还是SOURCES和DIRS文件。SOURCES文件用于描述其所在目录下,有哪些文件参与编译,编译的结果应该是什么(是一个lib还是一个sys?),输出目录在哪里,要传递原创 2013-12-25 18:30:02 · 1515 阅读 · 0 评论 -
12.driverbase-驱动对象、设备对象、DriverEntry、IoCreateDevice、符号链接、DriverUnLoad、WDM
1.驱动对象.typedef struct _DRIVER_OBJECT { CSHORT Type; CSHORT Size; // // The following links all of the devices created by a single driver // together on a list, and the Fla原创 2014-01-01 21:31:21 · 3290 阅读 · 0 评论 -
13.driverbase-内存管理相关函数
直接看PAGE_SIZE的大小就可以知道当前分页的大小//// Define the page size//#define PAGE_SIZE 0x2000驱动程序的不同函数运行在不同的进程中,DriverEntry和AddDevice函数是运行在系统进程中的(system)3: kd> !process sysmtemPROCESS 8a52a830 Sessio原创 2014-02-04 20:43:19 · 1215 阅读 · 0 评论 -
14.driverbase-字符串、文件、注册表相关函数
ANSI_STRING字符串和UNICOCE_STRING用KdPrint表示分别%Z和%wZ表示如:extern "C" NTSTATUS DriverEntry ( IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath ) { NTSTATUS status; KdPrint(("E原创 2014-02-07 22:48:46 · 1330 阅读 · 0 评论 -
17.driverbase—IOCtl的三种数据交互方式(buffer、direct、other)
简介DeviceIoControl的三种通信方式原创 2014-05-04 13:25:52 · 2185 阅读 · 0 评论 -
18.driverbase-自旋锁(SpinLock)wrk代码分析
http://hgy413.com/1335.html简介自旋锁的注意点和自旋锁实现原型代码原创 2014-05-04 19:18:48 · 1623 阅读 · 0 评论 -
5.driver-KdPrint用法(%格式说明)
#if DBG#define KdPrint(_x_) DbgPrint _x_#else#define KdPrint(_x_)#endif // DBGKdPrint使用方法类似printf,注意KdPrint(());使用的是双括号。KdPrint is identical to theDbgPrint routine in code that is compiled i原创 2013-07-23 11:37:22 · 1963 阅读 · 0 评论 -
3.driverbase-Wait函数和创建线程(sytem和本进程)
1. Wait函数用户模式下的WaitForSingleObject和WaitForMultipleObject都是依赖内核模式下的KeWaitForSingleObject和KeWaitForMultipleObjects函数实现的,其声明如下:NTSTATUS KeWaitForMultipleObjects( IN ULONG Count,// IN PVOID Ob原创 2012-08-25 18:02:00 · 1659 阅读 · 0 评论 -
2.driverbase-内存可读、可写、有效性、指针是否为空、深度校验字符串(随手代码)
1.如在ring3下,则要判断是否可读可写:KPROCESSOR_MODE PreviousMode; ULONG PID; PreviousMode = ExGetPreviousMode(); // 如果非内核模式,就要开始检查IN的这些参数都否可读 if (PreviousMode != KernelMode) { try { ProbeForRead(Cl原创 2012-08-25 16:10:17 · 3939 阅读 · 0 评论 -
GDT和LDT
先谈下个人理解:如果TI为0时,当然可以直接从GDT中找到段的基地址。如果TI不为0时,我们要先结合LDTR通过GDT来定位LDT,再通过给定的段选择子前13位在LDT中定位. 所以,以XXXX:yyyyyyyy格式表示一个虚拟地址来分析:如果XXXX的TI位为0,则1.GDTR定位到GDT2.取XXXX的高13位当作位置索引得到段描述符3.段描绘符中包含段的基址转载 2012-04-20 12:20:55 · 2641 阅读 · 2 评论 -
0.driverbase-控制寄存器(CR0~CR3)
控制寄存器(CR0~CR3)用于控制和确定处理器的操作模式以及当前执行任务的特性CR0CR0中含有控制处理器操作模式和状态的系统控制标志 PE:CR0的位0是启用保护(Protection Enable)标志。当设置该位时即开启了保护模式;当复位时即进入实地址模式。这个标志仅开启段级保护,而并没有启用分页机制。若要启用分页机制,那么PE和PG标志都要置位原创 2011-05-22 12:36:00 · 2248 阅读 · 0 评论 -
33.Windbg-VMware+windbg搭建双机调试(增加virtualKD)
虚拟机环境1.xp虚拟机用的是XP系统,找到XP系统打开系统盘(比如C盘),找到Boot.ini,去掉这个文件的只读属性,用记事本打开Boot.ini[boot loader]timeout=30default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS[operating systems]multi(0)disk(0)rdisk(0原创 2013-01-04 20:46:15 · 7659 阅读 · 0 评论 -
19.driverbase-分页与非分页宏定义
分页与非分页宏定义,#ifdef ALLOC_PRAGMA原创 2017-08-15 14:05:47 · 370 阅读 · 0 评论 -
4.driverbase-VS2008+DDKWIZARD+WDK基于WIN7编程环境配置
1、下载安装Visual Studio 2008。2、下载安装WDK:http://www.microsoft.com/en-us/download/details.aspx?id=118003、下载 ddkwizards(ddkwizard.exe) ddkbuild_cmd.zip (DDKBULID.CMD) ddkbuild_bat.zip(DDKBUILD.ba原创 2012-10-24 16:13:38 · 1788 阅读 · 0 评论 -
15.driverbase-IRP、IO_STACK_LOCATION、文件三种读写方式(buffer/driect/other)、DeviceIoControl
IRP简介文件读写的三种方式简介及windbg调试DeviceIoControl与驱动交互原创 2014-02-16 22:36:23 · 2510 阅读 · 0 评论 -
21.driverbase-多线程PsCreateSystemThread
NTKERNELAPINTSTATUSPsCreateSystemThread( __out PHANDLE ThreadHandle,// 得到新创建的线程句柄 __in ULONG DesiredAccess,// 创建的权限 __in_opt POBJECT_ATTRIBUTES ObjectAttributes,// 线程属性,一般设为NULL __in_原创 2017-08-17 14:53:39 · 552 阅读 · 0 评论 -
22.DriverBase-ObReferenceObjectByHandle通过Ring3句柄获得Ring0对象
ObReferenceObjectByHandle通过Ring3句柄获得Ring0对象原创 2017-08-17 17:06:58 · 1367 阅读 · 0 评论 -
23.driverbase-易错点:CreateFile返回1
原因:未定义IRP_MJ_CREATE的派遣函数,I/O管理器并没有收到一个成功的返回,所以它会返回错误原创 2017-08-17 17:10:48 · 616 阅读 · 0 评论 -
16.driverbase-PAE-(虚拟地址转换成物理地址详细示例)
PAE是Physical Address Extension的缩写,即物理地址扩展。简单来说,就是把IA-32处理器的寻址能力从原来的4GB扩展到64GB。寻址4GB空间,要求物理地址的宽度为32位。类似的,要寻址64GB空间,那么物理地址的宽度就是36位。因为这个原因,PAE又被称为PAE-36bit。一般电脑都可以轻松看出是不是使用了PAE,最简单是看系统属性:如果不启用PAE原创 2014-03-08 16:02:35 · 2624 阅读 · 0 评论 -
1.driverbase-枚举进程,枚举模块,操作注册表随手代码
#include #include #define SystemModuleInformation 11#define SystemProcessesAndThreadsInformation 5 //要以编程的角度去理解代码,而不是以内核层或者应用层调度//就当成是应用层的 SYSTEMTIMEtypedef struct _SYSTEM_PROCESSES{ ULONG原创 2012-07-15 21:39:43 · 2904 阅读 · 0 评论 -
20.driverbase-CONTAINING_RECODE和双向链表
CONTAINING_RECODE和双向链表原创 2017-08-15 15:13:07 · 388 阅读 · 0 评论