一个比较简单驱动程序初学者可以看看
2005-12-20 12:00
495 查看
我写程序,喜欢以最简单的方式写,因为我怕眼花,我的程序只能看到程序功能,没什么语法特点,都是最基本的.
#include <wdm.h>
#define NT_DEVICE_NAME L"//Device//Example"
#define DOS_DEVICE_NAME L"//DosDevices//Example"
VOID DriverUnload( IN PDRIVER_OBJECT pDriverObject );
NTSTATUS DispatchFunction( IN PDEVICE_OBJECT pDeviceObject, IN PIRP Irp );
NTSTATUS DispatchRead( IN PDEVICE_OBJECT pDeviceObject, IN PIRP Irp );
NTSTATUS DispatchWrite( IN PDEVICE_OBJECT pDeviceObject, IN PIRP Irp );
NTSTATUS DriverEntry( IN PDRIVER_OBJECT pDriverObject, IN PIRP Irp )
{
NTSTATUS status = STATUS_SUCCESS;
PDEVICE_OBJECT pDeviceObject = NULL;
UNICODE_STRING usNtDeviceName, usDosDeviceName;
int nIndex = 0;
RtlInitUnicodeString( &usNtDeviceName, NT_DEVICE_NAME );
status = IoCreateDevice( pDriverObject,
0,
&usNtDeviceName,
FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN,
FALSE,
&pDeviceObject );
if ( NT_SUCCESS(status) )
{
DbgPrint( "DriverEntry" );
pDriverObject->DriverUnload = DriverUnload;
RtlInitUnicodeString( &usDosDeviceName, DOS_DEVICE_NAME );
IoCreateSymbolicLink( &usDosDeviceName, &usNtDeviceName );
for (nIndex; nIndex <= IRP_MJ_MAXIMUM_FUNCTION; nIndex ++)
pDriverObject->MajorFunction[ nIndex ] = DispatchFunction;
}
return status;
}
VOID DriverUnload( IN PDRIVER_OBJECT pDriverObject )
{
UNICODE_STRING usDosDeviceName;
RtlInitUnicodeString( &usDosDeviceName, DOS_DEVICE_NAME );
DbgPrint( "DriverUnload" );
IoDeleteSymbolicLink( &usDosDeviceName );
IoDeleteDevice( pDriverObject->DeviceObject );
}
NTSTATUS DispatchFunction( IN PDEVICE_OBJECT pDeviceObject, IN PIRP Irp )
{
NTSTATUS status = STATUS_SUCCESS;
PIO_STACK_LOCATION irpStack = NULL;
irpStack = IoGetCurrentIrpStackLocation( Irp );
switch ( irpStack->MajorFunction )
{
case IRP_MJ_CREATE:
break;
case IRP_MJ_READ:
DispatchRead( pDeviceObject, Irp );
break;
case IRP_MJ_WRITE:
DispatchWrite( pDeviceObject, Irp );
break;
default:
DbgPrint( "DispatchFunction" );
break;
}
IoCompleteRequest( Irp, IO_NO_INCREMENT );
return status;
}
NTSTATUS DispatchRead( IN PDEVICE_OBJECT pDeviceObject, IN PIRP Irp )
{
NTSTATUS status = STATUS_SUCCESS;
PIO_STACK_LOCATION irpStack = NULL;
char *pBuf = "88888888";
int nLen = sizeof ("88888888");
irpStack = IoGetCurrentIrpStackLocation( Irp );
if ( irpStack )
{
ProbeForWrite( Irp->UserBuffer, irpStack->Parameters.Read.Length, TYPE_ALIGNMENT(char) );
RtlCopyMemory( Irp->UserBuffer, pBuf, nLen );
}
return status;
}
NTSTATUS DispatchWrite( IN PDEVICE_OBJECT pDeviceObject, IN PIRP Irp )
{
NTSTATUS status = STATUS_SUCCESS;
PIO_STACK_LOCATION irpStack = NULL;
irpStack = IoGetCurrentIrpStackLocation( Irp );
if ( irpStack )
{
ProbeForRead( Irp->UserBuffer, irpStack->Parameters.Read.Length, TYPE_ALIGNMENT(char) );
DbgPrint( Irp->UserBuffer );
}
return status;
}
#include <wdm.h>
#define NT_DEVICE_NAME L"//Device//Example"
#define DOS_DEVICE_NAME L"//DosDevices//Example"
VOID DriverUnload( IN PDRIVER_OBJECT pDriverObject );
NTSTATUS DispatchFunction( IN PDEVICE_OBJECT pDeviceObject, IN PIRP Irp );
NTSTATUS DispatchRead( IN PDEVICE_OBJECT pDeviceObject, IN PIRP Irp );
NTSTATUS DispatchWrite( IN PDEVICE_OBJECT pDeviceObject, IN PIRP Irp );
NTSTATUS DriverEntry( IN PDRIVER_OBJECT pDriverObject, IN PIRP Irp )
{
NTSTATUS status = STATUS_SUCCESS;
PDEVICE_OBJECT pDeviceObject = NULL;
UNICODE_STRING usNtDeviceName, usDosDeviceName;
int nIndex = 0;
RtlInitUnicodeString( &usNtDeviceName, NT_DEVICE_NAME );
status = IoCreateDevice( pDriverObject,
0,
&usNtDeviceName,
FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN,
FALSE,
&pDeviceObject );
if ( NT_SUCCESS(status) )
{
DbgPrint( "DriverEntry" );
pDriverObject->DriverUnload = DriverUnload;
RtlInitUnicodeString( &usDosDeviceName, DOS_DEVICE_NAME );
IoCreateSymbolicLink( &usDosDeviceName, &usNtDeviceName );
for (nIndex; nIndex <= IRP_MJ_MAXIMUM_FUNCTION; nIndex ++)
pDriverObject->MajorFunction[ nIndex ] = DispatchFunction;
}
return status;
}
VOID DriverUnload( IN PDRIVER_OBJECT pDriverObject )
{
UNICODE_STRING usDosDeviceName;
RtlInitUnicodeString( &usDosDeviceName, DOS_DEVICE_NAME );
DbgPrint( "DriverUnload" );
IoDeleteSymbolicLink( &usDosDeviceName );
IoDeleteDevice( pDriverObject->DeviceObject );
}
NTSTATUS DispatchFunction( IN PDEVICE_OBJECT pDeviceObject, IN PIRP Irp )
{
NTSTATUS status = STATUS_SUCCESS;
PIO_STACK_LOCATION irpStack = NULL;
irpStack = IoGetCurrentIrpStackLocation( Irp );
switch ( irpStack->MajorFunction )
{
case IRP_MJ_CREATE:
break;
case IRP_MJ_READ:
DispatchRead( pDeviceObject, Irp );
break;
case IRP_MJ_WRITE:
DispatchWrite( pDeviceObject, Irp );
break;
default:
DbgPrint( "DispatchFunction" );
break;
}
IoCompleteRequest( Irp, IO_NO_INCREMENT );
return status;
}
NTSTATUS DispatchRead( IN PDEVICE_OBJECT pDeviceObject, IN PIRP Irp )
{
NTSTATUS status = STATUS_SUCCESS;
PIO_STACK_LOCATION irpStack = NULL;
char *pBuf = "88888888";
int nLen = sizeof ("88888888");
irpStack = IoGetCurrentIrpStackLocation( Irp );
if ( irpStack )
{
ProbeForWrite( Irp->UserBuffer, irpStack->Parameters.Read.Length, TYPE_ALIGNMENT(char) );
RtlCopyMemory( Irp->UserBuffer, pBuf, nLen );
}
return status;
}
NTSTATUS DispatchWrite( IN PDEVICE_OBJECT pDeviceObject, IN PIRP Irp )
{
NTSTATUS status = STATUS_SUCCESS;
PIO_STACK_LOCATION irpStack = NULL;
irpStack = IoGetCurrentIrpStackLocation( Irp );
if ( irpStack )
{
ProbeForRead( Irp->UserBuffer, irpStack->Parameters.Read.Length, TYPE_ALIGNMENT(char) );
DbgPrint( Irp->UserBuffer );
}
return status;
}
相关文章推荐
- 闲来无事,将自己收集到的工具类封装了下,做了一个lib,写了个简单的mvp,初学者可以看看
- 一个简单的多态小例子 初学者可以看看
- github上传代码(sourceTree是一个界面化的上传工具,简单易懂,可以初学者去看看)
- 如何简单的构建一个Notification(入门的可以看看!!)
- 例题:计算运费。c#语言基础,比较简单。看代码输入格式和方法。同样方法可以做一个 出租车打车的程序
- 看看一个朋友写的代码,大家发表发表意见,比较简单的代码
- 一个比较简单驱动程序[编译环境]
- 看看一个朋友写的代码,大家发表发表意见,比较简单的代码
- 看看一个朋友写的代码,大家发表发表意见,比较简单的代码
- 发布一个截图小工具,显示器比较小的CODER可以进来看看。。
- 发布一个截图小工具,显示器比较小的CODER可以进来看看。。
- 看看一个朋友写的代码,大家发表发表意见,比较简单的代码
- 用C++制作一个简单的文字游戏,纯属C++入门,有兴趣的可以看看
- 简单写了一个MVP项目,有兴趣可以看看
- 写了一个整人程序,较简单,有兴趣者可以看看
- 写了一个整人程序,较简单,有兴趣者可以看看
- 看看一个朋友写的代码,大家发表发表意见,比较简单的代码
- 写了一个整人程序,较简单,有兴趣者可以看看
- 关于socket用winform实现简单通信 大牛可绕道 初学者可以看看 我做的时候把客户端窗口隐藏了 大家可以自己改一下
- 写了一个整人程序,较简单,有兴趣者可以看看