Windows内核--通用IRP派遣函数的编写

 1 void IrpTest(PDRIVER_OBJECT DriverObject)
 2 {
 3     DriverObject->MajorFunction[IRP_MJ_CREATE] = HelloDDKDispatchRoutin;
 4     DriverObject->MajorFunction[IRP_MJ_CLOSE] = HelloDDKDispatchRoutin;
 5     DriverObject->MajorFunction[IRP_MJ_WRITE] = HelloDDKDispatchRoutin;
 6     DriverObject->MajorFunction[IRP_MJ_READ] = HelloDDKDispatchRoutin;
 7     DriverObject->MajorFunction[IRP_MJ_CLEANUP] = HelloDDKDispatchRoutin;
 8     DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = HelloDDKDispatchRoutin;
 9     DriverObject->MajorFunction[IRP_MJ_SET_INFORMATION] = HelloDDKDispatchRoutin;
10     DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = HelloDDKDispatchRoutin;
11     DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = HelloDDKDispatchRoutin;
12 }
13 NTSTATUS HelloDDKDispatchRoutin(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)
14 {
15     KdPrint(("Enter HelloDDKDispatchRoutin\n"));
16     
17     PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(pIrp);
18     static char* irpname[] =
19     {
20         "IRP_MJ_CREATE",
21         "IRP_MJ_CREATE_NAMED_PIPE",
22         "IRP_MJ_READ",
23         "IRP_MJ_WRITE",
24         "IRP_MJ_QUERY_INFORMATION",
25         "IRP_MJ_SET_INFORMATION",
26         "IRP_MJ_QUERY_EA",
27         "IRP_MJ_SET_EA",
28         "IRP_MJ_FLUSH_BUFFER",
29         "IRP_MJ_QUERY_VOLUME_INFORMATION",
30         "IRP_MJ_SET_VOLUME_INFORMATION",
31         "IRP_MJ_DIRECTORY_CONTROL",
32         "IRP_MJ_FILE_SYSTEM_CONTROL",
33         "IRP_MJ_DEVICE_CONTROL",
34         "IRP_MJ_INTERNAL_DEVICE_CONTROL",
35         "IRP_MJ_SHUTDOWN",
36         "IRP_MJ_LOCK_CONTROL",
37         "IRP_MJ_CLEARUP",
38         "IRP_MJ_CREATE_MAILSLOT",
39         "IRP_MJ_QUERY_SECURITY",
40         "IRP_MJ_SET_SECURITY",
41         "IRP_MJ_POWER",
42         "IRP_MJ_SYSTEM_CONTROL",
43         "IRP_MJ_DEVICE_CHANGE",
44         "IRP_MJ_QUOTA",
45         "IRP_MJ_PNP"
46     };
47     UCHAR type = stack->MajorFunction;
48 
49     if (type >= 26)
50     {
51         KdPrint(("Unknown IRP,major type %X\n", type));
52     }
53     else
54     {
55         KdPrint(("\t%s\n", irpname[type]));
56     }
57 
58     //这里处理自己想处理的
59 
60 
61     //结束IRP
62     NTSTATUS status = STATUS_SUCCESS;
63     pIrp->IoStatus.Status = status;//设置状态
64     pIrp->IoStatus.Information = 0;//操作字节
65     IoCompleteRequest(pIrp, IO_NO_INCREMENT);
66     KdPrint(("Leave HelloDDKDispatchRoutine\n"));
67     return status;
68 }

 

Windows内核--通用IRP派遣函数的编写

上一篇:windows Server 2016 远程桌面多用户登录


下一篇:微信公共服务平台开发(.Net 的实现)12-------网页授权(上 :更加深入理解OAuth2.0 )