makefriend8
驱动小牛
驱动小牛
  • 注册日期2003-08-01
  • 最后登录2014-06-27
  • 粉丝0
  • 关注0
  • 积分84分
  • 威望111点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
阅读:4955回复:9

学习ExtendingPassthru(1)

楼主#
更多 发布于:2005-02-13 21:05
代码:http://www.wd-3.com/downloads/ExtendingPassthru.zip
环境及工具 DDK,VC,2000/XP/2003
编译成功后得到驱动程序Passthru.sys和测试程序Ptuserio
然后安装驱动。 (开始-》程序-》附件-》通讯-》网络和拨号连接-》本地连接-》属性-》安装-》服务,磁盘安装)选那个netsf.inf
运行ptuserio得到如下结果(个人电脑配置不同,结果只是类似了)
运行结果如下
PassThru User I/O Test Application
Copyright (c) 2003 Printing Communications Assoc., Inc. (PCAUSA)
All rights reserved.
Driver Bindings:
   "\Device\{67A4853E-1940-43A3-A442-74701B5133B0}"
      Description: " Intel 8255x-based Integrated Fast Ethernet"
      Medium: 802.3
      Mac address = 00-00-39-14-92-A9
      Media Connect Status: Disconnected
   "\Device\{0611AD65-41D8-4BB1-8A8F-43008BB362A3}"
      Description: " NdisWan Adapter"
      Medium: 802.3
      Mac address = C0-F2-20-52-41-53
      Media Connect Status: Connected
   "\Device\{8DA82E8E-D091-4FB2-902A-673FBEC2DA7C}"
      Description: "3CRWE737A AirConnect Wireless LAN PC Card"
      Medium: 802.3
      Mac address = 00-50-DA-03-4E-6C
      Media Connect Status: Connected
程序详细说明:
应用程序流程:
1:调用PtOpenControlChannel函数,其内部使用CreateFile函数打开设备
2:调用PtEnumerateBindings函数,其内部使用DeviceIoControl 函数枚举绑定信息
3:调用PtOpenAdapter函数打开适配器
4:调用PtDisplayAdapterInfo函数,显示各种信息 内部调用PtQueryInformation函数
5:调用PtCloseAdapter关闭适配器

最新喜欢:

wingmanwingma...
makefriend8
驱动小牛
驱动小牛
  • 注册日期2003-08-01
  • 最后登录2014-06-27
  • 粉丝0
  • 关注0
  • 积分84分
  • 威望111点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-02-15 11:21
驱动代码分析:
为了使加载程序能够准确地识别,必须将中间层驱动程序的初始入口点明确地指定为DriverEntry的形式。
在本程序中,DriverEntry完成以下工作:
     调用NdisMInitializeWrapper并保存在NdisWrapperHandle中返回的句柄;
     传递上一步保存的句柄,调用NdisIMRegisterLayeredMiniport注册驱动程序的MiniportXxx函数;就是一系列MP函数啦!
     驱动程序随后绑定到低层NDIS驱动程序上,调用NdisRegisterProtocol注册驱动程序的ProtocolXxx函数;就是一堆Pt函数啦!
        驱动程序导出了MiniportXxx和ProtocolXxx函数,所以调用NdisIMAssociateMiniport向NDIS通告有关驱动程序的微端口低边界和协议高边界信息;
DriverEntry能够为中间层驱动程序分配的所有共享资源初始化自旋锁,所以程序104行有NdisAllocateSpinLock(&GlobalLock);
MiniportXxx函数就是向上层提供TDI(传输驱动程序接口)支持的传输驱动程序。
ProtocolXxx函数就是向下层提供协议,我想,理解为直接调用网卡硬件函数也算不错的吧!
就让我们自己仔细看看这所有的这些MP函数,Pt函数到底干了点啥。
(to be continued)
makefriend8
驱动小牛
驱动小牛
  • 注册日期2003-08-01
  • 最后登录2014-06-27
  • 粉丝0
  • 关注0
  • 积分84分
  • 威望111点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-02-15 12:48
