阅读:1157回复:7
各位大侠救命
我的PCI驱动程序第一次安装成功后可以正常使用,但是一旦卸载重新安装以后重起机器再也不能正常使用了,必须重新安装一次才能正常访问硬件,关机重起以后要使用的话还要重装驱动。而这种情况并不是在所有的机器上出现,只是在win2000的某种机型上出现。
我的驱动程序使用内存映射把PCI基址映射到用户空间,请问这是什么原因,我的头都要肿了 以下是我的关键源码部分,请看看有什么问题: NTSTATUS SYS2KDevice::OnStartDevice(KIrp I) { NTSTATUS status = STATUS_SUCCESS; I.Information() = 0; // The default Pnp policy has already cleared the IRP with the lower device // Initialize the physical device object. // Get the list of raw resources from the IRP PCM_RESOURCE_LIST pResListRaw = I.AllocatedResources(); // Get the list of translated resources from the IRP PCM_RESOURCE_LIST pResListTranslated = I.TranslatedResources(); // Create an instance of KPciConfiguration so we can map Base Address // Register indicies to ordinals for memory or I/O port ranges. KPciConfiguration PciConfig(m_Lower.TopOfStack()); Length= pResListTranslated->List[0].PartialResourceList.PartialDescriptors[0].u.Memory.Length; //long high=pResListRaw->List[0].PartialResourceList.PartialDescriptors[0].u.Memory.Start.u.HighPart; //Address=(ULONGLONG) MmMapIoSpace(pResListTranslated->List[0].PartialResourceList.PartialDescriptors[0].u.Memory.Start, //Length, //MmCached); Address=(ULONGLONG) pResListTranslated->List[0].PartialResourceList.PartialDescriptors[0].u.Memory.Start.u.LowPart; return status; } NTSTATUS SYS2KDevice::Create(KIrp I) { NTSTATUS status; t << \"Entering SYS2KDevice::Create, \" << I << EOL; DeviceRegion = new (NonPagedPool) KMemoryToProcessMap( Address, Length, (HANDLE)-1, // current process TRUE, NULL, ViewShare ); status = I.PnpComplete(this, STATUS_SUCCESS, IO_NO_INCREMENT); return status; } |
|
沙发#
发布于:2003-01-15 12:21
你的安装过程有问题吧?
或者你应该响应PNP MN QUERY DEVICE ID之类的消息,向系统提供正确的DEVICE ID |
|
板凳#
发布于:2003-01-15 13:06
安装驱动提示没有找到此类设备,但是下一步就可以装上
|
|
地板#
发布于:2003-01-15 13:45
请问怎么向系统提供ID?能详细点吗?
|
|
地下室#
发布于:2003-01-15 13:46
请问怎么向系统提供ID?能详细点吗?我在 DS下
|
|
5楼#
发布于:2003-01-15 21:24
设备ID一般对最地层的驱动是必须的。
到DDK中查IRP_MN_QUERY_ID 手动安装是强制性的,不论如何只要INF正确,都会安装上去,当然初试化也的正确。 但重起时,则要靠PNP管理器来枚局,根据DDK的表述,当然是根据ID寻找对应的驱动。不过要是IRP_MN_QUERY_ID的问题,驱动会先加载再卸载,你应该能看到相关的调试信息。 另外你的INF是否正确牙?DRIVER是否拷到了相关的目录下。 另外对比一下注册表,主要是SERVICE和SYSTEM\\ENUM\\PCI中的对应项,与别的驱动比较一下有什么差别。 PCI不熟啊,是不是还和硬件有关?硬件应该有ID吧?应该与INF提供的ID一致吧? 实在想不出还有什么可能了。 |
|
6楼#
发布于:2003-01-15 21:54
应该是代码的问题,PNP ID不对驱动是对应不上的。PNP ID是驱动和设备对应的必要条件。这种问题调试应该很简单,你用一个好点的调试器式一式。
|
|
7楼#
发布于:2003-01-16 13:31
发现地址映射不对,搞不懂为什么?有些机器没这问题啊!!!!
|
|