|
就是入口处红色的那两句代码
我觉得这两句应该是指向派遣函数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;
} |
|