首页
社区
课程
招聘
[求助]驱动与应用程序通信
发表于: 2009-12-22 21:49 4289

[求助]驱动与应用程序通信

2009-12-22 21:49
4289
驱动能收到传进的的值,但是程序却拿不到返回值,也就是outData什么东西都没有,为什么,请各位大牛帮帮小菜 !!!!!!!!!下面代码

驱动
NTSTATUS ICOL(IN PDEVICE_OBJECT pDevObj,IN PIRP Irp)
{
  NTSTATUS status = STATUS_SUCCESS;
  PIO_STACK_LOCATION  irpStack;
  PVOID InputBuffer;
  PVOID OutputBuffer;
  ULONG InputBufferLength;
  ULONG OutputBufferLength;

  Irp->IoStatus.Status = status;
  irpStack=IoGetCurrentIrpStackLocation(Irp);
  Irp->IoStatus.Information=0;
  InputBuffer= OutputBuffer = Irp->AssociatedIrp.SystemBuffer;
    InputBufferLength = irpStack->Parameters.DeviceIoControl.InputBufferLength;
    OutputBufferLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength;

  switch (irpStack->Parameters.DeviceIoControl.IoControlCode)
  {
    case IOCTL_TS_PRONAME:
      DbgPrint((PCHAR)InputBuffer);
      RtlCopyMemory(OutputBuffer,InputBuffer,OutputBufferLength);
      Irp->IoStatus.Information=OutputBufferLength;
      break;
    default:
      status = STATUS_INVALID_PARAMETER;
      break;
  }
  IoCompleteRequest(Irp, IO_NO_INCREMENT);
  return status;
}

程序
var
junk:DWORD;
inData:array[0..1023] of char;
outData:array[0..1023] of char;
begin
  inData:='kiss';
  DeviceIoControl(hDev,2050,@inData,Length(inData) ,@outData,Length(outData),junk,nil);
  ShowMessage(outData);
end;


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
pBuff = (PUCHAR)Irp->AssociatedIrp.SystemBuffer ;
                               
//返回1989
ulTemp = 1989;
memmove(&pBuff[0], &ulTemp, 4);
Irp->IoStatus.Information = 4;
2009-12-22 22:04
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
[QUOTE=exile;731440]pBuff = (PUCHAR)Irp->AssociatedIrp.SystemBuffer ;
                               
//返回1989
ulTemp = 1989;
memmove(&pBuff[0], &ulTemp, 4);
Irp->IoStatus.Information = 4;...[/QUOTE]

大哥,弱弱的问一句ulTemp 是什么类型的?
2009-12-22 22:29
0
雪    币: 211
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
根据命名法则 unsigned long
2009-12-23 10:33
0
雪    币: 100
活跃值: (30)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
可能是RtlCopyMemory(OutputBuffer,InputBuffer,OutputBufferLength);这一句的问题吧,不要忘了InputBuffer和OutputBuffer是指向同一地址的.
2009-12-23 12:22
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
但是
PCHAR pbuff="rain";
       
DbgPrint((PCHAR)Irp->AssociatedIrp.SystemBuffer);
RtlMoveMemory(Irp->AssociatedIrp.SystemBuffer,pbuff,4);
DbgPrint((PCHAR)Irp->AssociatedIrp.SystemBuffer);
Irp->IoStatus.Information = 4;

AssociatedIrp.SystemBuffer那块内存确实已经改了,我传进去是"kiss",两次打印为"kiss"然后是“rain”
但是delphi那边还是拿不到,是不是要设置device->Flags啊?我没设置,让他默认
2009-12-23 14:48
0
雪    币: 3
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
应用程序与驱动程序通信,对于方式,有几种方式,一是缓冲区,二是直接读写,三是其它方式;

对于缓冲区方式,系统的驱动设备组件(负责管理驱动啊,IRP啊等等这些东西)是把用户程序提供的缓冲区里的数据复制到内核,注意,是复制一份; 然后供驱动程序使用; 所以,如果你在驱动程序里对这“复制一份”的缓冲区里的数据进行修改,是修不了用户程序的那份的; 如 你提供 A,  驱动设备组件将复制成 A1, 你驱动程序面对的就是 A1;

InputBuffer= OutputBuffer = Irp->AssociatedIrp.SystemBuffer;
RtlCopyMemory(OutputBuffer,InputBuffer,OutputBufferLength);

这个,很明显就是缓冲区读写方式;

如果你要达到这个input output的目的,应该使用其它通信方式

DeviceIoControl(hDev,2050,@inData,Length(inData) ,@outData,Length(outData),junk,nil);

即:

#define XXXXXXX  CTL_CODE(FILE_DEVICE_UNKNOWN, 0xXXX, METHOD_NEITHER, FILE_ANY_ACCESS)

那么
indata 就是 IrpStack->Parameters.DeviceIoControl.Type3InputBuffer
outdata 就是 Irp->UserBuffer
2009-12-23 19:52
0
雪    币: 3
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
其实,你可以根据Windows的命名,来猜得到它用的用途;

Irp->AssociatedIrp.SystemBuffer      systembuffer, 这是系统提供的缓冲区,不是你用户程序的那份;

IrpStack->Parameters.DeviceIoControl.Type3InputBuffer     这个输入缓冲区,是第三种类形的;

Irp->UserBuffer    这是 User 的Buffer, 就是用户程序向驱动程序提供的缓冲区,驱动程序可向此写入数据
2009-12-23 19:55
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
各位大哥,SystemBuffer 是双缓冲的....
2009-12-23 20:01
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
O,不好意思,我明白了,CTL_CODE哈哈哈哈哈哈
2009-12-23 20:03
0
游客
登录 | 注册 方可回帖
返回
//