|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- #include <ntddk.h>
- //定义个INITCODE宏,这个宏表示 初始化的时候载入内存,然后可以从内存中卸载掉
- #define INITCODE code_seg("INIT") //;注意这里是不能加分号的
- #define PAGECODE code_seg("PAGE") //表示内存不够用时,可以置换到虚拟内存(硬盘)
- //驱动设备
- #pragma INITCODE //表示这个函数运行后,就从内存中释放掉
- NTSTATUS CreateMyDevice (IN PDRIVER_OBJECT pDriverObject)
- {
- NTSTATUS status; // NTSTATUS 等价于 LONG
- PDEVICE_OBJECT pDevObj;/*用来返回创建设备*/
- //UNICODE_STRING 类型为UNICODE的字符结构,里面包含3个成员,第一个Length 表示buffer字节的长度,不包含NULL,第二个MaximumLength:buffer总的字节大小,第三个Buffer:指向宽字符的指针
- //创建设备名称
- UNICODE_STRING devName;
- UNICODE_STRING symLinkName;
- //会动态分配一块指向“\\Device\\yjxDDK_Device”的内存指针,赋值给devName.Buffer;
- RtlInitUnicodeString(&devName,L"\\Device\\yjxDDK_Device");/*对devName初始化字串为 "\\Device\\yjxDDK_Device"*/
- //IoCreateDevice 创建设备对象,并更新pDriverObject->DeviceObject 为新创建的设备对象
- //介绍每个参数
- // pDriverObject 该参数用于在驱动程序和新设备对象之间建立连接,
- // 0 第二个参数是设备扩展结构的大小
- // &devName 命名该设备对象的UNICODE_STRING串的地址
- // &FILE_DEVICE_UNKNOWN 设备类型
- // 0 为设备对象提供Characteristics标志
- // TRUE 指出设备是否是排斥的
- // &pDevObj 设备对象的名字,有了名字应用程序就可以访问该设备的驱动对象了
- status = IoCreateDevice( pDriverObject,\
- 0,\
- &devName,\
- FILE_DEVICE_UNKNOWN,\
- 0, TRUE,\
- &pDevObj);
- //NT_SUCCESS宏定义:表示判断 status>=0
- if (!NT_SUCCESS(status)) //成功返回0 0>=0 吗 true 取反 false 不执行
- {
- if(status == STATUS_INSUFFICIENT_RESOURCES)
- {
- KdPrint(("STATUS_INSUFFICIENT_RESOURCES 资源不足"));
- }
- if(status == STATUS_OBJECT_NAME_EXISTS)
- {
- KdPrint(("STATUS_OBJECT_NAME_EXISTS 指定对象不存在"));
- }
- if(status == STATUS_OBJECT_NAME_COLLISION)
- {
- KdPrint(("STATUS_INSUFFICIENT_RESOURCES 对象名有冲突"));
- }
- KdPrint(("创建设备错误,返回值是=%d ",status));
- return status;
- }
-
- KdPrint(("创建设备成功,返回值是=%d ",status));
- //所创建设备被设定为直接缓冲I/O,这是设备读写三种方式中的一种
- pDevObj->Flags |= DO_BUFFERED_IO;
- //创建符号链接
- RtlInitUnicodeString(&symLinkName,L"\\??\\yjx888");
- //创建一个设备链接。驱动程序虽然有了设备名称,但是这种设备名只能在内核状态可见,而对于应用程序是不可见的,因此,驱动需要要暴露一个符号链接,来方便应用程序的访问,该链接指向真正的设备名称
- status = IoCreateSymbolicLink( &symLinkName,&devName );
- if (!NT_SUCCESS(status))
- {
- KdPrint(("创建符号连接错误,返回值是=%d ",status));
- //删除设备对象
- IoDeleteDevice( pDevObj );
- return status;
- }
- KdPrint(("创建符号连接成功,返回值是=%d ",status));
- return STATUS_SUCCESS;
- }
- //卸载函数的前置说明
- VOID DDK_Unload(IN PDRIVER_OBJECT pDriverObject);
- //设置函数代码存放的代码段,这是是放在init段中
- #pragma INITCODE
- //NTSTATUS 等价与 LONG
- NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING B)
- {
- KdPrint(("驱动成功被加载..."));
- //创建设备对象
- CreateMyDevice(pDriverObject);
- //Driverunload 回调函数的一个指针,这里的回调函数是卸载驱动的函数
- pDriverObject->DriverUnload = DDK_Unload;
- return 1;
- }
- VOID DDK_Unload(IN PDRIVER_OBJECT pDriverObject)
- {
-
- //KdPrint使用方法类似printf,注意KdPrint((" ", ));使用的是双括号。
- //这个比DbgPrint 调用要稍好。因为在free 版不被编译。
- KdPrint(("驱动成功被卸载..."));
- DbgPrint("DbgPrint功能与KdPrint相同");
- }
复制代码 |
|