为什么没这两句不行?
就是入口处红色的那两句代码我觉得这两句应该是指向派遣函数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 = MyDispatch;
pDriverObject->MajorFunction = MyDispatch;
pDriverObject->MajorFunction = MyIOCTL;
CreateDevice(pDriverObject);
DbgPrint("Create Delete Success\n");
return STATUS_SUCCESS;
} 我以为在驱动通信中,下面的那个函数和那两行代码都没用
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 = MyDispatch;
pDriverObject->MajorFunction = MyDispatch; 因为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 = MyIOCTL;
当然上面这句应该在入口函数中. 明白的大牛进来解释一下 IRP_MJ_CREATE和IRP_MJ_CLOSE,从字面上理解,并不是通讯用的,只是在驱动对象创建与销毁时的"事件".
不一定要做什么特殊处理,但一定要响应.
应该是这意思吧.
同等正确的解释. 3q 回复 5# 马大哈
看来老马也进步了 老马的理解有点问题吧
IRP_MJ_CREATE和IRP_MJ_CLOSE的意思是在r3下有creat和close动作是,
驱动便会响应,但这与IOCTL通信好像根本没关系
这一点,TA应该能解释
但他又很长时间没来论坛了 364版主也知道吧?
说说原因
哈哈哈哈哈哈啊 回复马大哈
看来老马也进步了
364589886 发表于 2010-9-9 10:40 http://www.m5home.com/bbs/images/common/back.gif
.......我是猜的.
详细说说这几个"事件"吧,我感觉有点像子类化里响应消息一样. 回复 10# 马大哈
这两个函数是用来处理打开与关闭的IRP的,没有这两个函数,驱动就不知道如何处理这两个IRP,所以就无法打开这个设备,更谈不上关闭
而在ring3使用DeviceIoControl发命令时,其中一个参数就是要发往的设备对象的HANDLE,要有HANDLE,就得首先CreateFile,而CreateFile会在内核最终产生IRP_MJ_CREATE的IRP,因为你没有相应的处理函数,所以就永远失败了。之后的DeviceIoControl也就无法继续下去 谢谢啦,解释得不错
困扰我很久 马大哈 发表于 2010-9-7 14:06
IRP_MJ_CREATE和IRP_MJ_CLOSE,从字面上理解,并不是通讯用的,只是在驱动对象创建与销毁时的"事件".
不一定 ...
学习了!!!
页:
[1]