aKnightChen
驱动牛犊
驱动牛犊
  • 注册日期2003-05-13
  • 最后登录2005-04-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2627回复:13

如何在驱动程序里接收Irp->AssociatedIrp.SystemBuffer?(语法方面的问题).

楼主#
更多 发布于:2003-06-23 08:55
本人C语言水平极菜.
我在客户端将一个固定格式的字符串传到驱动程序(采用DeviceIOControl方法),
在驱动程序后台中函数
STATUS WDM1DeviceControl(IN PDEVICE_OBJECT fdo,IN PIRP Irp)中想对这个字符串进行拆分,
我的写法如下:
-----------------------------------------------
 case IOCTL_KNT_LPT_DRV_SET_ONE_DATA_PORT:
   char LPT_DATA_INFO[8];
   DebugPrint(\"正在往数组里写数据\");
   RtlCopyMemory(&LPT_DATA_INFO,Irp->AssociatedIrp.SystemBuffer,8);
   DebugPrint(\"数组:\"+LPT_DATA_INFO[0]
                     +LPT_DATA_INFO[1]
+LPT_DATA_INFO[2]
+LPT_DATA_INFO[3]
                     +LPT_DATA_INFO[4]
+LPT_DATA_INFO[5]
+LPT_DATA_INFO[6]
+LPT_DATA_INFO[7]);
   break;
-----------------------------------------------
但是在DebugPrint中无法正确显示这个数组.
想问一下该怎么写这段代码?(我用CHAR数组方法失败)
zhazha818617
驱动牛犊
驱动牛犊
  • 注册日期2002-12-11
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-06-23 09:10
兄弟debugPrint不是你这样用的
例子:
   DebugPrint(\"%x\", Temp);
和c语言中的sprintf(),相试,在debugPrint.h中有说明,自己看看吧
swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-06-23 09:39
你打印的如果是字符串的话直接
DbgPrint(\"%s\",LPT_DATA_INFO);当然你的串要有结束标志。
你的认可是对我最大的鼓励!
aKnightChen
驱动牛犊
驱动牛犊
  • 注册日期2003-05-13
  • 最后登录2005-04-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-06-23 09:50
那我采用
char LPT_DATA_INFO[8];
RtlCopyMemory(&LPT_DATA_INFO,Irp->AssociatedIrp.SystemBuffer,8);
这样是否能将SystemBuffer正确传给LPT_DATA_INFO?
(我试了一下不行,用“%S”打印出来只是一个\"?\"号)
----------------
我该怎么写才正确呢? :( :(
swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-06-23 13:36
首先,要确信你的 Irp->AssociatedIrp.SystemBuffer 中的值是字符串,其次确认串的结束符\'\\0\'是否有,RtlCopyMemory 不会给你拷贝一个结束符的。
%s %S %ws 分别是:单字符串小写、单串大写、双字节字符串小写。
你打印一个 ? 这有可能是出现不可显示的字符 。检查一下你SystemBuffer 中的内容。
你的认可是对我最大的鼓励!
aKnightChen
驱动牛犊
驱动牛犊
  • 注册日期2003-05-13
  • 最后登录2005-04-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-06-23 13:41
非常感谢你的耐心教导!!!获益非浅!
swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-06-23 17:32
你怎么没有放分 ?
你的认可是对我最大的鼓励!
xyyln
驱动老牛
驱动老牛
  • 注册日期2003-01-02
  • 最后登录2009-12-28
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望11点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-06-23 17:49
因为他的问题就没给分。。。 :D
[img]http://www.jt99.com/zjbbs/UploadFile/2003113018513643830.gif[/img]
aKnightChen
驱动牛犊
驱动牛犊
  • 注册日期2003-05-13
  • 最后登录2005-04-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2003-06-23 17:51
我错了... :( :( :(
aKnightChen
驱动牛犊
驱动牛犊
  • 注册日期2003-05-13
  • 最后登录2005-04-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-06-23 18:23
小弟不知道这里的规矩(我以为大家不在乎得分.)
特此道歉.以后我的问题都设分,回答上一定给.
----------------
我好像欠好几个人的分.不过幸好我当时发贴时多了个心眼,我都设为1分.
----------------
 :D :D
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
10楼#
发布于:2003-06-23 18:57
如果还没有给分的话,可以改分的。
aKnightChen
驱动牛犊
驱动牛犊
  • 注册日期2003-05-13
  • 最后登录2005-04-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2003-06-24 08:13
非常抱歉,我改分了,但是怎么也给不了,总是提示:此贴不是你的或已给分。(我可是刚刚登录的呀,并且我试了几次!)
 :( :( :(
aKnightChen
驱动牛犊
驱动牛犊
  • 注册日期2003-05-13
  • 最后登录2005-04-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-06-24 08:20
我的解决方法是这样了:(程序功能就是:做了25个按纽(模拟并口),当点击按纽时就将这个引角取反)
-----------------------
我的客户端是用DELPHI写的.(注意:有些东西是自定义的,如GENERIC_READ )
-----
procedure TFrmMain.SetOnePort(s:string);
var
  SetupDi: TSetupDI;
  PathName: array [0..127] of char;  //
aKnightChen
驱动牛犊
驱动牛犊
  • 注册日期2003-05-13
  • 最后登录2005-04-12
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-06-24 08:35
另外还有个问题想请教一下.
---------------------
控制口(从0位开始计算)的第5位的含义是:Enable Bidirectional Port.我试了一下它的功能就是将数据口置成一个中间电压(在约2V)
,此时计算机把它当作1,
下面就是问题:
我想这个引角可以做电脑和外设的通迅标志,(即,电脑在读数据时将它置成1,读完后就置0;而对外设来说,当它发现为0时就送数据,为1时就等待)
我可以在电脑程序里对这个引角读写,可是并口导线只有17根(好象没有这个引角的导线),那外设怎样才能读到这个引角呢??? :( :( :(
游客

返回顶部