gfsoft
驱动牛犊
驱动牛犊
  • 注册日期2001-03-26
  • 最后登录2005-10-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:12917回复: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);
}


其中一些入口程序的作用我也不太清除,等研究明白我再贴上来:)
有信心不一定会赢,没有信心一定会输
znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
沙发#
发布于:2001-12-31 08:38
看错了吧?

排行前 5 位被浏览的主题:
北京 \'拽哥、拽妹\' 聚会! - 浏览 6723 次
Ndis中间过滤驱动程序开发心得(1) - 浏览 4656 次
USB热点!!! - 浏览 4098 次
聚会专题报道!! - 浏览 3305 次
期望月薪(驱动开发)疑惑 - 浏览 3069 次
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
gfsoft
驱动牛犊
驱动牛犊
  • 注册日期2001-03-26
  • 最后登录2005-10-27
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-12-30 23:55
呵呵,这个帖子应该是这个站点上浏览最多的一个:)
有信心不一定会赢,没有信心一定会输
chen001
驱动小牛
驱动小牛
  • 注册日期2001-12-24
  • 最后登录2005-05-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2001-12-28 10:02
有没有源代码可以参考呢?
???
andy
驱动牛犊
驱动牛犊
  • 注册日期2001-05-11
  • 最后登录2003-07-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2001-07-18 14:39
passthru 是否只能在 ICE 中调试的时候察看拦截包的内容,而不能再 AP 中来控制察看?
jeosph
驱动中牛
驱动中牛
  • 注册日期2001-04-19
  • 最后登录2006-08-08
  • 粉丝0
  • 关注0
  • 积分96分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2001-06-26 19:08
passthru怎么用的啊?
我装上了,可是点击后要PARAMETER1,ID,我就不知道该怎么办了?
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
6楼#
发布于:2001-06-26 18:37
在哪里讨论NDIS不合适啊?
我只在两个地方出没,主要是
这里和白云站上。

现在没有写NDIS的激情,去年
的这个时候本来写了一些,不过
后来就因为种种原因没有继续写
下去了。这的确是一个遗憾,不
过如果现在写的话,理解可能
要更深一些了,错误可能要少
一些。




不再回忆从前,我已经生活在幸福当中。
hhxxj
驱动牛犊
驱动牛犊
  • 注册日期2001-03-23
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2001-06-26 11:06
胡老大, 原来跑到这里做版主了恭喜恭喜!
对了, 本来想在那里和你讨论NDIS的,但是那里实在不适合阿!
把系统调用NDIS的过程说下?
讲讲中断处理过程?
zjb
zjb
驱动牛犊
驱动牛犊
  • 注册日期2001-04-13
  • 最后登录2004-05-20
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2001-06-14 09:21
packet为空,因为爬虫p-d还没有和b-d连起来,
当调用ndischainbufferonfront(back)后就不为空了
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
9楼#
发布于:2001-06-13 23:28
前面的贴子里面有个错误,网络模块的加载次序应该是
先加载ndis,然后是protocol,最后才是miniport。
不再回忆从前,我已经生活在幸福当中。
magie
驱动牛犊
驱动牛犊
  • 注册日期2001-05-17
  • 最后登录2001-11-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2001-05-22 14:41
谁知道NDIS中间层驱动能否控制拨号网络的数据,怎么实现?
springl
驱动牛犊
驱动牛犊
  • 注册日期2001-05-08
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2001-05-15 22:09
有没有哪位大虾,有对VPACKET的分析,(无论多少,是否完整) 可否贴到坛子上,共享一下??多谢多谢!(帮初学者一个忙吧)
victroy
驱动牛犊
驱动牛犊
  • 注册日期2001-04-16
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2001-05-15 20:16
我最近也正在研究ndis的中间层驱动程序,希望可以彼此交流。
email:wangxdbme@263.net oicq:67815651
liger
驱动牛犊
驱动牛犊
  • 注册日期2001-05-03
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2001-05-05 11:50
可以管理无数个(呵呵,当然实际上是不可能的)硬件网卡呀。
每一个硬件网卡上绑定一个
不用
blue
驱动大牛
驱动大牛
  • 注册日期2001-04-25
  • 最后登录2010-10-15
  • 粉丝0
  • 关注0
  • 积分55分
  • 威望12点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2001-04-26 20:21
TO: ICON
我在研究passthru中遇到与你相同的问题,在PtReceive()函数中收不到包问题主要在 Packet = NdisGetReceivedPacket(), 结果是Packet==NULL。我也怀疑是Packet没有收完整,但收到一部分也应该返还Packet一个地址,然后由PtTransferDataComplete()继续接受其余部分。

[blue 编辑于 2001-04-26 20:25]
ICON
驱动牛犊
驱动牛犊
  • 注册日期2001-03-23
  • 最后登录2004-02-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2001-04-24 17:27
而且新的环境里COMPUTER的CPU更快,内存更大。。。


另: 请问IMSAMP可否在WIN2000下安装?如何做?(我听说有人可以)。。。
lxf
lxf
驱动小牛
驱动小牛
  • 注册日期2001-03-26
  • 最后登录2013-05-04
  • 粉丝4
  • 关注0
  • 积分76分
  • 威望30点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2001-04-24 10:14
你换了一个机器,网卡是不是类型不一样?不同NIC处理PACKET的方法不一样。
别着急,慢慢来!
ICON
驱动牛犊
驱动牛犊
  • 注册日期2001-03-23
  • 最后登录2004-02-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2001-04-24 10:08
我在PASSTHRU的例子里来回看了几趟,对收发的IP包的TCP/UDP协议进行了加密处理。
在我的实验环境里用NETXRAY可观察到我的处理,用FTP/HTTP都OK。
但当我在其他的机器环境下安装,发现发送的处理在NETXRAY里可看到,而用SOFTICE跟踪发现:
PtReceive的收处理有问题。。PACKET取不出。
分析IMSAMP的例子,怀疑与NIC向PASSTHRU提交PACKET是不完整的,须进一步处理,但看IMSAMP里处理好复杂。。。:{}
希望各位大侠帮小弟一把。。。。。
十万分的感谢。。。。!
hyl7877
驱动牛犊
驱动牛犊
  • 注册日期2001-04-05
  • 最后登录
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2001-04-19 15:37
各位大侠, 我在2000下安装了passthru后,不知如何看该驱动的作用,怎么调试驱动?
另外,我想passthru改造一下应该可以在NT4下运行。
abraham
驱动牛犊
驱动牛犊
  • 注册日期2001-03-26
  • 最后登录2002-06-19
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2001-04-12 15:47
我找到答案了。不能用:(
上一页
游客

返回顶部