能力值:
( LV4,RANK:50 )
2 楼
pBuff = (PUCHAR)Irp->AssociatedIrp.SystemBuffer ;
//返回1989
ulTemp = 1989;
memmove(&pBuff[0], &ulTemp, 4);
Irp->IoStatus.Information = 4;
能力值:
( 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 是什么类型的?
能力值:
( LV2,RANK:10 )
4 楼
根据命名法则 unsigned long
能力值:
( LV3,RANK:20 )
5 楼
可能是RtlCopyMemory(OutputBuffer,InputBuffer,OutputBufferLength);这一句的问题吧,不要忘了InputBuffer和OutputBuffer是指向同一地址的.
能力值:
( 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啊?我没设置,让他默认
能力值:
( 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
能力值:
( LV2,RANK:10 )
8 楼
其实,你可以根据Windows的命名,来猜得到它用的用途;
Irp->AssociatedIrp.SystemBuffer systembuffer, 这是系统提供的缓冲区,不是你用户程序的那份;
IrpStack->Parameters.DeviceIoControl.Type3InputBuffer 这个输入缓冲区,是第三种类形的;
Irp->UserBuffer 这是 User 的Buffer, 就是用户程序向驱动程序提供的缓冲区,驱动程序可向此写入数据
能力值:
( LV2,RANK:10 )
9 楼
各位大哥,SystemBuffer 是双缓冲的....
能力值:
( LV2,RANK:10 )
10 楼
O,不好意思,我明白了,CTL_CODE哈哈哈哈哈哈