cocoli
驱动牛犊
驱动牛犊
  • 注册日期2001-05-15
  • 最后登录2003-01-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1156回复:7

各位大侠救命

楼主#
更多 发布于:2003-01-15 10:57
我的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;
}

tjm
tjm
驱动小牛
驱动小牛
  • 注册日期2002-05-18
  • 最后登录2004-10-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-01-15 12:21
你的安装过程有问题吧?
或者你应该响应PNP MN QUERY DEVICE ID之类的消息,向系统提供正确的DEVICE ID
cocoli
驱动牛犊
驱动牛犊
  • 注册日期2001-05-15
  • 最后登录2003-01-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-01-15 13:06
安装驱动提示没有找到此类设备,但是下一步就可以装上
cocoli
驱动牛犊
驱动牛犊
  • 注册日期2001-05-15
  • 最后登录2003-01-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-01-15 13:45
请问怎么向系统提供ID?能详细点吗?
cocoli
驱动牛犊
驱动牛犊
  • 注册日期2001-05-15
  • 最后登录2003-01-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-01-15 13:46
请问怎么向系统提供ID?能详细点吗?我在 DS下
tjm
tjm
驱动小牛
驱动小牛
  • 注册日期2002-05-18
  • 最后登录2004-10-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
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一致吧?
实在想不出还有什么可能了。
yyhabc
驱动小牛
驱动小牛
  • 注册日期2003-01-06
  • 最后登录2013-03-18
  • 粉丝0
  • 关注0
  • 积分327分
  • 威望47点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-01-15 21:54
应该是代码的问题,PNP ID不对驱动是对应不上的。PNP ID是驱动和设备对应的必要条件。这种问题调试应该很简单,你用一个好点的调试器式一式。
cocoli
驱动牛犊
驱动牛犊
  • 注册日期2001-05-15
  • 最后登录2003-01-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-01-16 13:31
发现地址映射不对,搞不懂为什么?有些机器没这问题啊!!!!
游客

返回顶部