coffeefish
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2007-10-31
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1156回复:6

菜鸟请教:驱动程序怎么将一个字符串返回给win32程序阿???

楼主#
更多 发布于:2003-07-05 17:41
各位高手:
  我刚刚接触驱动,我在这过程中遇到一个问题:
  我在win32程序中调用
  char* outbuffer = new char[100];;
  DWORD BytesReturned;
  DeviceIoControl( hWdm1, IOCTL_READ_IOPORT_UCHAR,
         NULL, 0, // Input outbuffer, 100, // Output &BytesReturned, NULL))
   希望驱动可以将某个字符串放入outbuffer中。
   驱动程序是这样写的:
   UCHAR basename[] = \"WMIEXTRA\";
   switch( ControlCode)
   {
      case IOCTL_READ_IOPORT_UCHAR:
DebugPrint(\"Receive read uchar requset!\");
         RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,basename,sizeof (basename));
break;
   。。。。。。。。。。。
   但是我在应用程序中显示outbuffer总是一串乱码,怎么回事啊,
   ebugPrint察看过了此时Irp->AssociatedIrp.SystemBuffer中的确是\"WMIEXTRA\";但是应用程序就是接收不到
谢谢各位了

最新喜欢:

lmhhlmhhlmhhlm...
swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-07-07 08:50
看看你的 IOCTL_READ_IOPORT_UCHAR 的定义
你的认可是对我最大的鼓励!
emt_lx
驱动牛犊
驱动牛犊
  • 注册日期2002-08-14
  • 最后登录2010-10-25
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-07-07 14:47
从程序中好象看不出什么不对的地方,怀疑是其他地方干扰的返回值。
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-07-07 14:54
Irp->IoStatus.Information =  //你返回的字节数。
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
coffeefish
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2007-10-31
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-07-07 18:02
谢谢各位了
我知道原因了,就是tigerzd 说的那样。
但是我怎么知道Irp->AssociatedIrp.SystemBuffer中确切的字符个数,因为像IrpStack->Parameters.Write.Length得到的都是应用程序传过来的字符数,并不是实际传递字符串的字符数。

tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-07-07 18:34
建议你多看看书或DDK。
典型的应用是:
    irpStack = IoGetCurrentIrpStackLocation (Irp);

    Irp->IoStatus.Status = STATUS_SUCCESS;
    Irp->IoStatus.Information = 0;

    // get pointers and lengths of the caller\'s (user\'s) IO buffer
    ioBuffer           = Irp->AssociatedIrp.SystemBuffer;
    inputBufferLength  = irpStack->Parameters.DeviceIoControl.InputBufferLength;
    outputBufferLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength;

    ioControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
coffeefish
驱动牛犊
驱动牛犊
  • 注册日期2002-10-01
  • 最后登录2007-10-31
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-07-07 19:33
谢谢指点
我想你可能将我的疑似理解错了。

我意思是:
inputBufferLength只是DeviceIoControl( hWdm1, IOCTL_READ_IOPORT_UCHAR,
inbuffer, 100,  null, 0,  &BytesReturned, NULL)
传入的100这个值,可能我实际inbuffer中只有20个字符,那么我怎样直到inbuffer是20个字符呢?
靠inputBufferLength = irpStack->Parameters.DeviceIoControl.InputBufferLength判断是不行的
游客

返回顶部