<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[raiky的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/raiky</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; raiky]]></copyright><item><title><![CDATA[缓冲区方式读写操作]]></title><link>https://blog.youkuaiyun.com/raiky/article/details/5864338</link><guid>https://blog.youkuaiyun.com/raiky/article/details/5864338</guid><author>raiky</author><pubDate>Sun, 05 Sep 2010 11:02:00 +0800</pubDate><description><![CDATA[驱动程序创建设备对象一共有三种读写方式，分别是缓冲区读写、直接方式读写和其他方式读写。这三种方式对应的设备对象的Flags子域分别是DO_BUFFERED_IO、DO_DIRECT_IO和0。为什么要设置缓冲区读写方式？读写操作一般由WriteFile或ReadFile函数引起，以WriteFile为例，该函数要求用户提供一段缓冲区，并且说明缓冲区大小，然后WriteFile将这段内存的数据传入到驱动程序中。由于这段缓冲区内存是用户模式的内存地址，因此如果驱动程序直接引用该段内存是十分危险的。因此，就产生了]]></description><category></category></item><item><title><![CDATA[irp]]></title><link>https://blog.youkuaiyun.com/raiky/article/details/5745614</link><guid>https://blog.youkuaiyun.com/raiky/article/details/5745614</guid><author>raiky</author><pubDate>Mon, 19 Jul 2010 10:31:00 +0800</pubDate><description><![CDATA[<br />驱动程序中IRP处理机制类似Windows应用程序中的"消息处理"机制。在Windows内核中，有个复杂的数据结构IRP，这是与输入输出相关的数据结构。上层应用程序与底层驱动程序通信时，应用程序会发出I/O请求，操作系统将I/O请求转化成相应的IRP数据，不同类型的IRP会根据类型传递到不同的派遣函数内。<br />IRP有两个基本的属性，MajorFunction和MinorFunction，分别记录IRP的主类型和子类型。操作系统根据MajorFunction将IRP"派遣"到不同的派遣函数]]></description><category></category></item><item><title><![CDATA[内核模式下的字符串]]></title><link>https://blog.youkuaiyun.com/raiky/article/details/5739117</link><guid>https://blog.youkuaiyun.com/raiky/article/details/5739117</guid><author>raiky</author><pubDate>Fri, 16 Jul 2010 11:00:00 +0800</pubDate><description><![CDATA[<br />在应用程序中，经常使用的有两钟字符：char型和wchar_t型。char型的字符串，记录ANSI字符集，它指向一个char数组的指针，每个char型变量的大小为一个字节，字符串是以0标志字符串结束。wchar_t型是宽字符串，描述unicode字符集的字符串，它指向一个wchar_t数组的指针，大小为两个字节，字符串以0结束。内核模式下，并不鼓励使用这样的字符串，主要是因为容易导致缓冲区溢出的漏洞。DDK自定义了字符串，描述ASCII字符串的格式如下：<br />typedef struct ]]></description><category></category></item><item><title><![CDATA[分页和非分页内存]]></title><link>https://blog.youkuaiyun.com/raiky/article/details/5714568</link><guid>https://blog.youkuaiyun.com/raiky/article/details/5714568</guid><author>raiky</author><pubDate>Mon, 05 Jul 2010 21:10:00 +0800</pubDate><description><![CDATA[<br />Windows规定有些虚拟内存页面是可以交换到磁盘的文件中的，这类内存被称为分页内存，而有些虚拟内存是不能被交换到磁盘的文件中，这些内存被称为非分页内存。当程序的中断请求在DISPATCH_LEVEL之上时，包括DISPATCH_LEVEL，程序只能使用非分页内存。<br />在编译DDK提供的例程时，可以指定某个例程和某个全局变量是载入分页内存还是非分页内存，需要做如下定义：<br />#define PAGEDCODE code_seg("PAGE")<br />#define LOCKED]]></description><category></category></item><item><title><![CDATA[windows内存管理]]></title><link>https://blog.youkuaiyun.com/raiky/article/details/5714422</link><guid>https://blog.youkuaiyun.com/raiky/article/details/5714422</guid><author>raiky</author><pubDate>Mon, 05 Jul 2010 19:45:00 +0800</pubDate><description><![CDATA[<br />32位平台下，CPU的寻址能力为4GB，PC中有些设备(如显卡)都提供自己的设备内存，这部分内存会映射到PC的物理内存上，也就是读写这段物理内存地址，其实是在读写设备内存地址，而不会读写物理内存地址。虽然提供了4GB的寻址能力，但是实际可能没有这么大的物理内存，这样就引入了虚拟内存。Windows的所有程序(包括Ring3和Ring0的程序)实际操作的都是虚拟内存。对虚拟内存的操作，最终都会变成对实际物理内存的操作。由于Windwos是个多任务操作系统，到此，我们碰到了几个问题：一是，虚拟内存和]]></description><category></category></item><item><title><![CDATA[驱动程序的层次结构]]></title><link>https://blog.youkuaiyun.com/raiky/article/details/5712317</link><guid>https://blog.youkuaiyun.com/raiky/article/details/5712317</guid><author>raiky</author><pubDate>Sun, 04 Jul 2010 19:01:00 +0800</pubDate><description><![CDATA[<br />一、驱动程序的垂直层次结构<br />WDM驱动和NT驱动都可以看作分层结构。设备的创建顺序是，先创建底层PDO，再创建高层的FDO，这也是设备堆栈的生长方向，即从底层设备到高层设备。在PDO和FDO之间夹着很多不同驱动程序创建的过滤驱动。底层设备对象寻找上一层的设备对象，是依靠底层设备对象的AttachedDevice来寻找的，如果某一设备的AttachedDevice为空，则说明已经到了设备堆栈的顶部。而高层设备寻找低一层的设备对象，设备对象没有相关的子域可以使用。可以通过自定义的设备扩展来]]></description><category></category></item><item><title><![CDATA[WDM驱动程序]]></title><link>https://blog.youkuaiyun.com/raiky/article/details/5707855</link><guid>https://blog.youkuaiyun.com/raiky/article/details/5707855</guid><author>raiky</author><pubDate>Thu, 01 Jul 2010 21:20:00 +0800</pubDate><description><![CDATA[<br />先说下关于WDM驱动程序一些原理。Windows2000后，微软加入了新的驱动程序模型，就是WDM。在WDM中，完成一个设备的操作，至少有两个设备共同完成。其中，一个是物理设备对象PDO，另一个是功能设备对象FDO。两者的关系是"附加"和"被附加"的关系。当PC插入某个设备时，总线驱动程序创建PDO，而设备的驱动程序创建FDO，并附加到PDO上。当FDO附加到PDO上时，PDO设备对象的子域AttachedDevice会记录FDO的位置，而FDO可以通过定义设备扩展来记录FDO下层设备，如PDO]]></description><category></category></item><item><title><![CDATA[NT式驱动程序]]></title><link>https://blog.youkuaiyun.com/raiky/article/details/5707727</link><guid>https://blog.youkuaiyun.com/raiky/article/details/5707727</guid><author>raiky</author><pubDate>Thu, 01 Jul 2010 19:55:00 +0800</pubDate><description><![CDATA[<br />对于NT式驱动程序，主要的函数是DriverEntry例程、卸载程序以及各个IRP的派遣函数，基本结构如下：<br /> <br />#include "Driver.h"<br /> <br />#pragma INITCODE<br />extern "C" NTSTATUS DriverEntry (IN PDRIVER_OBJECT pDriverObject<br />                                                      IN PU]]></description><category></category></item><item><title><![CDATA[HelloWDM驱动程序代码，HelloWDM.cpp]]></title><link>https://blog.youkuaiyun.com/raiky/article/details/5700285</link><guid>https://blog.youkuaiyun.com/raiky/article/details/5700285</guid><author>raiky</author><pubDate>Mon, 28 Jun 2010 21:34:00 +0800</pubDate><description><![CDATA[<br /><br />#include "HelloWDM.h"<br />/************************************************************************<br />* 函数名称:DriverEntry<br />*************************************************************************/<br />#pragma INITCODE <br />extern "C" ]]></description><category></category></item><item><title><![CDATA[WDM驱动程序头文件HelloWDM.h]]></title><link>https://blog.youkuaiyun.com/raiky/article/details/5699143</link><guid>https://blog.youkuaiyun.com/raiky/article/details/5699143</guid><author>raiky</author><pubDate>Mon, 28 Jun 2010 13:33:00 +0800</pubDate><description><![CDATA[<br />/*******************************<br />*文件名:HelloWDM.h<br />******************************/<br />#ifdef __cplusplus<br />extern "C"<br />{<br />#endif<br />#include <wdm.h><br />#ifdef __cplusplus<br />}<br />#endif<br />typedef struct _DEVICE_EXTENSI]]></description><category></category></item><item><title><![CDATA[一个驱动程序的源代码Driver.cpp，接上篇]]></title><link>https://blog.youkuaiyun.com/raiky/article/details/5698143</link><guid>https://blog.youkuaiyun.com/raiky/article/details/5698143</guid><author>raiky</author><pubDate>Sun, 27 Jun 2010 21:59:00 +0800</pubDate><description><![CDATA[/****************************文件名称：Driver.cpp***************************/#include #pragma INITCODEextern "C" NTSTATUS DriverEntry(IN PDERIVER_OBJECT pDriverObject,IN PUNICODE_STRING pRegistryPath){ NTSTATUS status; KdPrint(("Enter DriverEntry/n")); //注册其他的驱]]></description><category></category></item><item><title><![CDATA[一个驱动程序头文件Driver.h]]></title><link>https://blog.youkuaiyun.com/raiky/article/details/5698029</link><guid>https://blog.youkuaiyun.com/raiky/article/details/5698029</guid><author>raiky</author><pubDate>Sun, 27 Jun 2010 20:45:00 +0800</pubDate><description><![CDATA[/**********************文件名:Driver.h**********************/#pragma once#ifdef __cplusplusextern "C"{#endif#include #ifdef __cplusplus}#endif#define PAGEDCODE code_seg("PAGE")#define LOCKEDCODE code_seg()#define INITCODE code_seg("INIT")#define PAGEDDATA dat]]></description><category></category></item><item><title><![CDATA[NT式驱动程序的helloworld]]></title><link>https://blog.youkuaiyun.com/raiky/article/details/5690161</link><guid>https://blog.youkuaiyun.com/raiky/article/details/5690161</guid><author>raiky</author><pubDate>Wed, 23 Jun 2010 20:49:00 +0800</pubDate><description><![CDATA[驱动程序的HelloWorld：/*first.c*/#include VOID DriverUnload(PDRIVER_OBJECT driver){DbgPrint("first: Our driver is unloading/r/n");}NTSTATUS DriverEntry(PDRIVER_OBJECT driver,PUNICODE_STRING reg_path){DbgPrint("first: hello my future!");driver->DriverUnload=Drive]]></description><category></category></item><item><title><![CDATA[win32汇编代码的屏幕截屏程序]]></title><link>https://blog.youkuaiyun.com/raiky/article/details/5615243</link><guid>https://blog.youkuaiyun.com/raiky/article/details/5615243</guid><author>raiky</author><pubDate>Fri, 21 May 2010 22:11:00 +0800</pubDate><description><![CDATA[这个程序是我学习win32汇编后独立编写的第一个较大的程序，中间出现了不少错误，幸好在csdn朋友的帮助下，现在终于完成了。感谢csdn汇编版下的各位，给了我指导和建议，非常感谢大家！]]></description><category></category></item><item><title><![CDATA[wiretefile和sizeof]]></title><link>https://blog.youkuaiyun.com/raiky/article/details/5594601</link><guid>https://blog.youkuaiyun.com/raiky/article/details/5594601</guid><author>raiky</author><pubDate>Sat, 15 May 2010 10:58:00 +0800</pubDate><description><![CDATA[最近在空余时间用win32汇编改写前面那个截屏程序，一直不成功。总觉得问题出在writefile中，于是在VC下写了个test，在C盘下建立一个11.txt文件，写入某个字符串，最初的代码如下：#include "stdafx.h"#include int main(int argc, char* argv[]){ DWORD          dwWritten;//写入文件字节数   ]]></description><category></category></item><item><title><![CDATA[关于win32汇编的调试]]></title><link>https://blog.youkuaiyun.com/raiky/article/details/5585107</link><guid>https://blog.youkuaiyun.com/raiky/article/details/5585107</guid><author>raiky</author><pubDate>Thu, 13 May 2010 07:44:00 +0800</pubDate><description><![CDATA[在VC6环境下的win32汇编的调试，网上找的一篇文章，照着试了试，蛮不错的，特别是习惯VC编程的人来说，这种调试方法使用起来得心应手。用VC6调试器源码级调试win32汇编程序  使用一个好的调试器无疑对学习win32汇编是至关重要的，本人更偏爱VC的强大调试环境, 不要makefile文件。编程环境：VC6.0，Masm32v8 方法如下：1、 使用VC6新建一]]></description><category></category></item><item><title><![CDATA[一个截屏程序，最后以BMP文件的形式保存，VC代码]]></title><link>https://blog.youkuaiyun.com/raiky/article/details/5560987</link><guid>https://blog.youkuaiyun.com/raiky/article/details/5560987</guid><author>raiky</author><pubDate>Wed, 05 May 2010 21:04:00 +0800</pubDate><description><![CDATA[截屏程序，最后在C盘保存11.bmp文件。程序的主要难度在要自己构建位图文件头、位图文件信息头等结构，就好像在写伪IP数据包时，自己构建IP头和TCP头一样。代码有所简化，打算用win32汇编再写一次。#include #include int main(){ HBITMAP   hBmp;  HDC     hDC, MemDC,hDCC; //设备描述表       BYTE*   D]]></description><category></category></item><item><title><![CDATA[SEH的注册回调函数]]></title><link>https://blog.youkuaiyun.com/raiky/article/details/5424985</link><guid>https://blog.youkuaiyun.com/raiky/article/details/5424985</guid><author>raiky</author><pubDate>Sun, 28 Mar 2010 16:32:00 +0800</pubDate><description><![CDATA[我第一次知道SEH是在学习缓冲区溢出时，就知道这是windows的一个异常处理机制。SEH是基于线程的，使用SEH可以为每个线程设置不同的异常处理程序，而且可以为每个线程设置多个异常处理程序；SEH是硬件平台相关的，因为使用了与硬件平台相关的数据指针。win32为每个线程定义了一个线程信息块(TIB)，其中保存了线程的一些属性数据，TIB的格式被定义为NT_TIB结构：NT_TIB STR]]></description><category></category></item><item><title><![CDATA[关于代码重定位问题]]></title><link>https://blog.youkuaiyun.com/raiky/article/details/5415347</link><guid>https://blog.youkuaiyun.com/raiky/article/details/5415347</guid><author>raiky</author><pubDate>Thu, 25 Mar 2010 12:59:00 +0800</pubDate><description><![CDATA[在远程线程注入中，由于编程和实际运行处于不同的内存空间，势必会出现API内存地址不一致的情况，导致某些包含绝对地址的指令无法正常运行。解决这个问题的办法是代码重定位方法，具体代码如下：dwVar dd ?           call @F           @@:           pop ebx           sub ebx,offset @B        ]]></description><category></category></item><item><title><![CDATA[函数调用时，栈里到底发生了什么？]]></title><link>https://blog.youkuaiyun.com/raiky/article/details/5398807</link><guid>https://blog.youkuaiyun.com/raiky/article/details/5398807</guid><author>raiky</author><pubDate>Sat, 20 Mar 2010 11:04:00 +0800</pubDate><description><![CDATA[今天看书时，看到代码重定位时，对EBP、ESP寄存器的使用特模糊，产生两个疑问，一是栈的最小的分配单位是什么？程序？进程还是线程？二是函数调用时，到底栈里发生了什么？为什么要那么做？于是翻阅了相关的资料加上自己的理解，整理如下。关于第一个问题，首先搞清楚程序、进程和线程之间的关系和区别。这个网上有太多的资料，最后的结论是，操作系统为每个线程保存单独的寄存器环境和单独的堆栈，但是它们共享进程的地]]></description><category></category></item></channel></rss>