阅读:12690回复: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-03-29 17:02
有改ip包的程序吗?延时或者加密的。。。。
谢了! |
|
板凳#
发布于:2001-03-29 17:06
to gfsoft:
可以出任本版版主吗?这样大家可以更好地学习!希望回复。 |
|
|
地板#
发布于:2001-03-29 17:08
想要实现这些功能,据我所知可以通过些中间层驱动,或者把驱动附加在其他中间层驱动上.或者自己编写Miniprot程序
|
|
|
地下室#
发布于:2001-03-29 17:10
对于Ndis我也是刚接触不久,不知道能不能胜任:)
|
|
|
5楼#
发布于:2001-03-29 17:14
水平无所谓,关键是大家能提高。站长本人是一介菜鸟,不也是在这儿充老大。热情第一,水平第二!
|
|
|
6楼#
发布于:2001-03-29 17:16
我同意。。。。
热情第一。。。。 |
|
7楼#
发布于:2001-03-29 17:26
既然大家这么看得起我,
这样吧,我刚注册用户不久,大家都互相不熟悉,为了民主,过个一两个星期在决定好不好:) |
|
|
8楼#
发布于:2001-03-29 17:35
你先上任吧!如果有更好人选你再让贤也不迟呀!
|
|
|
9楼#
发布于:2001-03-29 18:37
我已经把IMSAMP编译了,并且安装在系统上了,但并没有什么作用。
我在驱动的发送入口设了断点,但是没有引发。在安装驱动后出现 了个新的网卡(虚拟的)还要设置IP,怎么搞的。 |
|
10楼#
发布于:2001-03-30 09:57
我想请问发表心得的同志,有OICQ吗?
小弟想向他请教问题若干! |
|
11楼#
发布于:2001-04-02 15:21
中间层可以管理几个物理网卡?
|
|
|
12楼#
发布于:2001-04-03 09:16
NTDDK里的passthru是一个标准的NDIS中间层过滤驱动,这只是一个框架,包通过它的时候什么都不做,你可以在receive和send 的例程中添加自己的过滤代码
|
|
|
13楼#
发布于:2001-04-03 09:19
小弟的oicq是589223大家可以互相切磋:)
|
|
|
14楼#
发布于:2001-04-03 09:31
我不知道你是怎么试的,
在这里我将一下DeviceIoControl的过程, 首先在IRP中等定义很多IRP_MJ开都得函数地址,这些地址指向驱动程序的实例,其中IRP_MJ_DEVICE_CONTROL,和IRP_MJ_INTERNAL_DEIVCE_CONTROL这两个MJ例程可以执行你自己所定义的函数。 这两个不同点是前者可是用API去请求,主要用在应用程序和驱动通讯,后者没有对应的API,主要用在驱动程序间的信息传递。 前者可以在用户模式下用DeviceIoControl来发送一个指定的IoControlCode给指定的驱动程序, 这是就会调用IRP_MJ_DEVICE_CONTROL例程,在这个例程里你可以拿到你发送的IoControlCode代码,这样你可以判断你的应用程序想让驱动程序干什么。 IoControlCode你可以用CTL_CODE来定义,从2048-4095都是可以用户自己选择的。 具体可以看一下DDK的帮助 |
|
|
15楼#
发布于:2001-04-03 09:44
回答这个问题首先需要明白NDIS的启动过程,
在NDIS的驱动堆栈里第一个启动的是NDIS的微端口驱动程序,当微端口驱动驱动的时候它就会引起打包器--NDIS端口驱动程序启动,NDIS端口/微端口驱动寻找总线,找到要控制的适配器,并为每个适配器建立一个设备对象, 接着中间层驱动就被启动,当一个中间层驱动启动的时候,它就通过IoGetDeviceObjectPointer函数去找刚才建立的设备对象,当发现一个或者更多的设备对象后,就创建一个或者更多的设备对象。这些中间成创建的设备对象是建立在微端口创建的设备基础上的。 |
|
|
16楼#
发布于:2001-04-09 10:41
呵呵,大家探讨探讨吧!
|
|
|
17楼#
发布于:2001-04-12 09:34
passthru能在nt4.0下用吗??
|
|
18楼#
发布于:2001-04-12 09:45
小弟初学NDIS,希望斑竹以后多帮忙 QQ:64469
|
|
19楼#
发布于:2001-04-12 15:47
我找到答案了。不能用:(
|
|
上一页
下一页