cloud_1013
驱动牛犊
驱动牛犊
  • 注册日期2003-11-04
  • 最后登录2004-01-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1657回复:9

在WDM中应用程序传给我的数据inputbuffer[10],我怎么得到?

楼主#
更多 发布于:2003-11-05 08:56
在WDM中应用程序传给我的数据inputbuffer[10],我怎么得到?是在DeveceControl()中吗?我怎样将数据传给应用程序?谢谢!
Lingfeng
驱动牛犊
驱动牛犊
  • 注册日期2002-11-30
  • 最后登录2008-07-20
  • 粉丝0
  • 关注0
  • 积分11分
  • 威望5点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-11-22 21:20
同意theseus和swf2003

theseus
驱动牛犊
驱动牛犊
  • 注册日期2003-03-30
  • 最后登录2003-11-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-11-13 09:43
在WDM中应用程序传给我的数据inputbuffer[10],我怎么得到?是在DeveceControl()中吗?我怎样将数据传给应用程序

如果调用CreateFile函数成功,应用程序就可以用DeviceIoControl函数与WDM进行通信了。用户模式的DeviceIoControl API函数原型如下:
BOOL  DeviceIoControl(Handle,
Code,
InputData,
InputLength,
OutputData,
OutputLength,
&Feedback,
&Overlapped);
Handle是一个已打开设备的句柄,在调用CreateFile函数时已获得。
InputData(PVOID)和InputLength(DWORD)参数描述了为驱动程序提供数据的缓冲区(以驱动程序的角度看,该区域为驱动程序提供输入数据)。OutputData(PVOID)和OutputLength(DWORD)参数描述了接受驱动程序输出数据的缓冲区。驱动程序会更新变量Feedback(DWORD)以指出它返回了多少字节的输出数据。
用户模式中对DeviceIoControl的调用将使I/O管理器创建一个带有IRP_MJ_DEVICE_CONTROL主功能码的IRP,并把该IRP发送到设备堆栈最上层驱动程序的派遣例程。驱动程序根据I/O控制命令来决定如何获得缓冲区地址(InputData)。I/O控制操作是用IOCTL中的功能码来为每个IOCTL指定寻址方式。有些IOCTL使用buffered方式,而有些IOCTL使用direct方式,还有些IOCTL使用neither方式。对buffered方式,系统分配一块缓冲区用于输入和输出,驱动程序通过KIrp::IoctlBuffer获得缓冲区地址,驱动程序的输出字节数赋给I.Information(),然后又I/O管理器将数据从驱动的系统缓冲区复制到应用程序的数据缓冲区。对direct方式,输出缓冲区由类KMemory对象映射,输出数据由Mdl映射到用户数据缓冲区。

------------------------------------------------------------ 痛并快乐
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地板#
发布于:2003-11-12 23:28
如果是 BUFFER IO就用Irp->AssociatedIrp.SystemBuffer
如果DIRECT IO用,Irp->MDLADDRESS
如果NIETHER,就用Irp->USERBUFFER
如果其他。。。。
我不知道,谁能说说??
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
gu_nj
驱动牛犊
驱动牛犊
  • 注册日期2003-06-18
  • 最后登录2004-09-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-11-12 21:45
writefile也可以完成吧?
呵呵,加油啊!一定能行!
hanbd2003
驱动牛犊
驱动牛犊
  • 注册日期2003-07-10
  • 最后登录2005-01-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-11-12 20:17
诸位大侠:
俺是一只刚接触这行的菜鸟,SWF大侠的语句我看明白了,好像是分别把不同的值赋给不同的参数,我的问题是:驱动程序中编写者所要做的工作就是这些设置相应的值,而不用具体去操纵数据的传输,比如说 把数据从硬件传到内存,驱动程序在其间起到的作用就是把传输的地址和要传输的数据长度告诉系统,而具体的数据传输有操作系统来完成,当然,在这里是系统核心。

塞外愚夫
xwh
xwh
驱动牛犊
驱动牛犊
  • 注册日期2002-02-11
  • 最后登录2004-01-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2003-11-12 09:20
同意楼上的说法
swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝1
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2003-11-05 12:46
LPBYTE ioBuffer =(LPBYTE)Irp->AssociatedIrp.SystemBuffer;
PIO_STACK_LOCATION irpStack=IoGetCurrentIrpStackLocation (Irp);

ULONG inBufLen=irpStack->Parameters.DeviceIoControl.InputBufferLength;
ULONG outBufLen= irpStack->Parameters.DeviceIoControl.OutputBufferLength;

这是 METHOD_BUFFERED 方式的通用处理
ioBuffer 是缓冲区地址。

处理结束后
Irp->IoStatus.Status  = 返回状态
Irp->IoStatus.Information = 有效数据的长度
你的认可是对我最大的鼓励!
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
8楼#
发布于:2003-11-05 09:08
看看MSDN的DeveceIoControl说明,有详细介绍的。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
9楼#
发布于:2003-11-05 09:08
看看MSDN的DeveceControl说明,有详细介绍的。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
游客

返回顶部