存档

‘Windows驱动开发’ 分类的存档

[驱动学习笔记]LIST_ENTRY和DPC定时器

2012年1月7日 4 条评论

链表的使用
链表是驱动开发中经常遇到的一个数据结构,主要是双向循环链表;要使用链表,需要用到一个LIST_ENTRY的结构,其定义如下:

typedef struct _LIST_ENTRY {
struct _LIST_ENTRY *Flink; // 指向下一个节点
struct _LIST_ENTRY *Blink; // 指向前一个节点
} LIST_ENTRY, *PLIST_ENTRY;

在实际的编程中,我们需要自己定义链表的节[......]

继续阅读

IO_REMOVE_LOCK使用方法小结

2012年1月1日 没有评论

IO_REMOVE_LOCK(删除锁)的具体结构没有公开,WDK的文档中中查不到IO_REMOVE_LOCK。最开始看到IO_REMOVE_LOCK是在WDK的例子event中。下面是参考网上的一些资料之后的一点总结,错误的地方请指正。

为什么要用IO_REMOVE_LOCK?
WDM 驱动程序在处理设备删除 IRP 并释放驱动程序分配的内存后可能接收到附加的 IRP。在处理附加的 IRP 时试图引用已经释放的内存会导致系统崩溃。驱动程序能够接收已删除设备的 IRP,这有两个原因:
1. 在设备被删除后,另一个组件可以发送 I/O。
2. 在设备删除请求之前发送的 I/O 请求可能在目标驱动程序处理设备删除请求之后到达。[......]

IO_STACK_LOCATION与IRP的一点笔记

2011年12月24日 2 条评论

IO_STACK_LOCATION和IRP算是驱动中两个很基础的东西,为了理解这两个东西,找了一点资料。
1. IRP可以看成是Win32窗口程序中的消息(Message),DEVICE_OBJECT可以看成是Win32窗口程序中的窗口(Window)
2. 任何内核模式程序在创建一个IRP时,同时还创建了一个与之关联的IO_STACK_LOCATION结构数组:数组中的每个堆栈单元都对应一个将处理该IRP的驱动程序。
IRP的头部有一个当前IO_STACK_LOCATION的数组索引,同时也有[......]

继续阅读

驱动读写方式(缓冲区读写与直接读写)

2011年12月20日 没有评论

应用程序和驱动程序交互数据需要指定数据的交互方式,通过设置DEVICE_OBJECT的Flags成员来标志。有DO_BUFFERED_IO、DO_DIRECT_IO或者0
DO_BUFFERED_IO:一般用于比较简单且不追求效率情况下的解决方案,把应用层(Ring3层)中内存空间中的缓冲数据拷贝到内核空间。IRP的AssociatedIrp.SystemBuffer成员指向内核中的缓冲区。
DO_DIRECT_IO:把应用层的地址空间映射到内核空间,这需要在页表中增加一个映射。当然这不需要程[......]

继续阅读

IRQL科普

2011年12月19日 没有评论

IRQL是Interrupt ReQuest Level,中断请求级别。处理器在一个IRQL上执行线程代码。IRQL是帮助决定线程如何被中断的。在同一处理器上,线程只能被更高级别IRQL的线程能中断。每个处理器都有自己的中断IRQL。常见的IRQL级别有四个:Passive、APC、 Dispatch、DIRQL。
PASSIVE_LEVEL
IRQL最低级别,没有被屏蔽的中断,线程执行用户模式,可以访问分页内存。
APC_LEVEL
只有APC级别的中断被屏蔽,可以访问分页内存。当有APC发生[......]

继续阅读

分类: Windows驱动开发 标签: ,

VMWare搭建驱动双机调试环境

2011年12月7日 2 条评论

一、虚拟机设置
以XP为例,因为XP相对Vista/Win7要小巧玲珑许多,安装方便,占用的空间也少,而且配置更加简单。在“文件夹选项”中设置显示隐藏文件和显示系统文件,打开系统盘(比如C盘),找到Boot.ini,去掉这个文件的只读属性,用记事本打开Boot.ini,大概的内容如下
二、VMWare设置
关闭虚拟机,来到VMWare之后选择对应的虚拟机,对齐进行设置。选择“Commands”栏中的“Edit Virtual Machine Settings”,单击“Add”按钮增加一个串口,也就是Serial Port,单击下一步,选择“Output to named pipe”,之后进行相应的设置
三、Windbg设置
给Windbg创建一个快捷方式,设置一下这个快捷方式的属性:在快捷方式的目标后面增加一些命令,我这里是:”C:\Program Files\Debugging Tools for Windows (x86)\windbg.exe” -b -k com:port=\\.\pipe\com_1,baud=115200,pipe[......]

Windows内核驱动开发入门学习资料

2011年11月5日 7 条评论

声明:本文所描述的所有资料和源码均搜集自互联网,版权归原始作者所有,所以在引用资料时我尽量注明原始作者和出处;本文所搜集资料也仅供同学们学习之用,由于用作其他用途引起的责任纠纷,本人不负任何责任。(本资料由代码疯子整理)
一、书籍推荐

  1. 《Windows驱动开发技术详解》作者:张帆、史彩成;出版社:电子工业出版社
  2. 《天书夜读:从汇编语言到Windows内核编程》作者:谭文、邵坚磊;出版社:电子工业出版社
  3. 《寒江独钓:Windows内核安全编程》作者:谭文、杨潇、邵坚磊;出版社:电子工业出版社
  4. 其[......]

继续阅读

ISCC2011内核关-移形换影

2011年6月9日 没有评论

这是ISCC 2011 内核关的第三题-移形换影,可以通过SSDT HOOK来解决。主要是HOOK NtOpenFile和NtCreateFile这两个函数来实现。
题目描述:在同一个目录下有两个文件:111.txt和222.txt。你能不能写一个内核程序,当使用记事本打开111.txt时却显示222.txt的内容? 如果你知道系统服务描述表这个概念,just a piece of cake!(注意需要提交源代码)
提示信息:无
我的说明:SSDT HOOK是个老话题了,网上有很多的介绍,看雪论[......]

继续阅读

分类: CTF, Windows驱动开发 标签: , , ,

ISCC2011内核关-打造你自己的进程监控程序

2011年6月9日 1 条评论

这是ISCC2011的内核关的第二题,内核关第一题就是用DebugView查看驱动文件中的输出信息,很简单,略过。本题是内核关第二题,要求使用Notify Routine来监控系统中进程的创建以及退出的信息。本题并不是很难,MSDN一下就知道怎么用了,我倒是觉得,通过EPROCESS结构体来获取进程的全路径需要好好思考一下,不过,Google上搜索一下,就明白了。
题目:监控Windows系统中进程的创建与结束,除了HOOK关键的系统函数之外,还可以设置Notify Routine,系统提供了这[......]

继续阅读

[转]Windows 2000错误代码和提示

2011年6月1日 2 条评论

个人觉得很有用的一张表,这是网上流传的一张Windows 2000的错误代码表,其实在其他版本的Windows下也是可以对照着用的,至少在Windows XP下的错误代码可以找到一些。尤其是对于驱动开发或者喜欢用ntdll中导出的Native API的朋友而言。当STATUS是一个莫名其妙的数字的时候是不是感到很困惑呢?那种负数的错误代码代表了什么?比如返回-1073741819这样一个STATUS。来查一下这张表吧。绝对很有帮助。

1 MESSAGETABLE
{
0, &qu[......]

继续阅读