驱动基本框架
来源:互联网 发布:软件工程硕士 课程 编辑:程序博客网 时间:2024/05/13 02:45
#include "Ring0.h"//驱动在卸载的时候,经过这里,我们可以在这里释放一些资源。//断开通话VOID DriverUnload(PDRIVER_OBJECT DriverObject){UNICODE_STRING DeviceName;UNICODE_STRING DosDeviceName; //删除符号链接RtlInitUnicodeString(&DosDeviceName, DOSDEVICE);IoDeleteSymbolicLink(&DosDeviceName );if( DriverDeviceObject != NULL )IoDeleteDevice( DriverDeviceObject );DbgPrint("驱动卸载成功!\r\n");}//函数派遣的IRP,如果我们不需要用到这里通信。NTSTATUS IODispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp){Irp->IoStatus.Status = STATUS_SUCCESS;//完成例程,表示调用者已经完成了对指定请求的所有处理操作。IoCompleteRequest(Irp,IO_NO_INCREMENT);return STATUS_SUCCESS;}//其实就是win32DLL里面的入口//BOOL WINAPI DllMain(hinstDLL,fdwReason,lpvReserved);//DRIVER_OBJECT其实是一个结构体/*lkd> dt_DRIVER_OBJECTnt!_DRIVER_OBJECT+0x000 Type : Int2B+0x002 Size : Int2B+0x004 DeviceObject : Ptr32 _DEVICE_OBJECT+0x008 Flags : Uint4B+0x00c DriverStart : Ptr32 Void //就是驱动在内存中的开始地址,也可以把它当成是一个pe文件的头开始+0x010 DriverSize : Uint4B//驱动的大小+0x014 DriverSection : Ptr32 Void+0x018 DriverExtension : Ptr32 _DRIVER_EXTENSION+0x01c DriverName : _UNICODE_STRING+0x024 HardwareDatabase : Ptr32 _UNICODE_STRING+0x028 FastIoDispatch : Ptr32 _FAST_IO_DISPATCH+0x02c DriverInit : Ptr32 long +0x030 DriverStartIo : Ptr32 void +0x034 DriverUnload : Ptr32 void//驱动的卸载例程+0x038 MajorFunction : [28] Ptr32 long lkd> dt_UNICODE_STRINGnt!_UNICODE_STRING+0x000 Length : Uint2B //这个是文本的长度+0x002 MaximumLength : Uint2B //最大长度+0x004 Buffer : Ptr32 Uint2B //这个是文本的内容 UNICODE*/NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING theRegistryPath){UNICODE_STRING DeviceName;UNICODE_STRING DosDeviceName; NTSTATUS status;//初始化驱动符号名//UNICODE_STRING是一个结构体,类似win32里面的结构体,比如SYSTEMTIME//在Win系统下,内核的结构体都是可以通过windbg或者wrk获得。/*lkd> dt_unicode_stringnt!_UNICODE_STRING+0x000 Length : Uint2B //文本长度+0x002 MaximumLength : Uint2B //最大长度+0x004 Buffer : Ptr32 Uint2B //文本内容,是unicode类型,即WCHAR*/RtlInitUnicodeString(&DeviceName, DEVICE);RtlInitUnicodeString(&DosDeviceName, DOSDEVICE);//如果要跟用户层通信,我们需要创建一个设备//如果我们要跟别人通话,是不是需要一部电话在手里?这个函数就相当于这部电话status = IoCreateDevice(DriverObject, // ptr to caller object0, // extension device allocated byte number&DeviceName, // device name FILE_DEVICE_UNKNOWN, 0, // no special caracteristicsFALSE, // we can open many handles in same time&DriverDeviceObject); // [OUT] ptr to the created objectif (!NT_SUCCESS(status)){return STATUS_NO_SUCH_DEVICE;}//同样我们也需要一个符号链接,不然会影响到驱动和应用层的通信//我们还需要一个移动卡status = IoCreateSymbolicLink(&DosDeviceName,&DeviceName);if( !NT_SUCCESS(status)){IoDeleteDevice( DriverDeviceObject );return STATUS_NO_SUCH_DEVICE;} //驱动通信例程//这是驱动的卸载例程,类似于DLL里面的DLL_PROCESS_DETACH,要卸载这个驱动,就要设置卸载例程DriverObject->DriverUnload = DriverUnload;//IRP_MJ_CREATE,响应的是应用层函数CreateFile,应用层调用这个函数就会进入这个例程DriverObject->MajorFunction[IRP_MJ_CREATE] = IODispatch; //CreateFile();<pre class="cpp" name="code">#include "Ring0.h"//驱动在卸载的时候,经过这里,我们可以在这里释放一些资源。//断开通话VOID DriverUnload(PDRIVER_OBJECT DriverObject){UNICODE_STRING DeviceName;UNICODE_STRING DosDeviceName; //删除符号链接RtlInitUnicodeString(&DosDeviceName, DOSDEVICE);IoDeleteSymbolicLink(&DosDeviceName );if( DriverDeviceObject != NULL )IoDeleteDevice( DriverDeviceObject );DbgPrint("驱动卸载成功!\r\n");}//函数派遣的IRP,如果我们不需要用到这里通信。NTSTATUS IODispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp){Irp->IoStatus.Status = STATUS_SUCCESS;//完成例程,表示调用者已经完成了对指定请求的所有处理操作。IoCompleteRequest(Irp,IO_NO_INCREMENT);return STATUS_SUCCESS;}//其实就是win32DLL里面的入口//BOOL WINAPI DllMain(hinstDLL,fdwReason,lpvReserved);//DRIVER_OBJECT其实是一个结构体/*lkd> dt_DRIVER_OBJECTnt!_DRIVER_OBJECT+0x000 Type : Int2B+0x002 Size : Int2B+0x004 DeviceObject : Ptr32 _DEVICE_OBJECT+0x008 Flags : Uint4B+0x00c DriverStart : Ptr32 Void //就是驱动在内存中的开始地址,也可以把它当成是一个pe文件的头开始+0x010 DriverSize : Uint4B//驱动的大小+0x014 DriverSection : Ptr32 Void+0x018 DriverExtension : Ptr32 _DRIVER_EXTENSION+0x01c DriverName : _UNICODE_STRING+0x024 HardwareDatabase : Ptr32 _UNICODE_STRING+0x028 FastIoDispatch : Ptr32 _FAST_IO_DISPATCH+0x02c DriverInit : Ptr32 long +0x030 DriverStartIo : Ptr32 void +0x034 DriverUnload : Ptr32 void//驱动的卸载例程+0x038 MajorFunction : [28] Ptr32 long lkd> dt_UNICODE_STRINGnt!_UNICODE_STRING+0x000 Length : Uint2B //这个是文本的长度+0x002 MaximumLength : Uint2B //最大长度+0x004 Buffer : Ptr32 Uint2B //这个是文本的内容 UNICODE*/NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING theRegistryPath){UNICODE_STRING DeviceName;UNICODE_STRING DosDeviceName; NTSTATUS status;//初始化驱动符号名//UNICODE_STRING是一个结构体,类似win32里面的结构体,比如SYSTEMTIME//在Win系统下,内核的结构体都是可以通过windbg或者wrk获得。/*lkd> dt_unicode_stringnt!_UNICODE_STRING+0x000 Length : Uint2B //文本长度+0x002 MaximumLength : Uint2B //最大长度+0x004 Buffer : Ptr32 Uint2B //文本内容,是unicode类型,即WCHAR*/RtlInitUnicodeString(&DeviceName, DEVICE);RtlInitUnicodeString(&DosDeviceName, DOSDEVICE);//如果要跟用户层通信,我们需要创建一个设备//如果我们要跟别人通话,是不是需要一部电话在手里?这个函数就相当于这部电话status = IoCreateDevice(DriverObject, // ptr to caller object0, // extension device allocated byte number&DeviceName, // device name FILE_DEVICE_UNKNOWN, 0, // no special caracteristicsFALSE, // we can open many handles in same time&DriverDeviceObject); // [OUT] ptr to the created objectif (!NT_SUCCESS(status)){return STATUS_NO_SUCH_DEVICE;}//同样我们也需要一个符号链接,不然会影响到驱动和应用层的通信//我们还需要一个移动卡status = IoCreateSymbolicLink(&DosDeviceName,&DeviceName);if( !NT_SUCCESS(status)){IoDeleteDevice( DriverDeviceObject );return STATUS_NO_SUCH_DEVICE;} //驱动通信例程//这是驱动的卸载例程,类似于DLL里面的DLL_PROCESS_DETACH,要卸载这个驱动,就要设置卸载例程DriverObject->DriverUnload = DriverUnload;//IRP_MJ_CREATE,响应的是应用层函数CreateFile,应用层调用这个函数就会进入这个例程DriverObject->MajorFunction[IRP_MJ_CREATE] = IODispatch; //CreateFile();//下面的分别对应CloseHandle ReadFile WriteFileDriverObject->MajorFunction[IRP_MJ_CLOSE] = IODispatch; //CloseHandle() //你可以把这些想象成是不同的电话号码DriverObject->MajorFunction[IRP_MJ_READ] = IODispatch; //ReadFile()DriverObject->MajorFunction[IRP_MJ_WRITE] = IODispatch; //WriteFile()//一般我们跟应用层通信,都是通过IRP_MJ_DEVICE_CONTROL例程,这个例程对应的是应用层下的DeviceIoControlDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IODispatch;//DeviceIoControl()//像所有入门程序一样,我们可以打印出Hello World证明我们的驱动加载成功DbgPrint("Hello World\r\n");return STATUS_SUCCESS;}
//下面的分别对应CloseHandle ReadFile WriteFileDriverObject->MajorFunction[IRP_MJ_CLOSE] = IODispatch; //CloseHandle() //你可以把这些想象成是不同的电话号码DriverObject->MajorFunction[IRP_MJ_READ] = IODispatch; //ReadFile()DriverObject->MajorFunction[IRP_MJ_WRITE] = IODispatch; //WriteFile()//一般我们跟应用层通信,都是通过IRP_MJ_DEVICE_CONTROL例程,这个例程对应的是应用层下的DeviceIoControlDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IODispatch; //DeviceIoControl()//像所有入门程序一样,我们可以打印出Hello World证明我们的驱动加载成功DbgPrint("Hello World\r\n");return STATUS_SUCCESS;}
0 0
- 驱动基本框架
- pci 驱动的基本框架
- Linux驱动基本框架简介
- 字符设备驱动基本框架
- 字符驱动之:基本框架
- 使用EasySYS搭建驱动开发基本框架
- 驱动通信基本框架的实例
- 使用EasySYS搭建驱动开发基本框架
- Linux设备驱动之中断---基本代码框架
- 网络驱动移植之解析Linux网络驱动的基本框架
- 网络驱动移植之解析Linux网络驱动的基本框架
- 网络驱动移植之解析Linux网络驱动的基本框架
- Linux驱动学习笔记(2)----字符型设备驱动基本框架
- 驱动框架
- 驱动框架
- 驱动框架
- 驱动框架
- 驱动框架
- hdu 1068 girls and boys(二分图求最大独立集)
- POJ_P2104 K-th Number(主席树)
- 使用Solrj 获取语句分词结果的代码
- Linux 下 SVN 常用命令
- java中super的两种方法
- 驱动基本框架
- [深度好文]电动车真的很环保吗?
- 《Android源码设计模式》读书笔记 (10) 第10章 解释器模式
- CLH自旋锁
- 【ahk】获取网站的源代码
- 函数参数传递2
- C语言实现的高精度计算器
- “瀑布流式”图片懒加载代码解析及优化(二)
- 【C++】For、While、do···while循环