gfsoft
驱动牛犊
驱动牛犊
  • 注册日期2001-03-26
  • 最后登录2005-10-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:12690回复:37

Ndis中间过滤驱动程序开发心得(1)

楼主#
更多 发布于:2001-03-29 16:57
小弟也是刚刚开始研究这类程序,想把研究中学到的在这里贴出来,
大家可以互相学习,同时也是对我的一个督促:)
一个驱动程序刚开始肯定是从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);
}


其中一些入口程序的作用我也不太清除,等研究明白我再贴上来:)
有信心不一定会赢,没有信心一定会输
abraham
驱动牛犊
驱动牛犊
  • 注册日期2001-03-26
  • 最后登录2002-06-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-03-29 17:02
有改ip包的程序吗?延时或者加密的。。。。

谢了!
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
板凳#
发布于:2001-03-29 17:06
to gfsoft:
可以出任本版版主吗?这样大家可以更好地学习!希望回复。
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
gfsoft
驱动牛犊
驱动牛犊
  • 注册日期2001-03-26
  • 最后登录2005-10-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-03-29 17:08
想要实现这些功能,据我所知可以通过些中间层驱动,或者把驱动附加在其他中间层驱动上.或者自己编写Miniprot程序
有信心不一定会赢,没有信心一定会输
gfsoft
驱动牛犊
驱动牛犊
  • 注册日期2001-03-26
  • 最后登录2005-10-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2001-03-29 17:10
对于Ndis我也是刚接触不久,不知道能不能胜任:)
有信心不一定会赢,没有信心一定会输
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
5楼#
发布于:2001-03-29 17:14
水平无所谓,关键是大家能提高。站长本人是一介菜鸟,不也是在这儿充老大。热情第一,水平第二!
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
abraham
驱动牛犊
驱动牛犊
  • 注册日期2001-03-26
  • 最后登录2002-06-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2001-03-29 17:16
我同意。。。。
热情第一。。。。
gfsoft
驱动牛犊
驱动牛犊
  • 注册日期2001-03-26
  • 最后登录2005-10-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2001-03-29 17:26
既然大家这么看得起我,
这样吧,我刚注册用户不久,大家都互相不熟悉,为了民主,过个一两个星期在决定好不好:)
有信心不一定会赢,没有信心一定会输
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
8楼#
发布于:2001-03-29 17:35
你先上任吧!如果有更好人选你再让贤也不迟呀!
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
coolala
驱动牛犊
驱动牛犊
  • 注册日期2001-03-23
  • 最后登录2002-11-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2001-03-29 18:37
我已经把IMSAMP编译了,并且安装在系统上了,但并没有什么作用。
我在驱动的发送入口设了断点,但是没有引发。在安装驱动后出现
了个新的网卡(虚拟的)还要设置IP,怎么搞的。
hhxxj
驱动牛犊
驱动牛犊
  • 注册日期2001-03-23
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2001-03-30 09:57
我想请问发表心得的同志,有OICQ吗?
小弟想向他请教问题若干!
lxf
lxf
驱动小牛
驱动小牛
  • 注册日期2001-03-26
  • 最后登录2013-05-04
  • 粉丝4
  • 关注0
  • 积分76分
  • 威望30点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2001-04-02 15:21
中间层可以管理几个物理网卡?
别着急,慢慢来!
gfsoft
驱动牛犊
驱动牛犊
  • 注册日期2001-03-26
  • 最后登录2005-10-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2001-04-03 09:16
NTDDK里的passthru是一个标准的NDIS中间层过滤驱动,这只是一个框架,包通过它的时候什么都不做,你可以在receive和send 的例程中添加自己的过滤代码
有信心不一定会赢,没有信心一定会输
gfsoft
驱动牛犊
驱动牛犊
  • 注册日期2001-03-26
  • 最后登录2005-10-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2001-04-03 09:19
小弟的oicq是589223大家可以互相切磋:)
有信心不一定会赢,没有信心一定会输
gfsoft
驱动牛犊
驱动牛犊
  • 注册日期2001-03-26
  • 最后登录2005-10-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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的帮助

有信心不一定会赢,没有信心一定会输
gfsoft
驱动牛犊
驱动牛犊
  • 注册日期2001-03-26
  • 最后登录2005-10-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2001-04-03 09:44
回答这个问题首先需要明白NDIS的启动过程,
在NDIS的驱动堆栈里第一个启动的是NDIS的微端口驱动程序,当微端口驱动驱动的时候它就会引起打包器--NDIS端口驱动程序启动,NDIS端口/微端口驱动寻找总线,找到要控制的适配器,并为每个适配器建立一个设备对象,
接着中间层驱动就被启动,当一个中间层驱动启动的时候,它就通过IoGetDeviceObjectPointer函数去找刚才建立的设备对象,当发现一个或者更多的设备对象后,就创建一个或者更多的设备对象。这些中间成创建的设备对象是建立在微端口创建的设备基础上的。
有信心不一定会赢,没有信心一定会输
htflag
驱动牛犊
驱动牛犊
  • 注册日期2001-04-05
  • 最后登录2005-05-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2001-04-09 10:41
呵呵,大家探讨探讨吧!
生有何哀,死亦何苦
abraham
驱动牛犊
驱动牛犊
  • 注册日期2001-03-26
  • 最后登录2002-06-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2001-04-12 09:34
passthru能在nt4.0下用吗??
sunmico
驱动牛犊
驱动牛犊
  • 注册日期2001-04-10
  • 最后登录2018-06-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2001-04-12 09:45
小弟初学NDIS,希望斑竹以后多帮忙 QQ:64469
abraham
驱动牛犊
驱动牛犊
  • 注册日期2001-03-26
  • 最后登录2002-06-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2001-04-12 15:47
我找到答案了。不能用:(
上一页
游客

返回顶部