阅读:1767回复:3
ds写的驱动问题:t显示不了,读写硬件不正常是什么回事?
软件平台是:Driverworks 2.7,windows XP+sp1, winXP DDK, VC++6.0,Platform SDK(xp版)。硬件平台是:xp 1700+,kingston 256M*2, Epox 8RDA+(nforce2), 金钻9 80G。
我参考驱动驱动开发网上的“9054简单IO口读写”的例子和武安河的书《Windows 2000/XP WDM设备驱动程序开发》,用Driverworks编了个基本框架,全部编译成功,系统能正常认出pci9054,并正确的分配了资源。但是当编写具体功能时,遇到以下问题: 问题一:Driverworks里的跟踪变量KTrace t ("PCI9054")不能正常使用。 Driverworks自动生成的KTrace t跟踪语句可正常在Driverworks自带的工具monitor里显示,但是我自己添加的却没有显示,如PCI9054Device.cpp里的以下代码: VOID PCI9054Device::Serial_PCI9054_IOCTL_804_ReadBase2_Handler(KIrp I) { NTSTATUS status = STATUS_SUCCESS; t << "Entering PCI9054Device::Serial_PCI9054_IOCTL_804_ReadBase2_Handler, " << I << EOL; //此句是自动生成的,可在monitor里正常显示 KMemory Mem(I.Mdl()); PLONG pOutBuffer = (PLONG) Mem.MapToSystemSpace(); //输出缓冲区指针,传出读取的数据PUSHORT pInBuffer = (PLONG) I.IoctlBuffer(); //输入缓冲区,传来应用程序的一些参数,以便通过应用程序指定读取的位置和数据个数 ULONG Offset; //从应用程序中获取传来的读取的偏移地址 Offset = *pInBuffer; ULONG count; //从应用程序中获取传来的读取的数据个数 count = *(pInBuffer+1); m_MemoryRange1_ForBase2.inw(Offset,pOutBuffer,count); t << "Offset=" <<(ULONG)Offset <<EOL; t << "pOutBuffer=" <<(ULONG)pOutBuffer <<EOL; t << "count=" <<(ULONG)count<<EOL; //这3句是我自己添加的,都没有在monitor里显示出来; I.Information() = count*sizeof(LONG); //字节数 I.Status() = status; m_DriverManagedQueue.PnpNextIrp(I); } 请问应该怎么用KTrace t才能显示自己需要的信息? 问题二:DeviceIoControl函数的存放驱动程序实际返回数据字节数的值为0。 根据武安河书书上的介绍,DeviceIoControl函数定义为: BOOL DeviceIoControl( HANDLE hDevice, //CreateFile函数返回的设备句柄 DWORD dwIoControlCode, //应用程序调用驱动程序的控制命令 LPVOID lpInBuffer, //应用程序传递给驱动程序的数据缓冲区地址 DWORD nInBufferSize, //应用程序传递给驱动程序的数据字节数 LPVOID lpOutBuffer, //存放驱动程序返回数据的缓冲区地址 DWORD nOutBufferSize, //存放驱动程序返回数据的缓冲区地址字节数 LPDWORD lpBytesReturned, //存放驱动程序实际返回数据字节数的变量地址 LPOVERLAPPED lpOverlapped, //一个指向OVERLAPPED结构的变量地址,同步时置为NULL ) 我在应用程序中读内存,也即读BAR2。想写进一组数据,然后读出来,检验是否正确。其读函数为: #define IOCTL_INBUF_SIZE 128 #define IOCTL_OUTBUF_SIZE 128 void Test_PCI9054_IOCTL_804_ReadBase2(void) { ULONG bufOutput[IOCTL_OUTBUF_SIZE]; // 传出读取的数据缓冲区 ULONG nOutput; // 实际读取的数据个数 ULONG bufInput[2]; // 传入读取的参数 ULONG offset; // 要读取的偏移地址 printf("\n----------- ready for reading from Base2 -----------"); //获取读取的偏移地址: printf("\nPlease input the offset of read operation(Hex):"); scanf("%x",&offset); bufInput[0]=offset; bufInput[1]=IOCTL_OUTBUF_SIZE; // Call device IO Control interface (PCI9054_IOCTL_804_ReadBase3) in driver if (!DeviceIoControl(hDevice, PCI9054_IOCTL_804_ReadBase2, bufInput, 2*4, // 字节 bufOutput, IOCTL_OUTBUF_SIZE*4,//sizeof(bufOutput), &nOutput, NULL) ) { printf("\nERROR: DeviceIoControl returns %0x.", GetLastError()); Exit(1); } printf("\n nOutput is: %x",nOutput); printf("\n------>>>>>> data read <<<<<<------"); for(ULONG i=0;i< nOutput;i++) { printf("\nread data[%d]=%x",i,bufOutput); } printf("\n\n"); } 结果:nOutput为0,即什么也读不出来。其写内存的函数如下: void Test_PCI9054_IOCTL_805_WriteBase2(void) { ULONG nOutput; // Count written to bufOutput // 传给驱动程序要写入的参数和数据 // 数组的第一个元素为写入的偏移地址,第二个元素为数据的个数,其它元素为写入的数据 ULONG bufInput[IOCTL_INBUF_SIZE+2]; ULONG bufOutput[IOCTL_INBUF_SIZE+2]; ULONG offset; // 写入的偏移地址 ULONG num; // 写入的初始数据,以此来产生一个数组 printf("\n----------- ready for writing to Base3 -----------"); //获取写入的偏移地址 printf("\nPlease input the offset of the write operation(Hex):"); scanf("%x",&offset); bufInput[0]=offset; bufInput[1]=IOCTL_INBUF_SIZE; //获取写入的数据 printf("\nPlease input the initial data to write(Hex):"); scanf("%x",&num); for(ULONG j=0;j<IOCTL_INBUF_SIZE;j++) { bufInput[2+j]=num; num+=1; } //显示生成的数组 for(ULONG i=0;i<IOCTL_INBUF_SIZE+2;i++) { printf("\nwrite data[%d]=%x",i,bufInput); } // Call device IO Control interface in driver if (!DeviceIoControl(hDevice, PCI9054_IOCTL_805_WriteBase2, bufInput, (IOCTL_INBUF_SIZE+2)*4,//sizeof(bufInput), NULL,//bufOutput, 0,//sizeof(bufOutput), &nOutput, NULL) ) { printf("\nERROR: DeviceIoControl returns %0x.", GetLastError()); Exit(1); } printf("\n nOutput is: %x",nOutput); printf("\n---------- data have been written to Base2 ----------"); for(ULONG j=0;j<nOutput;j++) { printf("\nwritten data[%d]=%x",j,bufOutput[j]); } printf("\n\n"); } 同样nOutput值也为0。调用ReadFile或WriteFile函数的nOutput值也为0。我用软件windriver检查9054的各个BAR,也是显示没写进任何东西,当如读不出来了。这究竟是怎么回事?请问我错在哪里? [编辑 - 2/9/04 by kornecor] |
|
|
沙发#
发布于:2004-02-09 17:16
用户被禁言,该主题自动屏蔽! |
|
板凳#
发布于:2004-02-10 10:36
啊,我的附件里有清楚的表述,请帮忙看看。简单说来,问题是:
问题一:Driverworks里的跟踪变量KTrace t ("PCI9054")不能正常使用,我自己写的譬如t<<"count="<<count就在ds monitor里显示不出来。 问题二:DeviceIoControl函数的存放驱动程序实际返回数据字节数的值为0。而且用readfile,writefile函数也没报错,但根本读写不了硬件。用plx monitor一看,根本没变化。 附件里是我的问题具体表述和源代码,请各位抽空帮忙看看,感激不尽! 联系方式:kornecor@163.net QQ:16884178 |
|
地板#
发布于:2004-02-14 03:25
try this one to make things easy:
http://www.driverdevelop.com/forum/viewthread.php?tid=59831 |
|