我正在开发一个内核模式筛选器驱动程序,我想这个驱动程序发送一个UNICODEstring到用户模式下运行的EXE。 请为此提供一个例子,因为我是驾驶员开发的初学者。
下面是我的驱动程序的代码( 从我要发送UNICODEstring )
#include "drv_common.h" #include "ntddk.h" #include "FsFilter.h" #define SOME_SIZE // PassThrough IRP Handler NTSTATUS FsFilterDispatchPassThrough( __in PDEVICE_OBJECT DeviceObject, __in PIRP Irp ) { PFSFILTER_DEVICE_EXTENSION pDevExt = (PFSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension; IoSkipCurrentIrpStackLocation(Irp); return IoCallDriver(pDevExt->AttachedToDeviceObject, Irp); } ///////////////////////// struct file info //////////////////////////////////// struct { OBJECT_NAME_INFORMATION NameInfo; WCHAR Buffer[64]; // 64 chars must be enough for everybody :) } InfoBuffer; /////////////////////////////////////////////////////////////////////////////////////////////////// // IRP_MJ_CREATE IRP Handler NTSTATUS FsFilterDispatchCreate( __in PDEVICE_OBJECT DeviceObject, __in PIRP Irp ) { PFILE_OBJECT pFileObject = IoGetCurrentIrpStackLocation(Irp)->FileObject; PUNICODE_STRING **temp**; RtlInitUnicodeString( temp, L"\\vs\\vs\\Setup\\eula.txt" ); LONG flag = RtlCompareUnicodeString( temp, &pFileObject->FileName, TRUE ); if ( flag == 0 ) { DbgPrint("File is opened.\n" ); return STATUS_UNSUCCESSFUL; } return FsFilterDispatchPassThrough(DeviceObject, Irp); }
我想从上面的代码发送&pFileObject-> FileName (UNICODEstring)到用户模式下的可执行文件。 假设那个可执行文件只是在控制台上打印这个string。 以下是我在用户模式下的exe代码
....... ....... int main() { cout<< getUnicodeStringFromKernel(); // Just supposition return 0; }
有几种不同的方法可以“访问”内核模式驱动程序。 在这种情况下最明显的是使用ioctl接口。
不幸的是,我无法为您提供一个示例,因为要实现这一点,需要我在我的虚拟机上安装Windows DDK,并且实际编写代码。
然而, 这里有一篇文章解释了过滤器驱动器中的ioctls是如何工作的。
从你的应用程序,你需要使用DeviceIoControl
。