驱动开发之三:简单的什么也不做的驱动程序筐架
2012-06-18 06:08
357 查看
//说明,编译是需要相对路径中有inc目录,而且有ntifs.inc;且扩展了函数。
//#include "ntifs.h"
//#include "stdio.h"
//常量定义;
#define DEVICE_TYPE_SYSMON 0x8266 //DDK指出0-7fffh是被系统保留了
#define NT_DEVICE_NAME L"//Device//MINSYS" //内核设备名
#define DOS_DEVICE_NAME L"//DosDevices//MINSYS" //符号连接设备名
//全局变量定义;
PDRIVER_OBJECT gOwenDriverObject; //本驱动程序对象
PDEVICE_OBJECT gCtrlDeviceObject; //用控制设备对象域
#pragma code_seg("PAGE")
VOID//UnLoad例程;
Unload(PDRIVER_OBJECT DriverObject)
{
UNICODE_STRING Win32DeviceName;
RtlInitUnicodeString(&Win32DeviceName,DOS_DEVICE_NAME);
IoDeleteSymbolicLink(&Win32DeviceName);
IoDeleteDevice(gCtrlDeviceObject);
#if (DBG)
{
DbgPrint (("-------------------Unload OK/n"));
}
#endif
return;
}
NTSTATUS
DeviceIrpCreate( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
{
IoCompleteRequest( Irp, IO_NO_INCREMENT );
return STATUS_SUCCESS;
}
NTSTATUS
DeviceIrpClose( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
{
IoCompleteRequest( Irp, IO_NO_INCREMENT );
return STATUS_SUCCESS;
}
NTSTATUS
DeviceIrpControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
{
IoCompleteRequest( Irp, IO_NO_INCREMENT );
return STATUS_SUCCESS;
}
#pragma code_seg("INIT")
NTSTATUS//驱动程序入口;
DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
{
NTSTATUS Status;
UNICODE_STRING NtDeviceName;
UNICODE_STRING Win32DeviceName;
//保存自己的驱动程序对象,备用
gOwenDriverObject=DriverObject;
//初始化Unicode字符串, 创建设备对象;
RtlInitUnicodeString(&NtDeviceName,NT_DEVICE_NAME);
Status=IoCreateDevice( DriverObject,0,&NtDeviceName,
DEVICE_TYPE_SYSMON,0,FALSE,&gCtrlDeviceObject);
if (!NT_SUCCESS(Status)) return Status;
//初始化Unicode字符串, 创建Win32符号连接,以便Win32程序能够访问;
RtlInitUnicodeString(&Win32DeviceName,DOS_DEVICE_NAME);
Status=IoCreateSymbolicLink(&Win32DeviceName,&NtDeviceName);
if (!NT_SUCCESS(Status))
{
IoDeleteDevice( gCtrlDeviceObject );
return Status;
}
//填写驱动程序Dispatch例程
DriverObject->MajorFunction[IRP_MJ_CREATE] =DeviceIrpCreate;
DriverObject->MajorFunction[IRP_MJ_CLOSE] =DeviceIrpClose;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =DeviceIrpControl;
//填写处理Unload例程
DriverObject->DriverUnload =Unload;
#if (DBG)
{
DbgPrint("DriverObject=%x RegistryPath=%x/n",DriverObject,RegistryPath);
}
#endif
return Status;
}
//#include "ntifs.h"
//#include "stdio.h"
//常量定义;
#define DEVICE_TYPE_SYSMON 0x8266 //DDK指出0-7fffh是被系统保留了
#define NT_DEVICE_NAME L"//Device//MINSYS" //内核设备名
#define DOS_DEVICE_NAME L"//DosDevices//MINSYS" //符号连接设备名
//全局变量定义;
PDRIVER_OBJECT gOwenDriverObject; //本驱动程序对象
PDEVICE_OBJECT gCtrlDeviceObject; //用控制设备对象域
#pragma code_seg("PAGE")
VOID//UnLoad例程;
Unload(PDRIVER_OBJECT DriverObject)
{
UNICODE_STRING Win32DeviceName;
RtlInitUnicodeString(&Win32DeviceName,DOS_DEVICE_NAME);
IoDeleteSymbolicLink(&Win32DeviceName);
IoDeleteDevice(gCtrlDeviceObject);
#if (DBG)
{
DbgPrint (("-------------------Unload OK/n"));
}
#endif
return;
}
NTSTATUS
DeviceIrpCreate( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
{
IoCompleteRequest( Irp, IO_NO_INCREMENT );
return STATUS_SUCCESS;
}
NTSTATUS
DeviceIrpClose( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
{
IoCompleteRequest( Irp, IO_NO_INCREMENT );
return STATUS_SUCCESS;
}
NTSTATUS
DeviceIrpControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
{
IoCompleteRequest( Irp, IO_NO_INCREMENT );
return STATUS_SUCCESS;
}
#pragma code_seg("INIT")
NTSTATUS//驱动程序入口;
DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
{
NTSTATUS Status;
UNICODE_STRING NtDeviceName;
UNICODE_STRING Win32DeviceName;
//保存自己的驱动程序对象,备用
gOwenDriverObject=DriverObject;
//初始化Unicode字符串, 创建设备对象;
RtlInitUnicodeString(&NtDeviceName,NT_DEVICE_NAME);
Status=IoCreateDevice( DriverObject,0,&NtDeviceName,
DEVICE_TYPE_SYSMON,0,FALSE,&gCtrlDeviceObject);
if (!NT_SUCCESS(Status)) return Status;
//初始化Unicode字符串, 创建Win32符号连接,以便Win32程序能够访问;
RtlInitUnicodeString(&Win32DeviceName,DOS_DEVICE_NAME);
Status=IoCreateSymbolicLink(&Win32DeviceName,&NtDeviceName);
if (!NT_SUCCESS(Status))
{
IoDeleteDevice( gCtrlDeviceObject );
return Status;
}
//填写驱动程序Dispatch例程
DriverObject->MajorFunction[IRP_MJ_CREATE] =DeviceIrpCreate;
DriverObject->MajorFunction[IRP_MJ_CLOSE] =DeviceIrpClose;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =DeviceIrpControl;
//填写处理Unload例程
DriverObject->DriverUnload =Unload;
#if (DBG)
{
DbgPrint("DriverObject=%x RegistryPath=%x/n",DriverObject,RegistryPath);
}
#endif
return Status;
}
相关文章推荐
- 驱动开发之三:简单的什么也不做的驱动程序筐架
- Linux USB 驱动开发(五)—— USB驱动程序开发过程简单总结
- Linux USB 驱动开发(五)—— USB驱动程序开发过程简单总结
- Linux USB 驱动开发(五)—— USB驱动程序开发过程简单总结
- Windows驱动开发WDM (2)- 一个简单的WDM驱动程序
- Linux USB 驱动开发(五)—— USB驱动程序开发过程简单总结
- Linux驱动USB驱动程序之USB设备驱动程序1简单编写
- 字符设备驱动0:一个简单但完整的字符设备驱动程序
- 【转帖】简单建立VC + DDK的驱动开发环境
- linux设备驱动程序之简单字符设备驱动
- Linux驱动程序开发 004- 字符设备驱动
- linux设备驱动程序之简单字符设备驱动
- Windows驱动开发之第一个驱动程序
- 软件开发者面试百问-----解释一下什么是测试驱动开发,举出极限编程中的一些原则
- linux驱动程序开发的简单休眠
- windows驱动开发——一个最简单DDK驱动。
- 驱动程序学习(二)一个简单的字符型设备驱动函数
- 驱动开发之六 --- 一个简单的显示驱动之三 【译文】
- Linux内核开发之简单字符设备驱动(下)
- Linux驱动程序开发 - 设备驱动模型初探