找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
楼主: ok100fen

为什么没这两句不行?

 火.. [复制链接]

90

主题

473

回帖

2

精华

钻石会员

积分
3261
发表于 2010-9-7 13:38:27 | 显示全部楼层 |阅读模式
就是入口处红色的那两句代码
我觉得这两句应该是指向派遣函数MyDispatch
这与通信没什么关系
因为在MyIOCTL这个派遣函数就已经够了,为什么还要用 MyDispatch呢?
我注销掉这两句,就实现不了通信
不知道原因在哪里~
希望高人解释一下
谢谢

#include "ntddk.h"
#define IOCTL_TEST1 CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS)
VOID Unload(IN PDRIVER_OBJECT pDriverObject)
{
        UNICODE_STRING symLinkName;
        RtlInitUnicodeString(&symLinkName,L"\\DosDevices\\MyDDKDevice");
        IoDeleteSymbolicLink(&symLinkName);
        IoDeleteDevice(pDriverObject->DeviceObject);
        DbgPrint("Device Delete Success\n");
}
NTSTATUS MyDispatch(IN PDEVICE_OBJECT device,IN PIRP irp)
{
        PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(irp);
        irp->IoStatus.Status = STATUS_SUCCESS;
        irp->IoStatus.Information = 0;
        if (stack->MajorFunction==IRP_MJ_CREATE)
        {
                DbgPrint("IRP_MJ_CREATE111\n");
        }
        if (stack->MajorFunction==IRP_MJ_CLOSE)
        {
                DbgPrint(("IRP_MJ_CLOSE222\n"));
        }
        IoCompleteRequest( irp, IO_NO_INCREMENT );
        return STATUS_SUCCESS;
}
NTSTATUS CreateDevice (IN PDRIVER_OBJECT pDriverObject)
{
        NTSTATUS status;
        PDEVICE_OBJECT pDevObj;
        UNICODE_STRING devName;
        UNICODE_STRING symLinkName;
        RtlInitUnicodeString(&devName,L"\\Device\\MyDDKDevice");
        RtlInitUnicodeString(&symLinkName,L"\\DosDevices\\MyDDKDevice");
        status = IoCreateDevice( pDriverObject,0,&devName,FILE_DEVICE_UNKNOWN,0, TRUE,&pDevObj );
        if (!NT_SUCCESS(status))
        {
                return status;
        }
        pDevObj->Flags |= DO_BUFFERED_IO;
        status = IoCreateSymbolicLink( &symLinkName,&devName );
        if (!NT_SUCCESS(status))
        {
                IoDeleteDevice( pDevObj );
                return status;
        }
        return STATUS_SUCCESS;
}
NTSTATUS MyIOCTL(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp)
{
        NTSTATUS status = STATUS_SUCCESS;
        PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);
        ULONG cbin = stack->;Parameters.DeviceIoControl.InputBufferLength;
        ULONG code = stack->;Parameters.DeviceIoControl.IoControlCode;
        switch (code)
        {     
                case IOCTL_TEST1:
                {
                        DbgPrint(("IOCTL_TEST1\n"));
                        DbgPrint("输入缓冲数据内容:%u 输入缓冲数据长度:%u",*(PULONG)pIrp->AssociatedIrp.SystemBuffer,cbin);
                        break;
                }
                default:
                {
                        status = STATUS_INVALID_VARIANT;
                }
        }
        pIrp->IoStatus.Status = status;
        pIrp->IoStatus.Information = 0;
        IoCompleteRequest( pIrp, IO_NO_INCREMENT );
        return status;
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,IN PUNICODE_STRING theRegistryPath)
{
        pDriverObject->DriverUnload = Unload;
        pDriverObject->MajorFunction[IRP_MJ_CREATE] = MyDispatch;
        pDriverObject->MajorFunction[IRP_MJ_CLOSE] = MyDispatch;
        pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = MyIOCTL;
        CreateDevice(pDriverObject);
        DbgPrint("Create Delete Success\n");
        return STATUS_SUCCESS;
}

90

主题

473

回帖

2

精华

钻石会员

积分
3261
 楼主| 发表于 2010-9-7 13:46:49 | 显示全部楼层
我以为在驱动通信中,下面的那个函数和那两行代码都没用



NTSTATUS MyDispatch(IN PDEVICE_OBJECT device,IN PIRP irp)
{
        PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(irp);
        irp->IoStatus.Status = STATUS_SUCCESS;
        irp->IoStatus.Information = 0;
        if (stack->MajorFunction==IRP_MJ_CREATE)
        {
                DbgPrint("IRP_MJ_CREATE111\n");
        }
        if (stack->MajorFunction==IRP_MJ_CLOSE)
        {
                DbgPrint(("IRP_MJ_CLOSE222\n"));
        }
        IoCompleteRequest( irp, IO_NO_INCREMENT );
        return STATUS_SUCCESS;
}



