
驱动开发
文章平均质量分 65
iteye_13216
这个作者很懒,什么都没留下…
展开
-
Filter驱动:过滤(修改)接受数据包
Filter驱动可以实现简单的防火墙功能。它可以过滤所有接收到的包,然后进行分析处理,最后根据情况决定是否网上传递给Protocol层,最后给应用程。我们的原则是不能在接收到的NBL修改数据,因为后面我们还会需要这个完整的包结构,尤其是在调用NdisFReturnNetBufferLists释放NBL的owership的时候。所以第一步要做的就是拷贝数据:拷贝NetBufferList数据...2010-04-20 16:18:03 · 1125 阅读 · 1 评论 -
使用DeviceIoControl通信
在很多时候,某些用户需要与底层驱动有一个交互式的操作,所以需要寻找一个架构能够做到应用程程序和驱动程序进行有效的沟通,而Microsoft Windows 家族操作系统通过发送 I/O 请求数据包 (IRP) 与驱动程序通信。所以今天我们介绍Windows如何使用DeviceIoControl以及IRP进行User层和Kernel层的数据交流。 首先,为了比较完整的介绍这个部分,我们先...2010-04-04 22:53:03 · 496 阅读 · 0 评论 -
在驱动中使用链表
文章作者:grayfox作者主页:http://nokyo.blogbus.com原始出处:http://nokyo.blogbus.com/logs/33271026.html 在驱动程序的开发中经常需要用到链表,常见的链表有单向链表和双向链表,我们只介绍双向链表的使用方法,DDK为我们提供了标准的双向链表LIST_ENTRY,但这个链表里面没有数据,...2010-04-03 14:06:08 · 267 阅读 · 0 评论 -
疑问:数据包Length增大的原因
现象:自己定义一个仅含有Ethernet Header的数据包,其大小为80.使用有线和无线网卡发送,监听到的结果显示大小分别为80 和 130,为何? 写道284 7.437500 [002586 EB7B0C] [USI 5B1430] EAPOL EAPOL:EAPOL-Start , Length = 515 Frame: Number = 284, Captured...2010-04-01 14:35:09 · 237 阅读 · 0 评论 -
疑问:为何无线网卡无法发送数据?
所有的测试流程表明,程序已经成功的创建新的数据包,然后调用NdisFSendNetBufferLists发送数据。更令人不甚明白的是,在本地的有线网卡上可以成功的发送出去到目的地,就是单纯无线网卡没有按照约定发送数据,所以一个可以怀疑的理由就是我们的约定出错了。调试显示所有的步骤都跟有线的一样,没有什么出路。一直觉得不可思议。VOID NdisFSendNetBufferLists(...2010-03-30 22:42:00 · 760 阅读 · 0 评论 -
InsertHeadList和CONTAINING_RECORD
LIST_ENTRY定义一个双向链表的数据结构:typedef struct _LIST_ENTRY { struct _LIST_ENTRY *Flink; struct _LIST_ENTRY *Blink;} LIST_ENTRY, *PLIST_ENTRY; 由函数InitializeListHead(BUEList)进行初始化。假设需要插入某个数据...2010-03-29 16:36:57 · 601 阅读 · 0 评论 -
如何区分不同的Filter Module Instance
前文 说到如何区分不同Filter Module Instance. 而且提到了三种方法。我分别测试了下:FilterModuleName is {7CA32522-8218-4BF9-8B98-D280274588E2}-{5CBF81BD-5055-47CD-9055-A76B2B4E3697}-0000??00000084 200.10607910 NDI...2010-03-29 14:50:11 · 251 阅读 · 0 评论 -
驱动设计-INF文件
INF是Device INFormationFile的英文缩写,是Microsoft公司为硬件设备制造商发布其驱动程序推出的一种文件格式,INF文件中包含硬件设备的信息或脚本以控制硬件操作。在INF文件中指明了硬件驱动该如何安装到系统中,源文件在哪里、安装到哪一个文件夹中、怎样在注册表中加入自身相关信息等等。安装监视器、调制解调器和打印机等设备所需的驱动程序,都是通过INF文件,正是I...原创 2009-08-20 22:35:44 · 209 阅读 · 0 评论 -
VirtialWiFi在Vista下编译问题小结
再一次编译VirtualWiFi的时候,已经是在毕业1年以后了。毕业设计的时候做的就是基于这个的一点改善。那时候的编译环境是XP,现在想看看在Vista下,编译会有怎么样的反应。因为官方上面明确写着"We have implemented VirtualWiFi on Windows XP."我曾试过在Vista安装XP编译好的exe文件,结果安装不了。所以如果想要在Vista中使用,必须在Vis...2009-08-02 21:28:49 · 107 阅读 · 0 评论 -
Windbg和Vmware配置调试驱动程序(Vista)
按照 WinDBG双机调试之Vista Boot Config 设置 的说明,我配置好了虚拟机上系统的串口通讯以及新的引导启动项详细参考 Driver Debugging with WinDbg and VMWare 。然后在Host中装上WinDbg,修改其在桌面的快捷方式启动选项: windbg -b -k com:pipe,port=\\.\pipe\com_1,resets=0 启...2009-07-28 17:51:47 · 169 阅读 · 0 评论 -
WinDBG+VMware=调试内核
声明,本文转载自http://blog.youkuaiyun.com/floweronwarmbed/archive/2008/11/01/3201307.aspx,不过最初原创者无法知道,改日知道补上。呵呵,搞点突兀的标题而已。其实说的还是如何使用WinDBG和VMware来搭建调试内核的环境而已,这些网上已经有数不清的教程了,不过我喜欢自己亲手写一下。第一,把这个过程写一遍能加深印...原创 2009-07-27 22:20:30 · 143 阅读 · 0 评论 -
纵横捭阖C++之从异步谈起
一般来说,简单的异步(Asynchronous)调用是这样一种调用方式:发起者请求一个异步调用,通知执行 者,然后处理其他工作,在某一个同步点等待执行者的完成;执行者执行调用的实际操作,完成后通知发起者。可以看出,在异步调用中有两种角色:发起者和执行 者,它们都是能主动运行的对象,我们称为主动对象,同时还有一个同步点,主动对象在同步点协调同步。在本文中,我们讨论主要是通用计算机、多进程...2010-04-08 19:31:52 · 169 阅读 · 0 评论 -
Windows系统编程之异步I/O和完成端口
一、 同步I/O和异步I/O在介绍这部分内容之前先来认识下“异步I/O”。 说起异步IO,很容易联想到同步I/O,对于同一个I/O对象句柄在同一时刻只允许一个I/O操作,其原理如下图所示: 显然,当内核真正处理I/O的时间段(T2~T4),用户线程是处于等待状态的,如果这个时间段比较段的话,没有什么影响;倘若这个时间段很长的话,线程就会长时间处于挂起状态。事实上,该线程完全...2010-04-08 19:40:47 · 222 阅读 · 0 评论 -
驱动和应用层的异步通信
作 者: sislcb时 间: 2008-01-28,11:13:28链 接: http://bbs.pediy.com/showthread.php?t=59015这里来简单的讲解下驱动和应用层的异步通信,上次我写了驱动和应用层的三种基本通信方法,但是那三种方法都是通过同步的方法来实现的,就是说,在应用层向驱动层发送消息后,就堵死在那里等待驱动层的返回了,而异步的概念就是,应用层向驱动发送消...2010-04-08 20:55:49 · 378 阅读 · 0 评论 -
Ndis过滤驱动:拷贝NetBufferList数据
今天我们来看看如何拷贝NBL中的数据。有时候需要更改数据包中的某些数据,就需要用到此功能(能直接在原来的nBL上更改,然后发送吗?)。 新建一个NBL作为你自己要存放拷贝数据的结构: pCopyNBL = allocateNetBuffAndNetBufferList(pFilter, dataLength);//Defined by self 这个其实是一个自定义的函数,用来分...2010-04-19 22:40:52 · 1840 阅读 · 1 评论 -
在Filter驱动内核中获取IP地址
项目开发中有时候需要在Filter驱动中获取有效地Unicast地址,比如用来发送数据等。本来以为内核中需要OID那种强求来完成,结果发现OID_GEN_NETWORK_LAYER_ADDRESSES是不支持查询的。后来求助高人才发现:原来在Ndis6.x,IPHelperAPI不仅可以在应用层使用,也可以在内核层使用,这里我们使用的函数是GetUnicastIpAddressTabl...2010-04-18 01:48:20 · 644 阅读 · 0 评论 -
如何在内核中获得当前系统时间
在 Windows NT 内核中你是无法使用 time.h 获取当前系统时间的,这个时候你需要用到 Wdm.h(你可以 include Wdm.h, Ntddk.h, 或 Ntifs.h)里面提供的 KeQuerySystemTime() 函数。这个函数和相关头文件需要 Windows 2000, Windows Vista 或者 Windows 7 等 NT 系统。函数原型...2010-04-16 15:08:52 · 387 阅读 · 0 评论 -
Filter发送自定义数据详解
这里介绍如何从创建数据到最后发送数据的一个过程。首先要做准你要发送的数据,注意你的数据大小至少要不少于64Byte。我们这里设置数据包的大小为80Byte.里面的内容包含一个14Byte的EthernetHeader,其他空位用无用数据填充。下面是具体流程:一、创建缓冲区-...2010-04-16 10:30:51 · 411 阅读 · 0 评论 -
DebugPrint 格式说明符
1) 直接打印字符串。 DbgPrint(“Hello World!”); 2) 空结尾的字符串,你可以用普通得C 语法表示字符串常量 char variable_string[] = “Hello World”; DbgPrint(“%s”,variable_string); 3) 空结尾的宽字符串(WCHAR 类型 ) WCHAR str...2010-04-13 19:46:36 · 386 阅读 · 0 评论 -
WDK+Visual Studio 2008配置编译驱动
Introduction As it is known, Microsoft officially doesn't support integration of DDK with Visual Studio (any version). So we can use the Visual Studio editor (or any other text editor) for devel...2010-04-12 23:36:01 · 208 阅读 · 0 评论 -
疑问:关于内存释放
今天碰到一个比较棘手的内存处理问题。首先来看一个数据结构:typedef struct _IRP_AND_FILTER{ PIRP pIrp; PMS_FILTER pFilter; ULONG OutputBufferLength;}IrpAndFilter, *PIrpAndFilter; 其中pI...2010-04-12 21:33:39 · 223 阅读 · 0 评论 -
Windows NT 驱动程序开发人员提示 -- 应注意避免的事项
原讨论链接:http://community.youkuaiyun.com/expert/topicview1.asp?id=4738353所属论坛:硬件/系统 审核组:VC/MFC提问者:codewarrior 解决者:codewarrior1. 一定不要在没有标注 I/O 请求数据包 (IRP) 挂起 (IoMarkIrpPending)...2010-04-10 11:32:19 · 135 阅读 · 0 评论 -
关于DeviceIoControl实现异步的笔记【2】
前面我们谈到了关于异步I/O的实现:关于DeviceIoControl实现异步的笔记【1】。可是实现起来,你会发现你的程序在DevieIoControl已经被挂起,而且返回的结果是非0。这就与真正的异步调用返回结果有出入,理论上应该返回0,且GetLastError()值为ERROR_IO_PENDING。/** Send the packets defined by user...2010-04-09 23:17:44 · 227 阅读 · 0 评论 -
关于DeviceIoControl实现异步的笔记【1】
一直所做的都是同步实现的。当然很多情况这并不是很好的解决问题。现在手上的问题是:用户层通知底层驱动(Filter Driver)做某件事,然后返回该事件执行的结果。如果该事件是一件简单的事情,这里是指极短时间内可以完成的,那么在允许范围内,我们可以用同步来完成。但是如果该事件是一件耗时的工作,而应用程序不能一直在等着该事件的完成信号,况且好像DeviceIoControl有时间限制的(?)。这就需...2010-04-08 22:26:59 · 291 阅读 · 0 评论 -
基于PassThru的NDIS中间层驱动程序扩展(续)
基于PassThru的NDIS中间层驱动程序扩展4.2 接收处理 接收的时候,由于那个TransferData的曲折过程,使得接收处理要相对复杂一点点,在ProtocolReceive和 ProtocolReceivePacket中的处理不同。但是由于2003DDK中的PassThru中,没有对数据进行任何处理,所以,它的ProtocolReceive的处理相对来说,简单...原创 2009-07-21 22:48:54 · 181 阅读 · 0 评论 -
基于PassThru的NDIS中间层驱动程序扩展
概要:开发一个NDIS驱动是一项相对复杂的工作,这一方面是由于核心驱动本身有更多的限制和要求,有更多的“游戏规则”要求开发者理解和掌握,NDIS的复杂性把难度更是提高了,本文以PassThru为例,加上自己的理解,讲述了NDIS驱动的处理过程和在PassThru的基础上进行扩展的基本方法,本文并不是一个入门读物,所以没有提及任何核心驱动开发的相关知识,本文主要讲述的是NDIS中间层对数据包...原创 2009-07-21 22:45:05 · 269 阅读 · 0 评论 -
驱动开发教程
介绍下CodeProject中的一个教程,总共有6个部分。[list][*][url=http://www.codeproject.com/KB/system/driverdev.aspx]Driver Development Part 1: Introduction to Drivers [/url][*][url=http://www.codeproject.com/KB/syst...2009-12-05 01:02:58 · 146 阅读 · 0 评论 -
IOCTL_NDIS_QUERY_GLOBAL_STATS的使用
从WLAN Scan with NDIS Miniport and Much More 这篇文章知道可以使用IOCTL_NDIS_QUERY_GLOBAL_STATS,然后通过DeviceIoControl()函数把需要的OID传递给底层的Filter驱动或者Miniport驱动。犹如:oidcode = OID_802_11_BSSID_LIST ;//action ...2009-12-04 09:43:34 · 1391 阅读 · 0 评论 -
GetLastError()为0x5
一个自己写的Filter驱动,定义的Filter_Service_Name为:#define FILTER_DEVICE_NAME L"\\\\.\\NDISLWF" 然后想用CreateFileW()方法来打开这个Handler: #define FILTER_DEVICE_NAME L"\\\\.\\NDISLWF"/...2009-12-03 17:22:27 · 481 阅读 · 0 评论 -
IEEE 802.1Q中的数据读取
前天还为一下的代码耿耿于怀,因为不明白为什么地址+偏移量,然后再来或、与运算。 if(pEthHeader->EthType == TESTPROV_ETH_TYPE_802_1Q) { if(NET_BUFFER_LIST_INFO(pNetBufferList, Ieee8021QNetBufferListInfo) == 0)// no tag info p...2009-11-29 12:12:59 · 743 阅读 · 2 评论 -
MDL中数据读取
澄清一个误区:每个Net_BuFFER包含的是一个linked-list的MDL,而不仅仅是一个MDL。所以你要访问Net_BuFFER中数据,你需要在代码中根据需要的offset遍历MDL链表。比如第一个MDL只有14byte有数据(忽略unused data,backfill..),那么它就包含了EtherNet Header,那么下一个可能包含IP Header,再下一个包含TCP hea...2009-11-28 11:52:08 · 889 阅读 · 0 评论 -
拷贝MDL中数据到缓冲区
//Copy the packet into a buffer while (CurrentMdl && DataLength > 0) { NdisQueryMdl(CurrentMdl, &pSrc, &CurrLength, NormalPagePriority); if (pSrc == NULL) ...2009-11-27 23:07:43 · 425 阅读 · 0 评论 -
Header Drawing
各种包的头:原创 2009-11-27 15:45:39 · 129 阅读 · 0 评论 -
Sample Ping Packet Decode
[size=medium]The purpose of this topic is to partially decode a ICMP Echo or "Ping" packet as it appears on an Ethernet network. [b]Packet Representation On The Network[/b]The following is...原创 2009-11-27 10:26:12 · 155 阅读 · 0 评论 -
关于DebugView无法打印出DbgPrint信息
朋友调试一个Filter驱动程序,但终究无法在Debugview中打印出调试信息。[code="c++"]#if DBGextern INT filterDebugLevel;#define DEBUGP(lev, stmt) \ { ...2009-11-25 22:35:03 · 2489 阅读 · 0 评论 -
关于IHV service的安装
关于IHV service的安装,MSDN上面有略微的介绍,同样可以参考这里。两者并无明显区别。但对个人而言,两者都不够详细,所以我只好误打误撞。按照上面的指示:在INF文件中修改如下: CopyFile direcive:[CoInstaller.CopyFiles]RaCoInst.dll,,,2RaCoInst.dat,,,2ihvsample.dll,,,2IH...2009-11-13 17:10:40 · 1172 阅读 · 0 评论 -
VMware+Windgb+Win7内核驱动调试
本文主要记录个人安装VMware+Windgb+Win7内核驱动调试的笔记。一、安装环境主机:Windows Vista Bussiness虚拟机:VMware 7GUestOS: Win7Windbg: 6.11二、虚拟机配置打开相应 vmware 虚拟机上的 “Virtaul Machine Settings“ “Hardware ”选项中 ----&...2009-12-10 00:47:28 · 269 阅读 · 0 评论 -
Vmware+Windbg调试示例
Vmware+Windbg调试环境配置,请参考VMware+Windgb+Win7内核驱动调试。测试程序来自《内核安全编程》第一个例子。////// @file first.c/// @author crazy_chu/// @date2008-11-1/// #include <ntddk.h> // Unload functionVOID D...2009-12-10 18:50:41 · 165 阅读 · 0 评论 -
Filter发送OID请求[解决蓝屏]
想从Filter发送一个OID请求到Miniport. case IOCTL_FILTER_CREATE_NEW_MAC: //Add by leyond to request miniport to create a new MAC InputBuffer = OutputBuffer = (PUCHAR)Irp->AssociatedIrp.SystemBuffer...2009-12-10 19:23:42 · 390 阅读 · 0 评论 -
大数据是否需要封装在多个MDL中发送
前段时间,我们已经解决如何发送自定义的网络数据。那么接下来要做的是,要是要发送的数据很大, 是否需要把数据拆分,然后封装在多个MDL中发送呢?由于NdisAllocateMDL函数只能分配一个MDL,所以倘若需要多个MDL的话,那么就要解决如何串联多个MDL的问题。现在所掌握的资料,如果通过预分配调用NdisALlocateNetBufferAndNetbufferList的方式构建NBL的话,那...2010-03-27 21:40:54 · 166 阅读 · 0 评论