DeviceIoControl函数对应的四种数据交换方式

时间:2023-01-28 20:59:05

交换方式                                输入缓冲区                                         输出缓冲区

METHOD_BUFFERED            KIrp::IoctlBuffer                                  KIrp::IoctlBuffer

METHOD_IN_DIRECT            KIrp::IoctlBuffer                                   KIrp::Mdl

METHOD_OUT_DIRECT       KIrp::IoctlBuffer                                   KIrp::Mdl

METHOD_NEITHER              KIrp::IoctlType3IputBuffer                    KIrp::UserBuffer

ReadFile的处理主要是输出数据。用户提供输出缓冲及其长度。你写入数据,并说明你写入的长度。在IrpStack->Parameters.Read.Length中得到输出缓冲长度。数据写入Irp->AssociatedIrp.SystemBuffer中。实际输出数据长度请写到Irp->IoStatus.Information中即可。

WriteFile的处理与ReadFile类似。不用的是Irp->AssociatedIrp.SystemBuffer成了输入缓冲,而长度在IrpStack->Parameters.Write.Length中。

DeviceIoControl的情况稍微复杂,一般先要得到一个功能码,用户程序一般要输入数据(在输入缓冲中),同时要获得输出(请你写入输出缓冲中),并指明了这些缓冲区的长度。你还必须指明你输出数据的真实长度。

功能码在IrpStack->Parameters.DeviceIoControl.IoControlCode;
     缓冲模式,输入缓冲长度为IrpStack->Parameters.DeviceIoControl.InputBufferLength;
     缓冲模式,输出缓冲长度为IrpStack->Parameters.DeviceIoControl.OutputBufferLength;
     共用缓冲区为Irp->AssociatedIrp.SystemBuffer;
     实际输出数据长度请写到Irp->IoStatus.Information中。