pDriverObject->MajorFunction[IRP_MJ_CREATE] = MyDispatch;
pDriverObject->MajorFunction[IRP_MJ_CLOSE] = MyDispatch;

90

主题

473

回帖

2

精华

钻石会员

积分
3261
 楼主| 发表于 2010-9-7 13:49:28 | 显示全部楼层
因为r0和r3之间的通信,用MyIOCTL就足够了
但是为什么还不行?


NTSTATUS MyIOCTL(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp)
{
        NTSTATUS status = STATUS_SUCCESS;
        PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);
        ULONG cbin = stack->Parameters.DeviceIoControl.InputBufferLength;
        ULONG code = stack->Parameters.DeviceIoControl.IoControlCode;
        switch (code)
        {     
                case IOCTL_TEST1:
                {
                        DbgPrint(("IOCTL_TEST1\n"));
                        DbgPrint("输入缓冲数据内容:%u 输入缓冲数据长度:%u",*(PULONG)pIrp->AssociatedIrp.SystemBuffer,cbin);
                        break;
                }
                default:
                {
                        status = STATUS_INVALID_VARIANT;
                }
        }
        pIrp->IoStatus.Status = status;
        pIrp->IoStatus.Information = 0;
        IoCompleteRequest( pIrp, IO_NO_INCREMENT );
        return status;
}



pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = MyIOCTL;
当然上面这句应该在入口函数中.

90

主题

473

回帖

2

精华

钻石会员

积分
3261
 楼主| 发表于 2010-9-7 13:52:02 | 显示全部楼层
明白的大牛进来解释一下

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2010-9-7 14:06:12 | 显示全部楼层
IRP_MJ_CREATE和IRP_MJ_CLOSE,从字面上理解,并不是通讯用的,只是在驱动对象创建与销毁时的"事件".

不一定要做什么特殊处理,但一定要响应.

应该是这意思吧.

同等正确的解释.
我就是嗷嗷叫的老马了......

90

主题

473

回帖

2

精华

钻石会员

积分
3261
 楼主| 发表于 2010-9-8 08:19:09 | 显示全部楼层
3q

23

主题

117

回帖

1

精华

银牌会员

积分
400
发表于 2010-9-9 10:40:14 | 显示全部楼层
回复 5# 马大哈


    看来老马也进步了

90

主题

473

回帖

2

精华

钻石会员

积分
3261
 楼主| 发表于 2010-9-9 13:12:50 | 显示全部楼层
老马的理解有点问题吧
IRP_MJ_CREATE和IRP_MJ_CLOSE的意思是在r3下有creat和close动作是,
驱动便会响应,但这与IOCTL通信好像根本没关系
这一点,TA应该能解释
但他又很长时间没来论坛了

90

主题

473

回帖

2

精华

钻石会员

积分
3261
 楼主| 发表于 2010-9-9 13:13:55 | 显示全部楼层
364版主也知道吧?
说说原因

哈哈哈哈哈哈啊

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2010-9-10 11:14:44 | 显示全部楼层
回复  马大哈


    看来老马也进步了
364589886 发表于 2010-9-9 10:40



    .......我是猜的.

详细说说这几个"事件"吧,我感觉有点像子类化里响应消息一样.

23

主题

117

回帖

1

精华

银牌会员

积分
400
发表于 2010-9-10 12:09:52 | 显示全部楼层
回复 10# 马大哈


    这两个函数是用来处理打开与关闭的IRP的,没有这两个函数,驱动就不知道如何处理这两个IRP,所以就无法打开这个设备,更谈不上关闭
    而在ring3使用DeviceIoControl发命令时,其中一个参数就是要发往的设备对象的HANDLE,要有HANDLE,就得首先CreateFile,而CreateFile会在内核最终产生IRP_MJ_CREATE的IRP,因为你没有相应的处理函数,所以就永远失败了。之后的DeviceIoControl也就无法继续下去

评分

参与人数 2水晶币 +15 收起 理由
马大哈 + 10 学习!
ok100fen + 5 谢谢啦,解释得不错

查看全部评分

90

主题

473

回帖

2

精华

钻石会员

积分
3261
 楼主| 发表于 2010-9-10 13:58:43 | 显示全部楼层
谢谢啦,解释得不错

困扰我很久

0

主题

53

回帖

0

精华

铜牌会员

积分
73
发表于 2021-8-1 19:14:18 | 显示全部楼层
马大哈 发表于 2010-9-7 14:06
IRP_MJ_CREATE和IRP_MJ_CLOSE,从字面上理解,并不是通讯用的,只是在驱动对象创建与销毁时的"事件".

不一定 ...

学习了!!!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表