2012-08-02 50 views
0

我试图从Windows中的用户模式应用程序将几个不同的信息传递给内核模式驱动程序。我不会假装完全知道我在做什么,所以如果我有任何根本性的误解,澄清将不胜感激。通过IOCTL将结构传递给内核模式驱动程序

用户模式应用程序(发送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_val指定在位置reg_addr和存储值存储器):

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

    .... 

    ioBuffer = Irp->AssociatedIrp.SystemBuffer; 

    .... 

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

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

想法?

回答

2

演员的Irp->AssociatedIrp.SystemBuffer作为reg_parameters指针:

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

这是假设你有你的驱动程序代码中定义的reg_parameters

+0

非常好,谢谢! – wanovak 2012-08-02 19:04:45

相关问题