zhouandraw
驱动牛犊
驱动牛犊
  • 注册日期2004-03-19
  • 最后登录2005-10-21
  • 粉丝0
  • 关注0
  • 积分6分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:827回复:0

我的源程序求助(关于内存影射读写问题)

楼主#
更多 发布于:2004-07-07 23:09
这是应用程序中使用的函数:

int Test_GPIBPCI_IOCTL_READ(DWORD offset)
{
ULONG nOutput;
DWORD   addr;
int     data;
addr=offset*4;
if (DeviceIoControl(hDevice,GPIBPCI_IOCTL_READ,&addr, sizeof(addr),&data,512,&nOutput,NULL))
{
printf("successful reading!n");
printf("the data of reading is %xn",data);
}
else
printf("ERROR: DeviceIoControl returns %0x.", GetLastError());
return data;
}

这是驱动中GPIBPCI_IOCTL_READ例程:

NTSTATUS GpibpciDevice::GPIBPCI_IOCTL_READ_Handler(KIrp I)
{
NTSTATUS status = STATUS_SUCCESS;
I.Information() = 0;

int realaddr;
DWORD realdata;
ULONG fwLength=0;

realaddr=*(ULONG*)I.IoctlBuffer(); // 拷贝从应用程序得到的偏移地址到驱动程序地址暂存
    
realdata=m_MemoryRange0.ind(realaddr);
    
fwLength=sizeof(realdata)+1;

if (I.IoctlOutputBufferSize() >= fwLength) // 如果读入缓冲够长
{
*(ULONG*)I.IoctlBuffer() = realdata; // 将信息拷给应用程序读入缓冲
I.Information() = fwLength; // 返回信息长度
}
else {
I.Information() = 0; // 否则信息长度为0
         t << "buff size too small" << EOL;
}

return status;
}

使用5030PCI控制芯片,通过它来读写我的板子上的另外一个芯片的16个寄存器。

调试运行的结果是:内存XXX不能读
我用softice跟踪,发现读的地址根本就不是我想读的内存影射地址:BAR0+offset,何解?

另外还想请教:用WINDRIVER生成驱动框架的时候,只有BAR0内存影射范围0xBD000000~0xBD00FFFF,现在我用DS生成也就添加了m_MemoryRange0一个内存空间,范围同上。我的固件程序中有memout(0x0c,data),即向offset为0x0c的地址写一个数。我的疑问是:5030的配置空间是不是要单独影射一个内存空间,比如说BAR0,然后固件程序需要的影射内存空间实际上是添加一个BAR1中的。

谢谢谢谢
扒皮周
游客

返回顶部