阅读:2536回复:11
关于miniport中NdisReadConfiguration的问题
我在看NE2000的驱动。下面这段话我不知道怎么回事:
NDIS_STRING IOAddressStr = NDIS_STRING_CONST(\"IoBaseAddress\"); NDIS_STRING InterruptStr = NDIS_STRING_CONST(\"InterruptNumber\"); NDIS_STRING MaxMulticastListStr = NDIS_STRING_CONST(\"MaximumMulticastList\"); NDIS_STRING NetworkAddressStr = NDIS_STRING_CONST(\"NetworkAddress\"); NDIS_STRING BusTypeStr = NDIS_STRING_CONST(\"BusType\"); NDIS_STRING CardTypeStr = NDIS_STRING_CONST(\"CardType\"); 这个应该是为了 NdisReadConfiguration( &Status, &ReturnedValue, ConfigHandle, &BusTypeStr, NdisParameterHexInteger ); 中的那个keyword参数设计的吧。但系统怎么知道凭这个参数应该取什么值呢?是inf安装时对应的往注册表里写了么?我到现在还没见过比较简单的网卡inf文件,也没有专门支持2K的,所以都特别长,看得我头疼的很。哪位大侠能提供一个简单的网卡inf文件,或指点我一二?多谢了! |
|
最新喜欢:fsb |
沙发#
发布于:2002-01-30 11:00
我在看NE2000的驱动。下面这段话我不知道怎么回事: NdisReadConfiguration表示从注册表里读取参数,inf安装的时候写在注册表中的。操作系统自己控制把inf文件中的注册表键对应到某个地方(win2000/98不一样的),该键句柄ConfigHandle由系统从驱动程序入口点传入。 |
|
板凳#
发布于:2002-01-31 09:29
NdisReadConfiguration表示从注册表里读取参数,inf安装的时候写在注册表中的。操作系统自己控制把inf文件中的注册表键对应到某个地方(win2000/98不一样的),该键句柄ConfigHandle由系统从驱动程序入口点传入。 谢谢你的回答。这个过程我明白了。 但我还是不知道具体怎么做,比如: NDIS_STRING IOAddressStr = NDIS_STRING_CONST(\"IoBaseAddress\"); 我相应的就应该在inf中写一句HKR,,IoBaseAddress,1,**,**,**,** 是么?但系统是怎么知道把基地址资源放在这个键里,以便让我从configutaion里读取?因为这个键是我自定义的阿。 实在对不起,刚看NDIS miniport驱动,以前写过wdm接口的驱动,问的问题有些弱。而且我在MSDN中没找到答案,好像关于NDIS也没有什么书籍。 另外,在win2k中,HKR命令是把键放在了什么地方? |
|
地板#
发布于:2002-01-31 14:53
[quote]NdisReadConfiguration表示从注册表里读取参数,inf安装的时候写在注册表中的。操作系统自己控制把inf文件中的注册表键对应到某个地方(win2000/98不一样的),该键句柄ConfigHandle由系统从驱动程序入口点传入。 谢谢你的回答。这个过程我明白了。 但我还是不知道具体怎么做,比如: NDIS_STRING IOAddressStr = NDIS_STRING_CONST(\"IoBaseAddress\"); 我相应的就应该在inf中写一句HKR,,IoBaseAddress,1,**,**,**,** 是么?但系统是怎么知道把基地址资源放在这个键里,以便让我从configutaion里读取?因为这个键是我自定义的阿。 实在对不起,刚看NDIS miniport驱动,以前写过wdm接口的驱动,问的问题有些弱。而且我在MSDN中没找到答案,好像关于NDIS也没有什么书籍。 另外,在win2k中,HKR命令是把键放在了什么地方? [/quote] HKR就是表示“那个键”,至于这个键究竟在哪里,是操作系统决定的,比如在win2000下我的网卡位置是HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\0005,在其他操作系统当然又不一样。其他的网络驱动的位置也是不同的。 |
|
地下室#
发布于:2002-01-31 16:33
[quote]谢谢你的回答。这个过程我明白了。 HKR就是表示“那个键”,至于这个键究竟在哪里,是操作系统决定的,比如在win2000下我的网卡位置是HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\0005,在其他操作系统当然又不一样。其他的网络驱动的位置也是不同的。 [/quote] 多谢,我已经把分给你了。但你似乎没看到我问的一个我最关心的问题,麻烦你再看一下: 做一个硬件驱动,我最关心的是如何得到资源,只要资源到手了,其他都好解决。我现在刚接触ndis miniport driver,还没弄明白它得到资源的机制,这是我现在最想知道的。 对于我的驱动,我关心的就是如何得到我在pci配置空间中要求的两块内存的基地址,和我要求中断的中断号。对于wdm接口,这些都在resourcelist里列举得到即可。而ndis是什么机制我不知道。我这两天看MSDN,感觉资源应该和注册表有关,但资源是系统给的,我不能理解的是怎么会需要自己在inf中给出键值?我现在要实现最基本的网卡功能,能进行DMA即可。那么我是不是根本不用注册那些键值?但若如此我怎么得到资源? 我觉得我需要的资源就是内存的基地址和中断号,还有就是网络地址,别的好像什么都不需要,只要符合规范,让它长的像一块网卡,并能得到上层的IP包即可。 谢谢了,我真的很需要知道这个。或者你告诉我MSDN什么地方提到了,我看MSDN在初始化部分只提到了使用NdisReadConfiguration,那到底是什么机制呢? |
|
5楼#
发布于:2002-01-31 17:00
[quote][quote]谢谢你的回答。这个过程我明白了。 HKR就是表示“那个键”,至于这个键究竟在哪里,是操作系统决定的,比如在win2000下我的网卡位置是HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\0005,在其他操作系统当然又不一样。其他的网络驱动的位置也是不同的。 [/quote] 多谢,我已经把分给你了。但你似乎没看到我问的一个我最关心的问题,麻烦你再看一下: 做一个硬件驱动,我最关心的是如何得到资源,只要资源到手了,其他都好解决。我现在刚接触ndis miniport driver,还没弄明白它得到资源的机制,这是我现在最想知道的。 对于我的驱动,我关心的就是如何得到我在pci配置空间中要求的两块内存的基地址,和我要求中断的中断号。对于wdm接口,这些都在resourcelist里列举得到即可。而ndis是什么机制我不知道。我这两天看MSDN,感觉资源应该和注册表有关,但资源是系统给的,我不能理解的是怎么会需要自己在inf中给出键值?我现在要实现最基本的网卡功能,能进行DMA即可。那么我是不是根本不用注册那些键值?但若如此我怎么得到资源? 我觉得我需要的资源就是内存的基地址和中断号,还有就是网络地址,别的好像什么都不需要,只要符合规范,让它长的像一块网卡,并能得到上层的IP包即可。 谢谢了,我真的很需要知道这个。或者你告诉我MSDN什么地方提到了,我看MSDN在初始化部分只提到了使用NdisReadConfiguration,那到底是什么机制呢? [/quote] 哦,你看的那个驱动程序想必不是pci或者其他支持pnp的网卡的。 如果驱动程序需要在初始化的时候从注册表中读端口号和中断号, 那么这一定是一块isa卡,或者你看的是for nt的driver source, 因为nt不支持pnp。 刚才说的是硬件资源的分配,还记得在nt下安装一块isa卡的时候, 需要在控制面板上指定中断号和端口范围吗?因为nt自己不能自动 分配,isa卡也不支持,所以需要安装者指定。指定之后就相当于 修改了注册表,然后重启动,driver初始化的时候就从reg中读 这些值。 网卡驱动程序除了硬件资源之外,还有一些其他标准设置,例如 工作在100还是10M,还是auto,以及网卡工作时的mac地址, 通过ndis提供的函数不过是方便了这种访问,而且让它比较规范, 但是你自己完全可以不按照规范来,你把这些信息放在一个文件 里,在driverentry中读文件,不也可以得到这些信息吗?但是 这样不是麻烦吗?你的inf文件还得提供一个dll,以便去读文件。 |
|
|
6楼#
发布于:2002-01-31 17:22
哦,你看的那个驱动程序想必不是pci或者其他支持pnp的网卡的。 看来我还是没有清楚表述我的情况,主要是我开始以为没必要表述。 我做了一块pci卡,用WDM编写,支持pnp,在win2K下用,支持DMA.现在已经完成了。但我现在需要改做他用--将操作系统向下传递的IP包处理后全部从我的卡里以DMA方式连续发出(没IP包时,我用空包填充)。那么我就必须将它的驱动该为网卡驱动,从而可以截获IP包。由于WDM接口和NDIS接口区别较大,所以我准备以DDK的Ne2000源码为蓝本完全重写一个驱动。(它虽然是ISA的,但写的很清晰,所以我没有采用eb100x的源码)现在遇到的问题是它没有配套的inf,所以引出我这个话题中的第一篇文章。后来我感觉即使我可以通过inf注册键,也没有得到我想要的资源。所以我才问了怎样才能得到资源。 像ip地址我可以理解是需要注册键的,因为用户需要改,而且是自己设这个键,自己改。但系统分配的内存的基地址到底如何得到?因为这样就要我设键,系统来改,然后我读取。但系统怎么知道我设的键的名字是什么?怎么知道要往哪个键里存信息? 对不起,我的分已经给了,又问了你这么多问题。等你回答完,我再开一个题目,你进来说句话,然后我再给你分吧。谢谢了。 |
|
7楼#
发布于:2002-01-31 17:27
欧,对不起,是斑竹大人回的文章,我还以为是Fang兄呢,呵呵。 |
|
8楼#
发布于:2002-02-02 10:04
在WDM驱动、中,你可以用resourceList
在ndis中同样可以用resourceList,ndisMpciassignresource |
|
9楼#
发布于:2002-02-02 11:47
[quote]哦,你看的那个驱动程序想必不是pci或者其他支持pnp的网卡的。 看来我还是没有清楚表述我的情况,主要是我开始以为没必要表述。 我做了一块pci卡,用WDM编写,支持pnp,在win2K下用,支持DMA.现在已经完成了。但我现在需要改做他用--将操作系统向下传递的IP包处理后全部从我的卡里以DMA方式连续发出(没IP包时,我用空包填充)。那么我就必须将它的驱动该为网卡驱动,从而可以截获IP包。由于WDM接口和NDIS接口区别较大,所以我准备以DDK的Ne2000源码为蓝本完全重写一个驱动。(它虽然是ISA的,但写的很清晰,所以我没有采用eb100x的源码)现在遇到的问题是它没有配套的inf,所以引出我这个话题中的第一篇文章。后来我感觉即使我可以通过inf注册键,也没有得到我想要的资源。所以我才问了怎样才能得到资源。 像ip地址我可以理解是需要注册键的,因为用户需要改,而且是自己设这个键,自己改。但系统分配的内存的基地址到底如何得到?因为这样就要我设键,系统来改,然后我读取。但系统怎么知道我设的键的名字是什么?怎么知道要往哪个键里存信息? 对不起,我的分已经给了,又问了你这么多问题。等你回答完,我再开一个题目,你进来说句话,然后我再给你分吧。谢谢了。 [/quote] ip地址和网卡有什么关系,和tcp.sys才有关系。 系统分配的内存基地址?你不是pci设备吗?你自己可以 通过任何方法读pci配置空间。和wdm没有任何区别。 ndis封装了一些函数,实际上我记得readconfigurtion 也是过时函数,现在好像换成另外一个函数了。用 ndis的封装函数的好处是平台兼容性,我想你一开始 不必过于拘泥于此。 既然是pci卡,你就按照pci网卡驱动程序去写不就行了? |
|
|
10楼#
发布于:2002-02-02 13:51
我是可以读到pci配置空间,但该空间只是提供了向系统请求内存块的大小吧?而真正能用的基地址需要等到系统分配了内存后才能从系统资源中得到吧?我原来就是通过Resoureslist得到的各种资源。包括内存基地址。 你的话让我明白了一个问题:以前我没接触ndis,以为网卡必须用ndis,而ndis又必须用带ndis头的函数,现在看来这些对于一个设备能否运行都是无所谓的。也就是说wdm接口和ndis接口本质上是一样的,是么?但截获ip包还必须得ndis吧? 对阿,我就是想按照pci网卡驱动去写,但由于例子中的资源是从注册表读的,所以引发了我问inf怎么写的问题。现在看来资源没必要非采用这种方式,我还是按老办法---从Resourcelist中读取即可。但键值又是干什么的?存那些非资源但又确实需要的信息? 这也是我在这问了这么久的原因,因为我必须要把如何得到资源的问题搞清楚,比如有几种得到资源的方法?每种方法是不是都是通用的,任选一种即可?等等。我倒现在仍然没有一个清醒的认识。实在是麻烦各位了。 |
|
11楼#
发布于:2002-02-02 16:11
[quote] 我是可以读到pci配置空间,但该空间只是提供了向系统请求内存块的大小吧?而真正能用的基地址需要等到系统分配了内存后才能从系统资源中得到吧?我原来就是通过Resoureslist得到的各种资源。包括内存基地址。 你的话让我明白了一个问题:以前我没接触ndis,以为网卡必须用ndis,而ndis又必须用带ndis头的函数,现在看来这些对于一个设备能否运行都是无所谓的。也就是说wdm接口和ndis接口本质上是一样的,是么?但截获ip包还必须得ndis吧? 对阿,我就是想按照pci网卡驱动去写,但由于例子中的资源是从注册表读的,所以引发了我问inf怎么写的问题。现在看来资源没必要非采用这种方式,我还是按老办法---从Resourcelist中读取即可。但键值又是干什么的?存那些非资源但又确实需要的信息? 这也是我在这问了这么久的原因,因为我必须要把如何得到资源的问题搞清楚,比如有几种得到资源的方法?每种方法是不是都是通用的,任选一种即可?等等。我倒现在仍然没有一个清醒的认识。实在是麻烦各位了。 [/quote] 截获ip包当然必须用ndis。 你以前没有写过pci driver吗?以前怎么获得的资源现在怎么获得 不就行了。那些键值你觉得有用就用,否则一个都不需要。 |
|
|