如何将数据从内核模式驱动程序发送和接收到用户模式下的二进制文件

How to send and receive data from a kernel mode driver to a binary in user mode

本文关键字:模式 用户 二进制文件 数据 内核 驱动程序      更新时间:2023-10-16

我正在开发一个内核模式过滤器驱动程序,我希望这个驱动程序发送一个UNICODE字符串到在用户模式下运行的exe。请为此提供一个示例,因为我是驱动程序开发的初学者。

下面是我的驱动程序的代码(从我想发送UNICODE字符串)

#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 (UNICODE String)到用户模式下的可执行文件。假设,该可执行文件将只在控制台上打印此字符串。下面是我在用户模式下的exe代码

.......
.......
int main()
{
    cout<< getUnicodeStringFromKernel();   // Just supposition
    return 0;
}

有几种不同的方法可以"访问"内核模式驱动程序。在这种情况下,最明显的方法是使用ioctl接口。

不幸的是,我不能给你提供一个例子,因为要做到这一点,我需要在我的虚拟机上安装Windows DDK,并为它实际编写代码。

然而,这里有一篇文章解释了过滤器驱动程序中的ioctl是如何工作的。

在应用程序中,您需要使用DeviceIoControl