caorr
驱动牛犊
驱动牛犊
  • 注册日期2005-03-24
  • 最后登录2007-10-24
  • 粉丝1
  • 关注1
  • 积分131分
  • 威望19点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
阅读:1522回复:7

【求助】PCI驱动运行时系统重启(不管回答对我有无帮助,都给分)

楼主#
更多 发布于:2005-05-10 23:19
我的PCI芯片是PCI2040,用DriverWorks编驱动,现在想读取PCI配置空间中的内容(即BAR0基址寄存器等寄存器中的内容),我的程序步骤是这样的:先在设备类PCI2040Device中定义一个KPciConfiguration的对象(KPciConfiguration  m_Config;),然后在构造函数中初始化m_Config。测试程序发出ioctl:PCI2040_IOCTL_ReadConfigSpace(方式是METHOD_IN_DIRECT)。驱动中为:
VOID PCI2040Device::Serial_PCI2040_IOCTL_ReadConfigSpace_Handler(KIrp I)
{
NTSTATUS status = STATUS_SUCCESS;

t << \"Entering PCI2040Device::Serial_PCI2040_IOCTL_ReadConfigSpace_Handler, \" << I << EOL;
KMemory Mem(I.Mdl());    
PULONG pOutBuffer = (PULONG) Mem.MapToSystemSpace();  //输出缓冲区指针,传出读取的数据

ULONG baseadd=(m_Config.ReadBaseAddress(0));
*pOutBuffer=baseadd;
I.Information() = sizeof(ULONG);  //字节数
I.Status() = status;

m_DriverManagedQueue.PnpNextIrp(I);
}
caorr
驱动牛犊
驱动牛犊
  • 注册日期2005-03-24
  • 最后登录2007-10-24
  • 粉丝1
  • 关注1
  • 积分131分
  • 威望19点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-05-10 23:30
还是再写清楚一点。
我的测试程序中相关语句是这样的:
void Test_PCI2040_IOCTL_ReadConfigSpace(void)
{
ULONG bufOutput[IOCTL_OUTBUF_SIZE]; // Output from device
ULONG nOutput; // Count written to bufOutput

printf(\"Issuing Ioctl to device -\\n \");
if (!DeviceIoControl(hDevice, PCI2040_IOCTL_ReadConfigSpace,
NULL, 0, bufOutput, IOCTL_OUTBUF_SIZE, &nOutput, NULL) )
{
printf(\"ERROR: DeviceIoControl returns %0x.\", GetLastError());
Exit(1);
}
else
{
printf(\"\\nThe BaseAddress0 Register is %x\",bufOutput[0]);
}
}

程序一运行,系统就重启,请问这是怎么回事?我在DriverWorks的help文档中看到:If the WDM library is used, the caller must be running at PASSIVE_LEVEL.会不会是这个原因?我是个新手,刚接触驱动没多久,若是这个原因,请懂得的dx帮忙解释一下吧。

最后,请问一下在DriverWorks中除了用KPciConfiguration类之外,还有没有其他的方法来读取PCI的配置空间呢?
小弟诚心求教,诚心给分。
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-05-10 23:49
既然你已经处理了该request,为什么不完成呢?
还有你在*pOutBuffer=baseadd;
中pOutBuffer是否为空呢?
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
caorr
驱动牛犊
驱动牛犊
  • 注册日期2005-03-24
  • 最后登录2007-10-24
  • 粉丝1
  • 关注1
  • 积分131分
  • 威望19点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-05-11 13:57
AllenZh能否说得详细一点啊,我是个新手,对有些概念还有点模棱两可。
我已经对那个Irp赋值了information和status,这样还不够吗?你说的完成该request我应该用什么函数呢?
至于pOutBuffer是刚开辟的一个输出缓冲区指针,应该不会是空的吧。
caorr
驱动牛犊
驱动牛犊
  • 注册日期2005-03-24
  • 最后登录2007-10-24
  • 粉丝1
  • 关注1
  • 积分131分
  • 威望19点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-05-11 19:02
问题已经解决了,原来只要把ReadBaseAddress()放在构造函数里执行就可以了,也许这就是所谓的那什么level吧,不过到底具体是怎么回事还是不知道:(
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-05-11 20:56
问题已经解决了,原来只要把ReadBaseAddress()放在构造函数里执行就可以了,也许这就是所谓的那什么level吧,不过到底具体是怎么回事还是不知道:(

Serial_PCI2040_IOCTL_ReadConfigSpace_Handler应该在DISPATCH level
你可以在AddDevice中或者Start Device中处理
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
caorr
驱动牛犊
驱动牛犊
  • 注册日期2005-03-24
  • 最后登录2007-10-24
  • 粉丝1
  • 关注1
  • 积分131分
  • 威望19点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-05-12 06:00
多谢AllenZh大虾的回答,我想给分的,可是不知道为什么总显示我没有登陆,也找不到“给分”这个按钮了,我重登陆了几次都没用,我另外还有一个帖子也是这样,不知道怎么回事。
我已经在建议投诉区问了,如果你知道怎么做的话,麻烦告诉一下。如果能够操作,我一定第一时间给分!!
rubbishren
驱动牛犊
驱动牛犊
  • 注册日期2005-03-17
  • 最后登录2006-06-19
  • 粉丝1
  • 关注1
  • 积分20分
  • 威望4点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-05-24 14:47
caorr你好,我现在也在做PCI2040+C6211的板子,正准备写驱动,能不能认识一下,有什么问题好一块交流。本人QQ:25151347
游客

返回顶部