当前位置:网站首页 > Go语言开发 > 正文

windows驱动开发书籍(windows驱动开发前景)



《Windows驱动开发技术详解》读书笔记(二)_#pragma 《Windows驱动开发技术详解》读书笔记(二)_ico_02

HelloWDM.cpp


#include "HelloWDM.h"



/


* 函数名称:DriverEntry


* 功能描述:初始化驱动程序,定位和申请硬件资源,创建内核对象


* 参数列表:


pDriverObject:从I/O管理器中传进来的驱动对象


pRegistryPath:驱动程序在注册表的中的路径


* 返回 值:返回初始化驱动状态


*/


#pragma INITCODE


extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,


IN PUNICODE_STRING pRegistryPath)


{


KdPrint(("Enter DriverEntry

"));



pDriverObject->DriverExtension->AddDevice = HelloWDMAddDevice;


pDriverObject->MajorFunction[IRP_MJ_PNP] = HelloWDMPnp;


pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =


pDriverObject->MajorFunction[IRP_MJ_CREATE] =


pDriverObject->MajorFunction[IRP_MJ_READ] =


pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloWDMDispatchRoutine;


pDriverObject->DriverUnload = HelloWDMUnload;



KdPrint(("Leave DriverEntry

"));


return STATUS_SUCCESS;


}



/


* 函数名称:HelloWDMAddDevice


* 功能描述:添加新设备


* 参数列表:


DriverObject:从I/O管理器中传进来的驱动对象


PhysicalDeviceObject:从I/O管理器中传进来的物理设备对象


* 返回 值:返回添加新设备状态


*/


#pragma PAGEDCODE


NTSTATUS HelloWDMAddDevice(IN PDRIVER_OBJECT DriverObject,


IN PDEVICE_OBJECT PhysicalDeviceObject)


{


PAGED_CODE();


KdPrint(("Enter HelloWDMAddDevice

"));



NTSTATUS status;


PDEVICE_OBJECT fdo;


UNICODE_STRING devName;


RtlInitUnicodeString(&devName,L"\Device\MyWDMDevice");


status = IoCreateDevice(


DriverObject,


sizeof(DEVICE_EXTENSION),


&(UNICODE_STRING)devName,


FILE_DEVICE_UNKNOWN,


0,


FALSE,


&fdo);


if( !NT_SUCCESS(status))


return status;


PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)fdo->DeviceExtension;


pdx->fdo = fdo;


pdx->NextStackDevice = IoAttachDeviceToDeviceStack(fdo, PhysicalDeviceObject);


UNICODE_STRING symLinkName;


RtlInitUnicodeString(&symLinkName,L"\DosDevices\HelloWDM");



pdx->ustrDeviceName = devName;


pdx->ustrSymLinkName = symLinkName;


status = IoCreateSymbolicLink(&(UNICODE_STRING)symLinkName,&(UNICODE_STRING)devName);



if( !NT_SUCCESS(status))


{


IoDeleteSymbolicLink(&pdx->ustrSymLinkName);


status = IoCreateSymbolicLink(&symLinkName,&devName);


if( !NT_SUCCESS(status))


{


return status;


}


}



fdo->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE;


fdo->Flags &= ~DO_DEVICE_INITIALIZING;



KdPrint(("Leave HelloWDMAddDevice

"));


return STATUS_SUCCESS;


}



/


* 函数名称:DefaultPnpHandler


* 功能描述:对PNP IRP进行缺省处理


* 参数列表:


pdx:设备对象的扩展


Irp:从IO请求包


* 返回 值:返回状态


*/


#pragma PAGEDCODE


NTSTATUS DefaultPnpHandler(PDEVICE_EXTENSION pdx, PIRP Irp)


{


PAGED_CODE();


KdPrint(("Enter DefaultPnpHandler

"));


IoSkipCurrentIrpStackLocation(Irp);


KdPrint(("Leave DefaultPnpHandler

"));


return IoCallDriver(pdx->NextStackDevice, Irp);


}



/


* 函数名称:HandleRemoveDevice


* 功能描述:对IRP_MN_REMOVE_DEVICE IRP进行处理


* 参数列表:


fdo:功能设备对象


Irp:从IO请求包


* 返回 值:返回状态


*/


#pragma PAGEDCODE


NTSTATUS HandleRemoveDevice(PDEVICE_EXTENSION pdx, PIRP Irp)


{


PAGED_CODE();


KdPrint(("Enter HandleRemoveDevice

"));



Irp->IoStatus.Status = STATUS_SUCCESS;


NTSTATUS status = DefaultPnpHandler(pdx, Irp);


IoDeleteSymbolicLink(&(UNICODE_STRING)pdx->ustrSymLinkName);



//调用IoDetachDevice()把fdo从设备栈中脱开:


if (pdx->NextStackDevice)


IoDetachDevice(pdx->NextStackDevice);



//删除fdo:


IoDeleteDevice(pdx->fdo);


KdPrint(("Leave HandleRemoveDevice

"));


return status;


}



/


* 函数名称:HelloWDMPnp


* 功能描述:对即插即用IRP进行处理


* 参数列表:


fdo:功能设备对象


Irp:从IO请求包


* 返回 值:返回状态


*/


#pragma PAGEDCODE


NTSTATUS HelloWDMPnp(IN PDEVICE_OBJECT fdo,


IN PIRP Irp)


{


PAGED_CODE();



KdPrint(("Enter HelloWDMPnp

"));


NTSTATUS status = STATUS_SUCCESS;


PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;


PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);


static NTSTATUS (*fcntab[])(PDEVICE_EXTENSION pdx, PIRP Irp) =


{


DefaultPnpHandler,        // IRP_MN_START_DEVICE


DefaultPnpHandler,        // IRP_MN_QUERY_REMOVE_DEVICE


HandleRemoveDevice,        // IRP_MN_REMOVE_DEVICE


DefaultPnpHandler,        // IRP_MN_CANCEL_REMOVE_DEVICE


DefaultPnpHandler,        // IRP_MN_STOP_DEVICE


DefaultPnpHandler,        // IRP_MN_QUERY_STOP_DEVICE


DefaultPnpHandler,        // IRP_MN_CANCEL_STOP_DEVICE


DefaultPnpHandler,        // IRP_MN_QUERY_DEVICE_RELATIONS


DefaultPnpHandler,        // IRP_MN_QUERY_INTERFACE


DefaultPnpHandler,        // IRP_MN_QUERY_CAPABILITIES


DefaultPnpHandler,        // IRP_MN_QUERY_RESOURCES


DefaultPnpHandler,        // IRP_MN_QUERY_RESOURCE_REQUIREMENTS


DefaultPnpHandler,        // IRP_MN_QUERY_DEVICE_TEXT


DefaultPnpHandler,        // IRP_MN_FILTER_RESOURCE_REQUIREMENTS


DefaultPnpHandler,        //


DefaultPnpHandler,        // IRP_MN_READ_CONFIG


DefaultPnpHandler,        // IRP_MN_WRITE_CONFIG


DefaultPnpHandler,        // IRP_MN_EJECT


DefaultPnpHandler,        // IRP_MN_SET_LOCK


DefaultPnpHandler,        // IRP_MN_QUERY_ID


DefaultPnpHandler,        // IRP_MN_QUERY_PNP_DEVICE_STATE


DefaultPnpHandler,        // IRP_MN_QUERY_BUS_INFORMATION


DefaultPnpHandler,        // IRP_MN_DEVICE_USAGE_NOTIFICATION


DefaultPnpHandler,        // IRP_MN_SURPRISE_REMOVAL


};



ULONG fcn = stack->MinorFunction;


if (fcn >= arraysize(fcntab))


{                        // 未知的子功能代码


status = DefaultPnpHandler(pdx, Irp); // some function we don't know about


return status;


}



#if DBG


static char* fcnname[] =


{


"IRP_MN_START_DEVICE",


"IRP_MN_QUERY_REMOVE_DEVICE",


"IRP_MN_REMOVE_DEVICE",


"IRP_MN_CANCEL_REMOVE_DEVICE",


"IRP_MN_STOP_DEVICE",


"IRP_MN_QUERY_STOP_DEVICE",


"IRP_MN_CANCEL_STOP_DEVICE",


"IRP_MN_QUERY_DEVICE_RELATIONS",


"IRP_MN_QUERY_INTERFACE",


"IRP_MN_QUERY_CAPABILITIES",


"IRP_MN_QUERY_RESOURCES",


"IRP_MN_QUERY_RESOURCE_REQUIREMENTS",


"IRP_MN_QUERY_DEVICE_TEXT",


"IRP_MN_FILTER_RESOURCE_REQUIREMENTS",


"",


"IRP_MN_READ_CONFIG",


"IRP_MN_WRITE_CONFIG",


"IRP_MN_EJECT",


"IRP_MN_SET_LOCK",


"IRP_MN_QUERY_ID",


"IRP_MN_QUERY_PNP_DEVICE_STATE",


"IRP_MN_QUERY_BUS_INFORMATION",


"IRP_MN_DEVICE_USAGE_NOTIFICATION",


"IRP_MN_SURPRISE_REMOVAL",


};



KdPrint(("PNP Request (%s)

", fcnname[fcn]));


#endif // DBG



status = (*fcntab[fcn])(pdx, Irp);


KdPrint(("Leave HelloWDMPnp

"));


return status;


}



/


* 函数名称:HelloWDMDispatchRoutine


* 功能描述:对缺省IRP进行处理


* 参数列表:


fdo:功能设备对象


Irp:从IO请求包


* 返回 值:返回状态


*/


#pragma PAGEDCODE


NTSTATUS HelloWDMDispatchRoutine(IN PDEVICE_OBJECT fdo,


IN PIRP Irp)


{


PAGED_CODE();


KdPrint(("Enter HelloWDMDispatchRoutine

"));


Irp->IoStatus.Status = STATUS_SUCCESS;


Irp->IoStatus.Information = 0;    // no bytes xfered


IoCompleteRequest( Irp, IO_NO_INCREMENT );


KdPrint(("Leave HelloWDMDispatchRoutine

"));


return STATUS_SUCCESS;


}



/


* 函数名称:HelloWDMUnload


* 功能描述:负责驱动程序的卸载操作


* 参数列表:


DriverObject:驱动对象


* 返回 值:返回状态


*/


#pragma PAGEDCODE


void HelloWDMUnload(IN PDRIVER_OBJECT DriverObject)


{


PAGED_CODE();


KdPrint(("Enter HelloWDMUnload

"));


KdPrint(("Leave HelloWDMUnload

"));


到此这篇windows驱动开发书籍(windows驱动开发前景)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!






























































































































































































































































版权声明


相关文章:

  • 驱动开发和嵌入式开发的差别(驱动和嵌入式有什么区别)2025-12-07 23:54:05
  • linux 微信小程序开发工具(linux有趣的小程序)2025-12-07 23:54:05
  • 行为驱动开发是什么(行为驱动开发指南)2025-12-07 23:54:05
  • 编程入门学什么语言(编程开始学什么语言)2025-12-07 23:54:05
  • goa电路维修视频(电工电器维修视频)2025-12-07 23:54:05
  • tldraw白板(lwte gold 白板软件)2025-12-07 23:54:05
  • csgo远程主机断开连接是什么意思(csgo远程连接中断)2025-12-07 23:54:05
  • 预训练语言模型和大语言模型区别(中文文本预训练语言模型plug)2025-12-07 23:54:05
  • 单片机程序100例汇编语言(单片机汇编语言编程100例)2025-12-07 23:54:05
  • 苹果开发者账号出售(苹果开发者账号出售多少钱)2025-12-07 23:54:05
  • 全屏图片