34: * 函数名称:CreateDevice
35: * 功能描述:初始化设备对象
36: * 参数列表:
37: pDriverObject:从I/O管理器中传进来的驱动对象
38: * 返回 值:返回初始化状态
39: *************************************************************************/
40: #pragma INITCODE
41: NTSTATUS CreateDevice (
42: IN PDRIVER_OBJECT pDriverObject)
43: {
44: NTSTATUS status;
45: PDEVICE_OBJECT pDevObj;
46: PDEVICE_EXTENSION pDevExt;
47:
48: //创建设备名称
49: UNICODE_STRING devName;
50: RtlInitUnicodeString(&devName,L"\\Device\\MyDDKDevice");
51:
52: //创建设备
53: status = IoCreateDevice( pDriverObject,
54: sizeof(DEVICE_EXTENSION),
55: &(UNICODE_STRING)devName,
56: FILE_DEVICE_UNKNOWN,
57: 0, TRUE,
58: &pDevObj );
59: if (!NT_SUCCESS(status))
60: return status;
61:
62: pDevObj->Flags |= DO_BUFFERED_IO;
63: pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;
64: pDevExt->pDevice = pDevObj;
65: pDevExt->ustrDeviceName = devName;
66: //创建符号链接
67: UNICODE_STRING symLinkName;
68: RtlInitUnicodeString(&symLinkName,L"\\??\\HelloDDK");
69: pDevExt->ustrSymLinkName = symLinkName;
70: status = IoCreateSymbolicLink( &symLinkName,&devName );
71: if (!NT_SUCCESS(status))
72: {
73: IoDeleteDevice( pDevObj );
74: return status;
75: }
76: return STATUS_SUCCESS;
77: }
78:
79: /************************************************************************
80: * 函数名称:HelloDDKUnload
81: * 功能描述:负责驱动程序的卸载操作
82: * 参数列表:
83: pDriverObject:驱动对象
84: * 返回 值:返回状态
85: *************************************************************************/
86: #pragma PAGEDCODE
87: VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject)
88: {
89: PDEVICE_OBJECT pNextObj;
90: KdPrint(("Enter DriverUnloadn"));
91: pNextObj = pDriverObject->DeviceObject;
92: while (pNextObj != NULL)
93: {
94: PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)
95: pNextObj->DeviceExtension;
96:
97: //删除符号链接
98: UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName;
99: IoDeleteSymbolicLink(&pLinkName);
100: pNextObj = pNextObj->NextDevice;
101: IoDeleteDevice( pDevExt->pDevice );
102: }
103: }
104:
105: /************************************************************************
106: * 函数名称:HelloDDKDispatchRoutine
107: * 功能描述:对读IRP进行处理
108: * 参数列表:
109: pDevObj:功能设备对象
110: pIrp:从IO请求包
111: * 返回 值:返回状态
112: *************************************************************************/
113: #pragma PAGEDCODE
114: NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,
115: IN PIRP pIrp)
116: {
117: KdPrint(("Enter HelloDDKDispatchRoutinen"));
118: NTSTATUS status = STATUS_SUCCESS;
119: // 完成IRP
120: pIrp->IoStatus.Status = status;
121: pIrp->IoStatus.Information = 0; // bytes xfered
122: IoCompleteRequest( pIrp, IO_NO_INCREMENT );
123: KdPrint(("Leave HelloDDKDispatchRoutinen"));
124: return status;
125: }
第12行至31行定义了Driver_Entry入口函数。这里的extern "C"显然和前面一个意思,作为被内核直接调用的
函数,必须要使用c语言的方式编译。作为初始化函数,它注册了卸载例程和IRP响应函数,然后创建了一个设
备便结束了。status是由设备是否成功创建为标准的。
41至77行定义了CreateDevice函数,首先用RtlInitUnicodeString()函数,初始化了devName(相当于UNICODE
的赋值函数),字符串左端的L代表这是个宽字符集(占1个word)。接下来就调用了该函数的核心
IoCreateDevice()。
接口如下:
NTSTATUS IoCreateDevice(
__in PDRIVER_OBJECT DriverObject,
__in ULONG DeviceExtensionSize,
__in_opt PUNICODE_STRING DeviceName,
__in DEVICE_TYPE DeviceType,
__in ULONG DeviceCharacteristics,
__in BOOLEAN Exclusive,
__out PDEVICE_OBJECT *DeviceObject
);
解释两个,
DeviceCharacteristics:用于描述设备某种特征的值,比如这是一个只读设备,这是一个远程设备,等等。
Exclusive: 描述这个设备是否是独占的设备,这个我暂时不太能理解,不过MSDN上面提到,大部分driver都
是false。和该程序有出入。