阅读:1617回复:11
菜鸟求助:nt下的已知pci设备,我如何让驱动程序获得它的相关信息
我在学写nt下的驱动,手头的资料只有一本书.该书没有给出具体查找某个设备的例子,只好向各位高手请教
我的编程对象是一块pci卡,vendor和devie id 我都有了.我在我的驱动程序中,该如何找到它呢?可以直接确定该设备吗?不行的话,还是要扫描registry数据?如果要扫描,在扫描时,我如何判断得到的设备是我的设备 |
|
沙发#
发布于:2002-06-10 08:39
如果是wdm的程序,通过inf文件让系统给硬件加载驱动。把vid和did写入inf的相应位置,编译后安装。只要指定你的inf,系统会自己安装好的。
如果是vxd,我就不懂了。 |
|
|
板凳#
发布于:2002-06-10 08:58
NT用VxD?!
楼上的真会开玩笑啊。 :cool: 到Registry去找硬件。vendor ID和deviceID都有了,还认不出设备吗? 详细的,看Art Baker的《The Windows NT Device Driver Book: A Guide for programmers》,就是《。。。设计指南》那本书了。 |
|
地板#
发布于:2002-06-10 11:06
楼上的谢谢了.我用的参考书就是art baker的这一本,现在正在反复的看第7章.不过我找不到有关查找具体设备的例子呀...
谢谢各位帮忙. |
|
地下室#
发布于:2002-06-10 11:21
arthurt
nt下怎么使用vendor ID和deviceID 不要误导观众呀 :D :D :D |
|
|
5楼#
发布于: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; |
|
|
6楼#
发布于:2002-06-10 11:39
晕了... :o :o :o该怎么办???那我直接轮巡的读cf8cfc来匹配行不行?如果这样匹配上的话,中断呀什么的资源分配又要怎么进行 :( :( :(
|
|
7楼#
发布于:2002-06-10 11:42
我太急着会贴子了,zydcat兄谢谢了,我会仔细看的 :) :) :)
|
|
8楼#
发布于:2002-06-10 11:45
我这有怎么样得到中断等资源的代码
要不要? |
|
|
9楼#
发布于:2002-06-10 11:53
有的话当然太好了,我找相关的源程序找的好苦呀...
我要如何报答您呢? |
|
10楼#
发布于: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 |
|
|
11楼#
发布于:2002-06-12 04:05
用driverwizard
|
|
|