函数还是挺多的。静下心来。先大致看一下所有的MP和Pt函数吧!
以下基本是抄的2000驱动开发指南,头看的好晕啊!要想能灵活运用,还不是件很容易的事呢!
这个程序总共是如下几个MP函数
1: MPInitialize  
作为中间层驱动程序调用NdisIMInitializeDeviceInstance初始化微端口的结果,调用该函数对虚拟网卡进行初始化。
2: MPQueryInformation
该函数接收OID_XXX请求,这个请求来自于高层驱动程序(用NdisRequestQueryInformation请求类型作参数调用NdisRequest)。
3: MPSetInformation
该函数接收OID_XXX请求,这个请求来自于高层驱动程序(用NdisRequestSetInformation请求类型作参数,调用NdisRequest
)。
4: MPTransferData
该函数用于传输在前视缓冲区中没有指示的接收数据包的剩余部分,该前视缓冲区由中间层驱动程序传递给
NdisMXxxIndicateReceive函数。这个被指示的数据包可以是中间层驱动程序的ProtocolReceive函数或者是
ProtocolReceivePackets处理程序接收的转换数据包。如果中间层驱动程序通过调用(除NdisMWanIndicateReceive之外)
NdisMXxxIndicateReceive函数向上层驱动程序指示接收数据包,那么该处理程序是必须提供的。如果中间层驱动程序总是通
过调用NdisMIndicateReceivePacket向上层驱动程序指示接收数据包,则不必要提供MiniportTransferData函数。
5: MPHalt
当低层NIC超时并且NDIS已经中止了网卡驱动程序时,或者操作系统正在执行一个可控的系统关闭操作时,NDIS将调用该函数
6: MPReturnPacket
该函数接收返回包描述符(该包描述符先前通过NdisMIndicateReceivePacket调用向高层指示),从而释放指示给高层驱动程序的资源的控制权。在高层驱动程序处理完所有指示之后,中间层驱动程序分配的描述符及所描述的资源将返回给
MiniportReturnPacket函数。当然,如果中间层驱动程序总是通过调用介质相关的NdisMXxxIndicateReceive函数向上层指示数据包,或者在调用NdisMIndicateReceivePacket之前总是将OOB数据块(与每一个描述符相关的)状态设置为NDIS_STATUS_RESOUCES,则不必提供MiniportReturnPacket函数。
7: MPSendPackets
该函数接收用于指定网上传输数据包的包描述符指针数组。除非中间层驱动程序绑定到低层WAN NIC驱动程序上并提供了
MiniportWanSend函数,否则驱动程序应提供对MiniportSendPackets而不是MiniportSend函数支持。换句话说,不管中间层驱动程序是基于每次只能传送单个数据包的网卡驱动程序;还是基于每次可以传送多个数据包的网卡驱动程序,也不管中间层驱动程序是基于每次只能传送单个数据包的协议驱动程序;还是基于每次可以传送多个数据包的协议驱动程序,MiniportSendPackets函数都能实现最好的性能,
(还有几个影响不大,暂不讨论啦)
有这几个Pt函数
1。PtOpenAdapterComplete
这是一个必须提供的函数。如果中间层驱动程序对NdisOpenAdapter的调用返回NDIS_STATUS_PENDING,则接着调用ProtocolOpenAdapterComplete来完成绑定。
2。PtCloseAdapterComplete
这是一个必须提供的函数。如果中间层驱动程序对NdisCloseAdapter的调用返回NDIS_STATUS_PENDING,则接着调用
ProtocolCloseAdapterComplete来完成绑定释放
3。PtSendComplete
这是一个必须提供的函数。对每一个调用NdisSend函数传输的数据包,当其返回NDIS_STATUS_PENDING作为发送状态时,将调用ProtocolSendComplete函数完成发送操作。如果调用NdisSendPackets发送一组数据包,那么对于每一个传送给
NdisSendPackets的数据包,ProtocolSendComplete将被调用一次。中间层驱动程序仅仅根据送给ProtocolSendComplete的状
态参数就能确定调用NdisSendPackets函数的发送操作的状态。
4。PtTransferDataComplete
如果ProtocolReceive要调用NdisTransferData函数,则必须提供该处理程序。如果复制接收数据包剩余部分的
NdisTransferData函数调用返回NDIS_STATUS_PENDING,那么当传输操作完成后,将调用ProtocolTransferDataComplete函数。
5。PtResetComplete
这是一个必须提供的函数。当先前指示给ProtocolReceive 函数的数据包被处理后,将调用ProtocolReceiveComplete函数。
6。PtRequestComplete
这是一个必须提供的函数。当NdisRequest函数(返回NDIS_STATUS_PENDING)调用启动的查询或设置操作完成时,
ProtocolRequestComplete函数将被调用。
7。PtReceive
这是一个必须提供的函数。ProtocolReceive函数以指向包含网络接收数据的前视缓冲区的指针为参数被调用执行。如果该缓冲区包含的不是完整的网络数据包,ProtocolReceive以数据包描述符作为参数,调用NdisTransferData接收该数据包的剩余部分。如果低层驱动程序调用NdisMIndicateReceivePacket指示接收数据包,那么传给ProtocolReceive函数的前视缓冲区将总是完整的网络数据包。
8。PtReceiveComplete
这是一个必须提供的函数。当先前指示给ProtocolReceive 函数的数据包被处理后,将调用ProtocolReceiveComplete函数
9。PtStatus
这是一个必须提供的函数。NDIS用低层NIC驱动程序发起的状态通知来调用
10。PtStatusComplete
这是一个必须提供的函数。NDIS调用ProtocolStatusComplete函数来指示状态改变操作已经完成,该状态先前被指示给ProtocolStatus函数。
11。PtBindAdapter
这是一个必须提供的函数。NDIS调用该函数请求中间层驱动程序绑定到低层NIC或虚拟NIC上,NIC名作为该处理程序的一个参数传递
12。PtUnbindAdapter
这是一个必须提供的函数。NDIS调用ProtocolUnbindAdapter释放对低层NIC或虚拟NIC的绑定,网卡名作为该处理程序的一个参数传递。当绑定成功关闭时,ProtocolUnbindAdapter将调用NdisCloseAdapter函数并释放相关资源。
13。PtUnloadProtocol
这是一个可选函数。NDIS调用ProtocolUnload函数来响应用户卸载中间层驱动程序的请求。对于每一个绑定的适配器,NDIS在调用ProtocolUnbindAdapter之后,将调用ProtocolUnload函数卸载驱动程序。ProtocolUnload执行驱动程序决定的清除操作。
14。PtReceivePacket
这是一个可选函数。如果中间层驱动程序所基于的NIC驱动程序指示的是数据包描述符指针数组,或者调用
NdisMIndicateReceivePacket函数指示接收带外数据,那么驱动程序应提供ProtocolReceivePacket函数。如果开发者不能确定中间层驱动程序的执行环境,也应提供函数,因为在能够产生多包指示的低层NIC驱动程序上,中间层驱动程序将获得更好的性能。
15。PtPNPHandler
这是一个必须提供的函数。NDIS调用ProtocolPnPEvent来指示即插即用事件或电源管理事件。

