如何发送和接收从内核模式驱动程序到用户模式的二进制数据
问题描述:
我正在开发内核模式过滤器驱动程序,我想这个驱动程序发送一个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->从上面的代码文件名(Unicode字符串)用户模式下的可执行文件。 假设,该可执行文件将只在控制台上打印该字符串。 下面是在用户模式下
.......
.......
int main()
{
cout<< getUnicodeStringFromKernel(); // Just supposition
return 0;
}
答
我的exe文件的代码有几种不同的方式,你可以“访问”内核模式驱动程序。在这种情况下最明显的是使用ioctl接口。
不幸的是,我不能为你提供一个例子,因为要实现这一目标需要我我的虚拟机上安装Windows DDK,与实际编写的代码,它一边。
有,然而,文章here这也解释了在过滤器驱动程序的ioctl是如何工作的。
从您的应用程序,你需要使用DeviceIoControl
。
Thanks Mats ..以及如何将数据从内核模式驱动程序发送回用户模式applicationaction ..? – 2013-04-04 13:26:15
IOCTL调用是同步的,所以传递到被填充的缓冲器,并且所述IOCTL处理代码填充所述缓冲液[提防溢出!],然后返回,在该点的数据是在用户应用[经由可用'lpOutBuffer'中的一些将内核模式数据复制到用户模式的神奇函数]。您可能会觉得这很有用: http://www.codeproject.com/Articles/9575/Driver-Development-Part-2-Introduction-to-Implemen – 2013-04-04 13:36:41