本篇文章主要介绍了" 梦织未来Windows驱动编程 第03课 驱动的编程规范",主要涉及到方面的内容,对于Windows 7jrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播感兴趣的同学可以参考一下:
最近根据梦织未来论坛的驱动jrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播学习了一下Windows下的驱动编程,做个笔记备忘。这是第03课《驱动的编程规范》。驱动部分包括基本的驱动卸载函数、驱动打开关闭读...
最近根据梦织未来论坛的驱动jrs看球网直播吧_低调看直播体育app软件下载_低调看体育直播学习了一下Windows下的驱动编程,做个笔记备忘。这是第03课《驱动的编程规范》。
驱动部分包括基本的驱动卸载函数、驱动打开关闭读取写入操作最简单的分发例程。代码如下:


1//CreateDevice.c
2//2016.07.14 3 4 #include "ntddk.h" 5 6//驱动卸载函数Self 7VOID MyDriverUnload(PDRIVER_OBJECT pDriverObject)
8{
9 UNICODE_STRING usSymName;
10 RtlInitUnicodeString(&usSymName, L"\\??\\FirstDevice");
11 12//先删除符号链接,后删除设备对象 13if (pDriverObject->DeviceObject != NULL)
14 {
15 IoDeleteSymbolicLink(&usSymName); //删除符号链接 16 IoDeleteDevice(pDriverObject->DeviceObject); //删除设备对象 17 KdPrint(("Delete Device Sucess."));
18 }
19}
20 21//创建设备函数Self 22NTSTATUS CreateDevice(PDRIVER_OBJECT pDriverObject)
23{
24 NTSTATUS Status;
25 UNICODE_STRING usDevName;
26 UNICODE_STRING usSymName;
27 PDEVICE_OBJECT pDevObj; //设备对象,用于指向创建的设备
28 29//DDK API 为UNICODE_STRING赋值的函数 30 RtlInitUnicodeString(&usDevName, L"\\Device\\FirstDevice");
31 32//创建设备函数API 创建设备"\\Device\\FirstDevice"
33//设备创建后,会返回给pDevObj,同时给pDriverObject->DeviceObject赋值
34//The IoCreateDevice routine creates a device object for use by a driver. 35/* 36 NTSTATUS IoCreateDevice(
37 _In_ PDRIVER_OBJECT DriverObject,
38 _In_ ULONG DeviceExtensionSize,
39 _In_opt_ PUNICODE_STRING DeviceName,
40 _In_ DEVICE_TYPE DeviceType,
41 _In_ ULONG DeviceCharacteristics,
42 _In_ BOOLEAN Exclusive,
43 _Out_ PDEVICE_OBJECT *DeviceObject
44 );
45*/ 46 Status = IoCreateDevice(pDriverObject,
470,
48 &usDevName,
49 FILE_DEVICE_UNKNOWN,
50 FILE_DEVICE_SECURE_OPEN,
51 TRUE,
52 &pDevObj);
53if (!NT_SUCCESS(Status)) //检查返回值 54 {
55return Status;
56 }
57 58//DO_BUFFERED_IO or DO_DIRECT_IO
59//Specifies the type of buffering that is used by the I/O manager for I/O requests that are sent to the device stack.
60//Higher-level drivers OR this member with the same value as the next-lower driver in the stack, except possibly for highest-level drivers. 61 pDevObj->Flags |= DO_BUFFERED_IO;
62 63 RtlInitUnicodeString(&usSymName, L"\\??\\FirstDevice");
64 65//The IoCreateSymbolicLink routine sets up a symbolic link between a device object name and a user-visible name for the device. 66/* 67 NTSTATUS IoCreateSymbolicLink(
68 _In_ PUNICODE_STRING SymbolicLinkName,
69 _In_ PUNICODE_STRING DeviceName
70 );
71*/ 72 Status = IoCreateSymbolicLink(&usSymName, &usDevName); //DDK API 创建符号链接 73if (!NT_SUCCESS(Status))
74 {
75 IoDeleteDevice(pDevObj); //删除设备对象 76return Status;
77 }
78 79return STATUS_SUCCESS;
80}
81 82//打开设备的函数 83NTSTATUS CreateCompleteRoutine(PDRIVER_OBJECT pDriverObject, PIRP pIrp)
84{
85 NTSTATUS Status;
86 87 Status = STATUS_SUCCESS;
88 89 KdPrint(("Create"));
90 91//A driver sets an IRP's I/O status block to indicate the final status of an I/O request, before calling IoCompleteRequest for the IRP.
92 93//This is the completion status, either STATUS_SUCCESS if the requested operation was completed successfully or an informational, warning, or error STATUS_ XXX value.
94//For more information, see Using NTSTATUS values. 95 pIrp->IoStatus.Status = Status;
96//This is the completion status, either STATUS_SUCCESS if the requested operation was completed successfully or an informational, warning, or error STATUS_ XXX value.
97//For more information, see Using NTSTATUS values. 98 pIrp->IoStatus.Information = 0;
99100//The IoCompleteRequest routine indicates that the caller has completed all processing for a given I/O request and is returning the given IRP to the I/O manager.
101//IO_NO_INCREMENT 不再往下层传递102 IoCompleteRequest(pIrp, IO_NO_INCREMENT);
103return Status;
104}
105106//关闭设备的函数107NTSTATUS CloseCompleteRoutine(PDRIVER_OBJECT pDriverObject, PIRP pIrp)
108{
109 NTSTATUS Status;
110111 Status = STATUS_SUCCESS;
112113 KdPrint(("Close"));
114115 pIrp->IoStatus.Status = Status;
116 pIrp->IoStatus.Information = 0;
117118 IoCompleteRequest(pIrp, IO_NO_INCREMENT);
119return Status;
120}
121122//读取设备的函数123NTSTATUS ReadCompleteRoutine(PDRIVER_OBJECT pDriverObject, PIRP pIrp)
124{
125 NTSTATUS Status;
126127 Status = STATUS_SUCCESS;
128129 KdPrint(("Read"));
130131 pIrp->IoStatus.Status = Status;
132 pIrp->IoStatus.Information = 0;
133134 IoCompleteRequest(pIrp, IO_NO_INCREMENT);
135return Status;
136}
137138//写入设备的函数139NTSTATUS WriteCompleteRoutine(PDRIVER_OBJECT pDriverObject, PIRP pIrp)
140{
141 NTSTATUS Status;
142143 Status = STATUS_SUCCESS;
144145 KdPrint(("Write"));
146147 pIrp->IoStatus.Status = Status;
148 pIrp->IoStatus.Information = 0;
149150 IoCompleteRequest(pIrp, IO_NO_INCREMENT);
151return Status;
152}
153154//驱动程序入口函数155NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegistryPath)
156{
157//输出信息
158//DbgPrint("1111");159160161 NTSTATUS Status;
162 Status = CreateDevice(pDriverObject); //创建设备对象和符号链接163if (!NT_SUCCESS(Status))
164 {
165 KdPrint(("Create Device Failed."));
166 } else {
167 KdPrint(("Create Device Sucess."));
168 KdPrint(("%wZ", pRegistryPath));
169 }
170171//打开关闭读取写入的分发例程赋值172 pDriverObject->MajorFunction[IRP_MJ_CREATE] = (PDRIVER_DISPATCH)CreateCompleteRoutine; //打开设备173 pDriverObject->MajorFunction[IRP_MJ_CLOSE] = (PDRIVER_DISPATCH)CloseCompleteRoutine; //关闭设备174 pDriverObject->MajorFunction[IRP_MJ_READ] = (PDRIVER_DISPATCH)ReadCompleteRoutine; //读取设备175 pDriverObject->MajorFunction[IRP_MJ_WRITE] = (PDRIVER_DISPATCH)WriteCompleteRoutine; //写入设备
176177//驱动卸载函数赋值178 pDriverObject->DriverUnload = MyDriverUnload;
179180return STATUS_SUCCESS;
181 }
CreateDevice.c应用层采用了MFC创建了一个窗口,窗口有三个按钮:Create、Read、Write。界面如下: