阅读:846回复:0
我的源程序求助(关于内存影射读写问题)
这是应用程序中使用的函数:
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中的。 谢谢谢谢 |
|
|