关于IoCallDriver】的更多相关文章

#pragma PAGEDCODE NTSTATUS HelloDDKRead(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp) { KdPrint(("DriverB:Enter B HelloDDKRead\n")); NTSTATUS ntStatus = STATUS_SUCCESS; UNICODE_STRING DeviceName; RtlInitUnicodeString( &DeviceName, L"\\Device…
通常我们所知IoCallDriver是把irp传递给下一层设备,传递到底是什么意思呢?IoCallDriver中实际调用了IopfCallDriver,其代码如下:NTSTATUSFORCEINLINEIopfCallDriver(    IN PDEVICE_OBJECT DeviceObject,    IN OUT PIRP Irp    ) /*++ Routine Description: This routine is invoked to pass an I/O Request P…
今日遇见一个开超市的朋友,真没想到在高校开超市一个月可以达到月净利润50K,相比起我们程序员的工资,真是不可同日而语,这个世道啊,真是做程序员不如经商开超市, 我们高科技的从业者,真是造原子弹不如卖茶叶蛋. 请见代码详细注释 //  修复涉及后视列表的Win2K兼容性 //  Fixes Win2K compatibility regarding lookaside lists. // #ifndef _WIN2K_COMPAT_SLIST_USAGE // Add content(增加内容)…
MSDN原文:https://msdn.microsoft.com/zh-cn/library/windows/hardware/hh439638(v=vs.85).aspx 发送到设备驱动程序的大部分请求都打包在 I/O 请求数据包 (IRP) 中.操作系统组件或驱动程序将 IRP 发送到驱动程序,方法是调用 IoCallDriver,它有两个参数:指向 DEVICE_OBJECT 的指针和指向 IRP 的指针.DEVICE_OBJECT 具有指向关联 DRIVER_OBJECT 的指针.当组…
WDM驱动的基本结构: WDM驱动模型是建立在NT式驱动程序模型基础之上的.对于WDM驱动程序来说,一般都是基于分层的,即完成一个设备的操作,至少要由两个驱动设备共同完成. 1)物理设备对象和功能设备对象 物理设备对象(Physical Device Object,PDO)和功能设备对象(Function Device Object,FDO)的关系是“附加”与“被附加”的关系. 当PC插入某个设备时,PDO会自动创建.确切的说,是由总线驱动创建的.PDO不能单独操作设备,需要配合FDO一起使用.…
在学习内核过滤驱动的过程中,遇到了大量的涉及IRP操作的代码,这里有必要对IRP的数据结构和与之相关的API函数做一下笔记. 1. 相关阅读资料 <深入解析 windows 操作系统(第4版,中文版)> --- 9章 <windows driver kit 帮助文档> http://support.microsoft.com/kb/115758/zh-cn  IRP 结构中各地址字段的含义 http://www.programlife.net/io_stack_location-i…
https://msdn.microsoft.com/zh-cn/library/windows/hardware/ff554721 1.设备节点和设备堆栈 在windows中,设备通过即插即用设备树中的设备节点表示.典型地,当设备接受到一个I/O请求,数个驱动帮忙处理这个请求,这些驱动各自与一个设备对象相关,这些设备对象在堆栈中有序排列.一个设备对象序列以及它们各自相关的驱动称为设备堆栈.每个设备节点拥有一个它们自己的设备堆栈. 1.2.设备对象和设备堆栈 一个设备对象是一个DEVICE_OB…
一.前言 最近在阅读A盾代码A盾电脑防护(原名 3600safe)anti-rootkit开放源代码,有兴趣的可以去看雪论坛下载,本文代码摘自其中的重载内核. 二.实现步骤 1.ZwQuerySystemInformation大法获得系统模块信息 NtosKrnl.exe 这里第一模块名称是根据单核.多核.开启PAE.未开启PAE变化的 2.自己Reload一个内核模块,打开.获得文件大小.读入内存,这里都用到Irp的操作    irpSp->Parameters.MountVolume.Vpb…
原文链接:http://www.cnblogs.com/zhuyp1015/archive/2012/03/14/2396595.html IRP(I/O request package)是操作系统内核的一个数据结构.应用程序与驱动程序进行通信需要通过IRP包.当上层应用程序需要与驱动通信的时候,通过调用一定的 API函数,IO管理器针对不同的API产生不同的IRP,IRP被传递到驱动内部不同的分发函数进行处理.对于不会处理的IRP包需要提供一个默认的分 发函数来处理. 现在我们来看一下IRP的…
原文链接:http://m.blog.csdn.net/blog/ruanben/19758769# 当驱动被分层以后,他们被注册到一个chain中,IRP会在这个chain中传递,从最上面,到最下面,再回到最上面 为适应这种体制,IRP的结构的大小是不固定的,大体结构如下: -------------------- | IRP header | -------------------- |IO_STACK_LOCATION |<-----lowest driver stack location…
原文链接:http://www.programlife.net/io_remove_lock.html IO_REMOVE_LOCK(删除锁)的具体结构没有公开,WDK的文档中中查不到IO_REMOVE_LOCK.最开始看到IO_REMOVE_LOCK是在WDK的例子event中.下面是参考网上的一些资料之后的一点总结,错误的地方请指正.新增内容:WDK8.1 中是可以看到这个结构的,在wdm.h中. 为什么要用IO_REMOVE_LOCK? WDM 驱动程序在处理设备删除 IRP 并释放驱动程…
原文链接:http://blog.csdn.net/hazy/article/details/481705 WDM中的结构   ---设备扩展 设备扩展(DEVICE_EXTENSION)是与设备对象相关的另一种重要的数据结构.可以用它来保存与特定设备关联的信息.设备扩展其实只是一个未分页的池,由驱动开发者来定义它的大小和内容.并由I/O管理器自动把它分配给设备对象,即设备对象的PVOID DeviceExtension字段.由于此结构是驱动开发者自定义的,所以必须要让系统知道需要给此结构预留多…
使用IRP进行文件操作 首先声明这个是菜鸟—我的学习日记,不是什么高深文章,高手们慎看. 一定要先感谢为技术的进步而付出辛勤汗水的人,感谢他们对技术的共享. 一个通用IRP访问文件的十六进制编辑器(开源代码)     --   被诅咒的神(邪恶八进制信息安全团队) Windows平台内核级文件访问                               --   baiyuanfan (baiyuanfan@163.com) 特别感谢被诅咒的神,他写的<ExTools v1.2>里面包含了…
下面是开发人员在使用 Windows NT 设备驱动程序时应当避免的事项列表: 1.  一定不要在没有标注 I/O 请求数据包 (IRP) 挂起 (IoMarkIrpPending) 的情况下通过调度例程返回 STATUS_PENDING.  2.  一定不要通过中断服务例程 (ISR) 调用 KeSynchronizeExecution. 它会使系统死锁.  3.  一定不要将 DeviceObject->Flags 设置为 DO_BUFFERED_IO 和 DO_DIRECT_IO. 它会扰…
1.背景     在windows平台下,应用程序通常使用API函数来进行文件访问,创建,打开,读写文件.从kernel32的CreateFile/ReadFile/WriteFile函数,到本地系统服务,再到FileSystem及其FilterDriver,经历了很多层次.在每个层次上,都存在着安全防护软件,病毒或者后门作监视或者过滤的机会.作为安全产品开发者,我们需要比别人走得更远,因此我们需要一个底层的“windows平台内核级文件访问”的方法来确保我们能够看到正确的干净的文件系统. 2.…
和S5933比较起来,开发PLX9054比较不幸,可能是第一次开发PCI的缘故吧.因为,很多PCI的例子都是对S5933,就连微软出版的<Programming the Microsoft Windows Driver Model>都提供了一个完整的S5933的例子. 在这篇有关DDK的开发论文里.我将分两个例子来构建PLX9054的驱动,第一个,是对<Windows2000 设备驱动程序设计指南>里的分段DMA例子的扩充,它的结构比较简单,对理解DDK的运作很有帮助:第二个,我将…
键盘过滤第一个例子ctrl2cap(4.1~4.4)汇总,测试 完整源代码 /// /// @file ctrl2cap.c /// @author wowocock /// @date 2009-1-27 /// #include <wdm.h> #include <ntddkbd.h> #include "ctrl2cap.h" typedef struct _C2P_DEV_EXT { // 这个结构的大小 ULONG NodeSize; // 过滤设备对…
分层驱动程序概念 分层的目的是将功能复杂的驱动程序分解成多个简单的驱动程序.一般来说,他们是指两个或两个 以上的驱动程序,它们分别创建设备对象,并且形成一个由高到低的设备对象栈.IRP请求一般会被传送到设备栈的最顶层的设备对象,顶层的设备对象可以选择 直接结束IRP请求,也可以选择将IRP请求向下层的设备对象转发.如果是向下层设备对象转发IRP请求,当IRP请求结束时,IRP会顺着设备栈的反方 向原路返回.当得知下层驱动程序已经结束IRP请求时,本层设备对象可以选择继续将IRP向上返回,或者选择…
本节介绍“手动”构造各个IRP,然后将IRP传递到相应驱动程序的派遣函数里. 获得设备指针 每个内核中的句柄都会和一个内核对象的指针联系起来.ZwCreateFile内核函数可以通过设备名打开设备句柄,这个设备句柄和一个文件对象的指针关联.IoGetDeviceObjectPointer内核函数可以通过设备名获得文件对象指针,而不是获得设备句柄.当调用IoGetDeviceObjectPointer内核函数后,设备对象的引用计数就会加1.当用完这个设备对象后,应该调用ObDereferenceO…
驱动程序的主要功能是负责处理I/O请求,其中大部分I/O请求是在派遣函数中处理的.用户模式下所有对驱动程序的I/O请求,全部由操作系统转化为一个叫做IRP的数据结构,不同的IRP数据会被“派遣”到不同的派遣函数中. IRP与派遣函数 IRP的全称是输入输出请求包. 其部分结构如下: typedef struct DECLSPEC_ALIGN(MEMORY_ALLOCATION_ALIGNMENT) _IRP { CSHORT Type; USHORT Size; // // Define the…
Minfilter过滤框架 优势 与传统的Sfilter过滤驱动相比,有这样几个优势 1. Minfilter加载顺序更易控制,Sfilter加载是随意的,也就是说它在IO设备栈上的顺序是根据其创建的顺序决定的,越晚创建的,越排在设备栈的顶部,而Minfilter根据它的一个全局变量--altitude规定了它在设备栈上的顺序 2. 具有可卸载能力,一般的hook或者过滤框架在卸载时可能仍然有程序在访问它们的代码,所以如果在有程序访问其代码,而它又被卸载时容易导致蓝屏,这样就不具备可卸载能力.而…
和S5933比较起来,开发PLX9054比较不幸,可能是第一次开发PCI的缘故吧.因为,很多PCI的例子都是对S5933,就连微软出版的<Programming the Microsoft Windows Driver Model>都提供了一个完整的S5933的例子. 在这篇有关DDK的开发论文里.我将分两个例子来构建PLX9054的驱动,第一个,是对<Windows2000 设备驱动程序设计指南>里的分段DMA例子的扩充,它的结构比较简单,对理解DDK的运作很有帮助:第二个,我将…
1.USB插入时,创建设备 [plain] view plaincopy DriverObject->DriverExtension->AddDevice = USB2COM_PnPAddDevice; 步一.调用USB2COM_CreateDeviceObject创建功能设备对象(FDO) (1) IoCreateDevice系统API的原理为: [plain] view plaincopy NTKERNELAPI NTSTATUS IoCreateDevice( IN PDRIVER_OB…
USB设备驱动 ·  )USB Hub:每个USBHost控制器都会自带一个USB Hub,被称为根(Root)Hub.这个根Hub可以接子(Sub)Hub,每个Hub上挂载USB设备.一般PC有8个USB口,通过外接USB Hub,可以插更多的USB设备.当USB设备插入到USBHub或从上面拔出时,都会发出电信号通知系统.这样可以枚举USB设备,例如当被插入的时候,系统就会创建一个USB物理总线,并询问用户安装设备驱动.如图17-4所示为一个典型的USB Hub的示意图. 是控制管道,管道1…
学习了几个月的内核编程,现在对Windows驱动开发又了更加深入的认识,特别是对IRP的分层处理逻辑有了深入认识. 总结起来就几句话: 当irp下来的时候,你要根据实际情况,进行处理 1> 无处理,继续往下传 2> 处理之后 ,往下传 3> 处理之后, 往上传 4> 不做处理,直接丢弃 具体怎么理解,通过一个串口驱动过滤就可以深入理解. 一.串口过滤概念 串口过滤:平时我们看到的主机上的USB.网线口等都属于串口,那么设想一个环境,我去网吧上网,正在通过某宝付款,然后主机后面的US…
Author:  sinisterEmail:   sinister@whitecell.orgHomepage:http://www.whitecell.org Date:    2007-02-26 /******************************************************************* 这个键盘过滤驱动是一个定时锁定计算机程序的功能部分,以前 lgx 写过一个 linux 版,现在我们需要实现一个 windows 版.这部分的 功能要求如下:…
IO_STACK_LOCATION和IRP算是驱动中两个很基础的东西,为了理解这两个东西,找了一点资料. 1. IRP可以看成是Win32窗口程序中的消息(Message),DEVICE_OBJECT可以看成是Win32窗口程序中的窗口(Window) 2. 任何内核模式程序在创建一个IRP时,同时还创建了一个与之关联的IO_STACK_LOCATION结构数组:数组中的每个堆栈单元都对应一个将处理该IRP的驱动程序. IRP的头部有一个当前IO_STACK_LOCATION的数组索引,同时也有…
1 实验要求(WDM驱动)     2 编写过程   2.1 确立整体架构   2.1.1 入口函数——DriverEntry   (1)作用 设置pDriverObject结构体,注册AddDevice和相关PNP函数,包括IRP_MJ_PNP,IRP_MJ_CREATE等 (2)注意 AddDevice在Driver_Object结构体的DriverExtension->AddDevice,原型是NTSTATUS AddDevice (PDRIVER_OBJECT pDriverObject…
一丶内核中的数据类型 在内核中.程序的编写不能简单的用基本数据类型了. 因为操作系统不同.很有可能造成数据类型的长度不一.而产生重大问题.所以在内核中. 数据类型都一定重定义了. 数据类型 重定义数据类型 Unsigned long ULONG Unsigned char UCHAR Unsigned int UINT Void VOID Unsigned long * PULONG Unsigned char * PCHAR Unsigned int * PUINT Void * PVOID…
Windows系统是支持多用户的.每个文件可以设置一个访问控制表(即ACL),在ACL中规定每个用户.每个组对该文件的访问权限.不过,只有Ntfs文件系统中的文件才支持ACL. (Ntfs文件系统中,每个文件的ACL是作为文件的一个附加属性保存在文件中的). 不仅ntfs文件支持ACL机制,每个内核对象也支持ACL,不过内核对象的ACL保存在对象头部的安全属性字段中,只存在于内存,对象一销毁,ACL就跟着销毁.因此,内核对象的ACL是临时的,文件的ACL则是永久保存在磁盘上的.文件的ACL由文件…