XiangXiangRen
总版主
总版主
  • 注册日期2003-02-22
  • 最后登录2015-09-01
  • 粉丝13
  • 关注0
  • 积分1042分
  • 威望472点
  • 贡献值1点
  • 好评度145点
  • 原创分13分
  • 专家分1分
阅读:1856回复:6

DriverNetworks第二课

楼主#
更多 发布于:2003-02-28 21:18
大部分从DriverNetworks帮助中翻译,仅做交流用!

第二课  管理Ndis Buffers,访问注册表

NDIS_BUFFER是另一个基本的数据结构,几乎被所有的网络驱动用于描述在系统内存中分配的内存快。在Windows NT中,NDIS_BUFFER就在NT内核中常用的MDL(内存描述符链)。

DriverNetworks将NDIS_BUFFER包装成KNdisBuffer类。这个类可以直接用于任何以PNDIS_BUFFER为参数的函数中。

NDIS_BUFFER总是从一个NDIS buffer pool(缓冲描述符池,下面简称缓冲池,别和真的缓冲池混淆)中分配的。在DriverNetWorks中,缓冲池相关的类是KNdisBufferPool,如果你的驱动使用

自己的缓冲池,一般得在你的Adapter类中包含一个KNdisBufferPool成员,并且在adapter的Initialize中初始化。

下面是使用 KNdisBuffer类的例子。

class MyAdapter : public KNdisMiniAdapter {
...
KNdisBufferPool m_Pool;
public:
NDIS_STATUS Initialize((KNdisMedium &Medium, IN KNdisconfig& Config)) {
m_Pool.Initialize(8); //初始化8个缓冲描述符的缓冲池
ASSERT(m_Pool.IsValid());
...
}

void SomeMethod(PVOID Data, UINT DataSize) {
KNdisBuffer buf = m_Pool.Allocate(Data,DataSize);
if(buf.IsValid()){/*在这里使用buf*/}
else{
//很糟糕,说明缓冲描述符用完了!
}
}

Ndis buffer就介绍到这里,这里只提一下在什么地方用,具体怎么操作,以后再说。

Ndis驱动通过类KNdisConfig类访问注册表。DriverNetworks架构总是在驱动初始化的时候生成一个KNdisConfig对象,并完adapter类的Initialize()成员函数中传入一个引用。包括微端口、

中间层驱动和协议驱动都是这种模式的。

每个NDIS驱动在注册表上都有一个子树,记载了设置参数。

对于NDIS微端口驱动,他的参数保存在
HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\xxxx\\Ndi\\params
(那串数字找起来很麻烦,但是我记记住了72两个数字,你会发现很有用!)

对于协议驱动,他的参数在:
HKEY_LOCAL_MACHINE\\SYSTEM|CurrentControlSet\\Services\\<protocol>\\Parameters

这个子树会被安装脚本(你写的驱动会需要一个inf文件才能安装,就这个东西)和系统填写。

类KNdisConfig类提供了公有成员函数Read()和Write来从注册表读写一些数值,包括32位整数和Unicode字符串。

下面的例子读了一个32位的整数:

ULONG uCardMode;
Config.Read(KNDIS_STRING_CONST(\"CardMode\"),&uCardMode);

这里的KNDIS_STRING_CONST宏是一个生成Unicode字符串的快速方式。

下面访问字符串

NDIS_STRING strCardName;
NDIS_STATUS err = Config.Read(KNDIS_STRING_CONST(\"CardName\"),&strCardName);
if(err) {
//说明“CardName”没找到!
}
else {
//strCardName.Buffer是一个指向空字符为结束的Unicode字符缓冲区的指针。
}

前面的例子中Read()需要一个指向NDIS_STRING的指针作为第二个参数,但是参数转换使你可以直接使用一个类KNdisString的对象代替之。返回的字符串由NDIS管理,绝不能被调用者修改或

者释放掉。当Config对象被释放的时候,这个字符串的空间会被挥手。一般这发生在MyAdapter::Initialize返回之后。

KNdisConfig还允许你查询一些随系统不同而变化的参数,比如:

ReadNetworkAddrss()――能读一个注册表中预定义的键值NetworkAddress,
IsNT()――能检查现在是运行在WindowsNT下还是Win9X下。
NdisVersion()――能检查NDIS的版本。

最后,KNdisConfig类允许你执行快速IO,有些微端口驱动利用这个功能。这个以后再说。

在见识到完整的驱动以前,尽是些零碎东西,下一课讲访问IO端口以及注册中断等等东西。

最新喜欢:

atmanatman
freducn2002
驱动小牛
驱动小牛
  • 注册日期2002-06-26
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望29点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2003-03-01 09:16
再次顶一下
w8zz
驱动小牛
驱动小牛
  • 注册日期2001-12-12
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望23点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2003-03-01 09:50
小熊和二申公豹 [img]http://www.driverdevelop.com/forum/upload/w8zz/2003-08-11_黑爸.jpg[/img] 二哥,三娃儿,快帮忙!
november
驱动牛犊
驱动牛犊
  • 注册日期2002-11-10
  • 最后登录2005-05-30
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-03-01 12:32
好东西

第一课呢?
我搜索了一下
怎么没看到?
edust
驱动中牛
驱动中牛
  • 注册日期2002-04-02
  • 最后登录2003-06-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-03-01 12:38
精华贴已收录,里面有地址
lzwf4
驱动小牛
驱动小牛
  • 注册日期2002-10-10
  • 最后登录2006-06-09
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-03-01 14:45
太好了!!!!!继续!!
kingkung
驱动牛犊
驱动牛犊
  • 注册日期2002-06-27
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2003-03-02 14:22
再次顶一下


shi,干什么啊你,以为这里是网络精灵啊。
说。。。是天下第一; 做。。。是无能为力。
游客

返回顶部