首页 文章

通过IOCTL将结构传递给内核模式驱动程序

提问于
浏览
0

我试图从Windows中的用户模式应用程序将几个不同的信息传递给内核模式驱动程序 . 我不会假装完全知道我在做什么,所以如果我有任何根本的误解,我将非常感谢你的澄清 .

用户模式应用程序(将IOCTL发送到驱动程序):

typedef struct {
    unsigned int write;
    ULONG reg_addr;
    ULONG reg_val;
} reg_parameters;

...

reg_parameters regvals;
regvals.write = 0;
regvals.reg_addr = 0xDEADBEEF;
regvals.reg_val = 0XBBBBBBBB;
ULONG value;

...

DeviceIoControl(driver,(ULONG)IOCTL_OMAPCONF_REG, &regvals, sizeof(regvals),
                     &value, sizeof(ULONG), &size, NULL);

内核模式驱动程序(在reg_addr中读取内存并在reg_val指定的位置存储值):

NTSTATUS OmapConfDrvDispatch(IN PDEVICE_OBJECT DeviceObject,
                    IN PIRP           Irp)
{
    PVOID               ioBuffer;

    ....

    ioBuffer  = Irp->AssociatedIrp.SystemBuffer;

    ....

现在,问题是:如何从驱动程序中的 ioBuffer 访问各个结构成员?

例如,为什么它不像 ioBuffer.reg_addr 那么简单?

思考?

1 回答

  • 3

    Irp->AssociatedIrp.SystemBuffer 转换为 reg_parameters 指针:

    reg_parameters* regvals = (reg_parameters*)Irp->AssociatedIrp.SystemBuffer;
    if (regvals->reg_addr == 0xDEADBEEF) {
       // mmmm - beef
    }
    

    这假定您在驱动程序代码中定义了 reg_parameters .

相关问题