阅读:12917回复:37
Ndis中间过滤驱动程序开发心得(1)
小弟也是刚刚开始研究这类程序,想把研究中学到的在这里贴出来,
大家可以互相学习,同时也是对我的一个督促:) 一个驱动程序刚开始肯定是从DriverEntry进入, Ndis中间驱动程序一般在这个入口点里做两件事, 一个注册对上层提供的miniport 另一个是对下层提供的protocol 我们看一个例子 NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) /*++ Routine Description: Arguments: Return Value: --*/ { NDIS_STATUS Status; NDIS_PROTOCOL_CHARACTERISTICS PChars; NDIS_MINIPORT_CHARACTERISTICS MChars; PNDIS_CONFIGURATION_PARAMETER Param; NDIS_STRING Name; NDIS_HANDLE WrapperHandle; //初始化打包器,如果打包器没有启动则启动,这个是中间驱动必调用的 //参数NdisWrapperHandle是返回的一个句柄,用来提供给后面的 //NdisIMRegisterLayeredMiniport函数 NdisMInitializeWrapper(&WrapperHandle, DriverObject, RegistryPath, NULL); //把NDIS_MINIPORT_CHARACTERISTICS类型的MChars结构全部置0 NdisZeroMemory(&MChars, sizeof(NDIS_MINIPORT_CHARACTERISTICS)); //设置ndis的版本是4 MChars.MajorNdisVersion = 4; MChars.MinorNdisVersion = 0; //初始化miniprot,这个入口通过ProtocolBindAdapter 调用 //NdisIMInitializeDeviceInstance时激发。 MChars.InitializeHandler = MPInitialize; MChars.QueryInformationHandler = MPQueryInformation; MChars.SetInformationHandler = MPSetInformation; MChars.ResetHandler = MPReset; MChars.TransferDataHandler = MPTransferData; MChars.HaltHandler = MPHalt; // // We will disable the check for hang timeout so we do not // need a check for hang handler! // MChars.CheckForHangHandler = NULL; MChars.SendHandler = MPSend; MChars.ReturnPacketHandler = MPReturnPacket; // // Either the Send or the SendPackets handler should be specified. // If SendPackets handler is specified, SendHandler is ignored // // MChars.SendPacketsHandler = MPSendPackets; //注册Miniport Status = NdisIMRegisterLayeredMiniport(WrapperHandle, &MChars, sizeof(MChars), &DriverHandle); ASSERT(Status == NDIS_STATUS_SUCCESS); NdisMRegisterUnloadHandler(WrapperHandle, PtUnload); // // Now register the protocol. // NdisZeroMemory(&PChars, sizeof(NDIS_PROTOCOL_CHARACTERISTICS)); PChars.MajorNdisVersion = 4; PChars.MinorNdisVersion = 0; // // Make sure the protocol-name matches the service-name under which this protocol is installed. // This is needed to ensure that NDIS can correctly determine the binding and call us to bind // to miniports below. // NdisInitUnicodeString(&Name, L"SFilter"); // Protocol name PChars.Name = Name; PChars.OpenAdapterCompleteHandler = PtOpenAdapterComplete; PChars.CloseAdapterCompleteHandler = PtCloseAdapterComplete; PChars.SendCompleteHandler = PtSendComplete; PChars.TransferDataCompleteHandler = PtTransferDataComplete; PChars.ResetCompleteHandler = PtResetComplete; PChars.RequestCompleteHandler = PtRequestComplete; PChars.ReceiveHandler = PtReceive; PChars.ReceiveCompleteHandler = PtReceiveComplete; PChars.StatusHandler = PtStatus; PChars.StatusCompleteHandler = PtStatusComplete; PChars.BindAdapterHandler = PtBindAdapter; PChars.UnbindAdapterHandler = PtUnbindAdapter; PChars.UnloadHandler = NULL; PChars.ReceivePacketHandler = PtReceivePacket; PChars.PnPEventHandler= PtPNPHandler; //注册Protocol NdisRegisterProtocol(&Status, &ProtHandle, &PChars, sizeof(NDIS_PROTOCOL_CHARACTERISTICS)); ASSERT(Status == NDIS_STATUS_SUCCESS); NdisIMAssociateMiniport(DriverHandle, ProtHandle); return(Status); } 其中一些入口程序的作用我也不太清除,等研究明白我再贴上来:) |
|
|
沙发#
发布于:2001-12-31 08:38
看错了吧?
排行前 5 位被浏览的主题: 北京 \'拽哥、拽妹\' 聚会! - 浏览 6723 次 Ndis中间过滤驱动程序开发心得(1) - 浏览 4656 次 USB热点!!! - 浏览 4098 次 聚会专题报道!! - 浏览 3305 次 期望月薪(驱动开发)疑惑 - 浏览 3069 次 |
|
|
板凳#
发布于:2001-12-30 23:55
呵呵,这个帖子应该是这个站点上浏览最多的一个:)
|
|
|
地板#
发布于:2001-12-28 10:02
有没有源代码可以参考呢?
|
|
|
地下室#
发布于:2001-07-18 14:39
passthru 是否只能在 ICE 中调试的时候察看拦截包的内容,而不能再 AP 中来控制察看?
|
|
5楼#
发布于:2001-06-26 19:08
passthru怎么用的啊?
我装上了,可是点击后要PARAMETER1,ID,我就不知道该怎么办了? |
|
6楼#
发布于:2001-06-26 18:37
在哪里讨论NDIS不合适啊?
我只在两个地方出没,主要是 这里和白云站上。 现在没有写NDIS的激情,去年 的这个时候本来写了一些,不过 后来就因为种种原因没有继续写 下去了。这的确是一个遗憾,不 过如果现在写的话,理解可能 要更深一些了,错误可能要少 一些。 |
|
|
7楼#
发布于:2001-06-26 11:06
胡老大, 原来跑到这里做版主了恭喜恭喜!
对了, 本来想在那里和你讨论NDIS的,但是那里实在不适合阿! 把系统调用NDIS的过程说下? 讲讲中断处理过程? |
|
8楼#
发布于:2001-06-14 09:21
packet为空,因为爬虫p-d还没有和b-d连起来,
当调用ndischainbufferonfront(back)后就不为空了 |
|
9楼#
发布于:2001-06-13 23:28
前面的贴子里面有个错误,网络模块的加载次序应该是
先加载ndis,然后是protocol,最后才是miniport。 |
|
|
10楼#
发布于:2001-05-22 14:41
谁知道NDIS中间层驱动能否控制拨号网络的数据,怎么实现?
|
|
11楼#
发布于:2001-05-15 22:09
有没有哪位大虾,有对VPACKET的分析,(无论多少,是否完整) 可否贴到坛子上,共享一下??多谢多谢!(帮初学者一个忙吧)
|
|
12楼#
发布于:2001-05-15 20:16
我最近也正在研究ndis的中间层驱动程序,希望可以彼此交流。
email:wangxdbme@263.net oicq:67815651 |
|
13楼#
发布于:2001-05-05 11:50
可以管理无数个(呵呵,当然实际上是不可能的)硬件网卡呀。
每一个硬件网卡上绑定一个 |
|
|
14楼#
发布于:2001-04-26 20:21
TO: ICON
我在研究passthru中遇到与你相同的问题,在PtReceive()函数中收不到包问题主要在 Packet = NdisGetReceivedPacket(), 结果是Packet==NULL。我也怀疑是Packet没有收完整,但收到一部分也应该返还Packet一个地址,然后由PtTransferDataComplete()继续接受其余部分。 [blue 编辑于 2001-04-26 20:25] |
|
15楼#
发布于:2001-04-24 17:27
而且新的环境里COMPUTER的CPU更快,内存更大。。。
另: 请问IMSAMP可否在WIN2000下安装?如何做?(我听说有人可以)。。。 |
|
16楼#
发布于:2001-04-24 10:14
你换了一个机器,网卡是不是类型不一样?不同NIC处理PACKET的方法不一样。
|
|
|
17楼#
发布于:2001-04-24 10:08
我在PASSTHRU的例子里来回看了几趟,对收发的IP包的TCP/UDP协议进行了加密处理。
在我的实验环境里用NETXRAY可观察到我的处理,用FTP/HTTP都OK。 但当我在其他的机器环境下安装,发现发送的处理在NETXRAY里可看到,而用SOFTICE跟踪发现: PtReceive的收处理有问题。。PACKET取不出。 分析IMSAMP的例子,怀疑与NIC向PASSTHRU提交PACKET是不完整的,须进一步处理,但看IMSAMP里处理好复杂。。。:{} 希望各位大侠帮小弟一把。。。。。 十万分的感谢。。。。! |
|
18楼#
发布于:2001-04-19 15:37
各位大侠, 我在2000下安装了passthru后,不知如何看该驱动的作用,怎么调试驱动?
另外,我想passthru改造一下应该可以在NT4下运行。 |
|
19楼#
发布于:2001-04-12 15:47
我找到答案了。不能用:(
|
|
上一页
下一页