kornecor
驱动牛犊
驱动牛犊
  • 注册日期2003-08-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1215回复:2

DS写的驱动问题:t显示不了,读写硬件不正常是什么回事? (附代码)

楼主#
更多 发布于:2004-02-09 11:41
软件平台是: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,也是显示没写进任何东西,当如读不出来了。这究竟是怎么回事?请问我错在哪里?
附件名称/大小 下载次数 最后更新
2004-02-09_pci9054问题及源代码.rar (662KB)  4
fishrimper
驱动牛犊
驱动牛犊
  • 注册日期2003-10-08
  • 最后登录2006-09-25
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-02-10 13:49
1)
改成
t << "Offset=" <<(ULONG)Offset <<"\n";
试试
2)
没有看到你的驱动程序
kornecor
驱动牛犊
驱动牛犊
  • 注册日期2003-08-25
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-02-10 17:36
1)还是不行哦,没显示出来。好奇怪。
2)附件里有驱动和应用程序的代码。请帮忙看看。谢谢!
kornecor@163.net
QQ:16884178
附件名称/大小 下载次数 最后更新
2004-02-10_pci9054问题及源代码.rar (662KB)  0
游客

返回顶部