阅读:3389回复:9
pci驱动源码(给分)
读取pci配置空间的源码,一运行就重启,各位大侠帮帮忙啊,项目来不及了:(小弟第一次作驱动,郁闷中
VOID Mytry2Device::Serial_MYTRY2_IOCTL_800_read_Handler(KIrp I) { NTSTATUS status = STATUS_SUCCESS; KMemory Mem(I.Mdl()); KPciConfiguration PciConfig(m_Lower.TopOfStack()); PULONG pOutBuffer = (PULONG) Mem.MapToSystemSpace(); //输出缓冲区指针,传出读取的数据 PULONG pInBuffer = (PULONG) I.IoctlBuffer(); //输入缓冲区指针 ULONG Offset; //读取的偏移地址 Offset = *pInBuffer; ULONG count; //读取的数据个数 count = *(pInBuffer+1); PciConfig.ReadHeader(pOutBuffer,0,count); t << \"readheader :: \" << *pOutBuffer << EOL; t << \"readheader :: \" << *(pOutBuffer+2) << EOL; I.Information() = count; I.Status() = status; PnpNextIrp(I); } |
|
沙发#
发布于:2005-05-27 17:10
应用程序中
void Test_MYTRY2_IOCTL_800_read(void) { ULONG bufOutput[IOCTL_OUTBUF_SIZE]; // 传出读取的数据缓冲区 ULONG nOutput; // 实际读取的数据个数 ULONG bufInput[2]; // 传入读取的参数 ULONG offset; // 要读取的偏移地址 printf(\"\\n----------- ready for reading from Base0 -----------\"); //获取读取的偏移地址: printf(\"\\nPlease input the offset of read operation(Hex):\"); scanf(\"%x\",&offset); // //获取读取的数据个数: // printf(\"\\nPlease input the number of data to read(Dec):\"); // scanf(\"%d\",&number); bufInput[0]=offset; bufInput[1]=IOCTL_OUTBUF_SIZE; // Call device IO Control interface (PCI9054_IOCTL_804_ReadBase3) in driver if (!DeviceIoControl(hDevice, MYTRY2_IOCTL_800_read, bufInput, 2*4, // 字节 bufOutput, 128*4,//sizeof(bufOutput), &nOutput, NULL) ) { printf(\"\\nERROR: DeviceIoControl returns %0x.\", GetLastError()); Exit(1); } printf(\"\\n------>>>>>> data read <<<<<<------\"); for(ULONG i=0;i<nOutput;i++) { printf(\"\\nread data[%d]=%x\",i,bufOutput); } printf(\"\\n\\n\"); } |
|
板凳#
发布于:2005-05-27 17:26
应用程序中 的
bufInput[0]=offset; offset需要值否 |
|
|
地板#
发布于:2005-05-27 20:51
offset是scanf的啊?
|
|
地下室#
发布于:2005-05-28 15:18
死机100%是这个造成的。
“MYTRY2_IOCTL_800_read” 这句话有问题,PciConfig.ReadHeader(pOutBuffer,0,count); |
|
5楼#
发布于:2005-05-28 22:09
你的ioctl code定义的是METHOD_BUFFERED还是DIRECT_IO?
PULONG pOutBuffer = (PULONG) Mem.MapToSystemSpace(); //输出缓冲区指针,传出读取的数据 这句看好象你是用的DIRECT_IO 而PULONG pInBuffer = (PULONG) I.IoctlBuffer(); //输入缓冲区指针 这句又好象是METHOD_BUFFERED 如果你是METHOD_BUFFERED,那么输出缓冲区也是由I.IoctlBuffer()指向的,不是I.Mdl(),相反,如果是DIRECT_IO,那输入输出全是由I.mdl()指向的 |
|
6楼#
发布于:2005-05-30 15:56
你的ioctl code定义的是METHOD_BUFFERED还是DIRECT_IO? 大哥:我查了书上说DIRECT_IO,输出是由I.mdl()指向的.输入可是I.IoctlBuffer()指向的啊....... 我把maptosystemspace()改成virtualaddress()好像就行了,哪位给解释一下这个区别啊 |
|
7楼#
发布于:2012-11-27 16:49
你应该 给 blueHacker 分。
|
|
8楼#
发布于:2013-06-25 21:13
![]() ![]() |
|
9楼#
发布于:2013-07-30 16:54
用户被禁言,该主题自动屏蔽! |
|