| 
					阅读:1645回复:11
				 菜鸟求助:nt下的已知pci设备,我如何让驱动程序获得它的相关信息
					我在学写nt下的驱动,手头的资料只有一本书.该书没有给出具体查找某个设备的例子,只好向各位高手请教
 我的编程对象是一块pci卡,vendor和devie id 我都有了.我在我的驱动程序中,该如何找到它呢?可以直接确定该设备吗?不行的话,还是要扫描registry数据?如果要扫描,在扫描时,我如何判断得到的设备是我的设备 | |
| 沙发#发布于:2002-06-12 04:05 
					用driverwizard
 | |
| 
 | 
| 板凳#发布于:2002-06-10 11:54 
					当然是给点分了, :D :D :D
 //Get bus assigned resource and report to system status = HalAssignSlotResources( puisRegistryPath, NULL, //DriverClassName, optional, NULL for type \'Other\' pDriverObject, //System transfered in driver obj pointer pDevObj, //DeviceObject, optional pDevice->BusType, pDevice->ulBusNumber, pDevice->ulSlotNumber, &pResourcesLst); //This API function find bus gave resource and store here if( !NT_SUCCESS( status )) { IoDeleteSymbolicLink(&linkName); IoDeleteDevice( pDevObj ); return status; } //Retrieve resource for(i=0; (ULONG)i< pResourcesLst->Count; i++) { pFullResource = &pResourcesLst->List; if( pFullResource->InterfaceType == pDevice->BusType && pFullResource->BusNumber == pDevice->ulBusNumber) { for(j=0; (ULONG)j < pFullResource->PartialResourceList.Count; j++) { pPartResource = &pFullResource->PartialResourceList.PartialDescriptors[j]; switch( pPartResource->Type) { case CmResourceTypePort: //I/O address. This devcie use //BASE2 (Last one) for I/O register pDevice->BaseAddress = pPartResource->u.Port.Start; pDevice->IoPortCount = pPartResource->u.Port.Length; break; case CmResourceTypeInterrupt: //Interrupt line pDevice->IntChan = pPartResource->u.Interrupt.Level; break; case CmResourceTypeDma: //DMA channel pDevice->DmaChan = pPartResource->u.Dma.Channel; break; default: break; } //switch( pPartResource->Type) }//for(j=0; (ULONG)j }//if( pFullResource->InterfaceType == BusType }//for(i=0; (ULONG)i< pResourcesLst | |
| 
 | 
| 地板#发布于:2002-06-10 11:53 
					有的话当然太好了,我找相关的源程序找的好苦呀...
 我要如何报答您呢? | |
| 地下室#发布于:2002-06-10 11:45 
					我这有怎么样得到中断等资源的代码
 要不要? | |
| 
 | 
| 5楼#发布于:2002-06-10 11:42 
					我太急着会贴子了,zydcat兄谢谢了,我会仔细看的 :) :) :)				 | |
| 6楼#发布于:2002-06-10 11:39 
					晕了... :o :o :o该怎么办???那我直接轮巡的读cf8cfc来匹配行不行?如果这样匹配上的话,中断呀什么的资源分配又要怎么进行 :( :( :(				 | |
| 7楼#发布于:2002-06-10 11:30 
					art baker的书是以isa做例子的。
 pci的稍有不同: 看看这个函数的用法,对你有帮助。 lRet = HalGetBusDataByOffset( BusDataType, ulBusNumber, ulSlotNumber, &l, FIELD_OFFSET(PCI_COMMON_CONFIG, VendorID ), sizeof(l)); //Check return value if ( lRet == 0 ) //No specified bus return -1; else if ( l == (((ULONG )PCI_DEVICE_ID << 16) | PCI_VENDOR_ID) ) //Device found return 1; else //Device not in this slot return 0; | |
| 
 | 
| 8楼#发布于:2002-06-10 11:21 
					arthurt
 nt下怎么使用vendor ID和deviceID 不要误导观众呀 :D :D :D | |
| 
 | 
| 9楼#发布于:2002-06-10 11:06 
					楼上的谢谢了.我用的参考书就是art baker的这一本,现在正在反复的看第7章.不过我找不到有关查找具体设备的例子呀...
 谢谢各位帮忙. | |
| 10楼#发布于:2002-06-10 08:58 
					NT用VxD?!
 楼上的真会开玩笑啊。 :cool: 到Registry去找硬件。vendor ID和deviceID都有了,还认不出设备吗? 详细的,看Art Baker的《The Windows NT Device Driver Book: A Guide for programmers》,就是《。。。设计指南》那本书了。 | |
| 11楼#发布于:2002-06-10 08:39 
					如果是wdm的程序,通过inf文件让系统给硬件加载驱动。把vid和did写入inf的相应位置,编译后安装。只要指定你的inf,系统会自己安装好的。
 如果是vxd,我就不懂了。 | |
| 
 | 
 
							
 
				 
				 
				