wangshust
驱动牛犊
驱动牛犊
  • 注册日期2004-10-13
  • 最后登录2005-05-28
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-05-16 20:06
我是初学者,你说的那个http://www.wd-3.com/downloads/ExtendingPassthru.zip
的包我不能下
可以把这个例子发给我么?我的邮箱是wangshust@sohu.com
相信我没错!
imJgs
驱动牛犊
驱动牛犊
  • 注册日期2005-02-07
  • 最后登录2010-02-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-06-06 17:08
请教 一下关于编译环境的问题.
这个代码我下下来之后, 在DDK的FREE或是CHECK环境下都不能成功编译, 一般是很多个链接时有个什么JVC不是可执行命令这样的错误, 不知道链接生成的参数应该是什么..
再就是我后来用DRIVERSTUDIO把它生成对应VS2003的工程文件,在其FREE模式下可以成功, 但是在CHK模式下, 会有一个什么没有定义__load_config_used的东东 . 在MSDN里搜这个只搜到了一个,,然后按其说的自己给加一个这个名字的全局变量进去, 却出现了语法错, 请有经验的指教
joealec
驱动牛犊
驱动牛犊
  • 注册日期2005-06-06
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-06-06 21:16
测试程序Ptuserio是怎么编译的 啊?
也使用ddk来编译吗?
还是用vc?
imJgs
驱动牛犊
驱动牛犊
  • 注册日期2005-02-07
  • 最后登录2010-02-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-06-08 03:58
回五楼:VC就可以了

另:我发现一个新问题.
按道理, 不同的编译配置应该是互不相干的
(如DEBUG和RELEASE, 在用了DS后的W32CHK和W32FRE)
如果我直接用CONVERTER转换, 如我在第四楼所说, FREE模式OK
CHK出问题
但是如果我删了CHK,
那么FREE会出现原来CHK的问题, 请问高手到底问题在哪儿?
joealec
驱动牛犊
驱动牛犊
  • 注册日期2005-06-06
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-06-09 14:11
回五楼:VC就可以了

另:我发现一个新问题.
按道理, 不同的编译配置应该是互不相干的
(如DEBUG和RELEASE, 在用了DS后的W32CHK和W32FRE)
如果我直接用CONVERTER转换, 如我在第四楼所说, FREE模式OK
CHK出问题
但是如果我删了CHK,
那么FREE会出现原来CHK的问题, 请问高手到底问题在哪儿?


我是在vc中建一个project
然后把test文件夹里的所有文件都添加到工程中
然后编译ptuserio.cpp文件
提示我:
c:\\ntddk\\src\\network\\ndis\\extendingpassthru\\test\\stdafx.h(27) : fatal error C1083: Cannot open include file: \'ntddndis.h\': No such file or directory

请问这是怎么回事啊?我有那个地方不对么?

joealec
驱动牛犊
驱动牛犊
  • 注册日期2005-06-06
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分58分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-08-01 17:29
请问 有人加载这个驱动后
发现网络不通了么?

请问这是什么原因??
xupang
驱动牛犊
驱动牛犊
  • 注册日期2011-06-17
  • 最后登录2013-06-05
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望51点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2011-06-18 16:37
无法通过build  生成sys  
游客

返回顶部