总版主
|
阅读:1912回复:6
DriverNetworks第二课
大部分从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端口以及注册中断等等东西。 |
最新喜欢:atman |
沙发#
发布于:2003-03-01 09:16
再次顶一下
|
|
板凳#
发布于:2003-03-01 09:50
提
|
|
|
地板#
发布于:2003-03-01 12:32
好东西
第一课呢? 我搜索了一下 怎么没看到? |
|
地下室#
发布于:2003-03-01 12:38
精华贴已收录,里面有地址
|
|
5楼#
发布于:2003-03-01 14:45
太好了!!!!!继续!!
|
|
6楼#
发布于:2003-03-02 14:22
再次顶一下 shi,干什么啊你,以为这里是网络精灵啊。 |
|
|