欢迎来到天天文库
浏览记录
ID:10982476
大小:50.50 KB
页数:2页
时间:2018-07-09
《基于windows2000开发wdm设备驱动程序的方法论文》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、基于Windows2000开发WDM设备驱动程序的方法论文摘要:本文介绍了1_DEVICE_EXTENSION),NULL,//NoNameFILE_DEVICE_UNKNOinorFunction=IrpStack-MinorFunction;if(MinorFunction==IRP_MN_REMOVE_DEVICE){DebugPrint("PnPRemoveDevice");//disabledeviceinterfaceIoSetDeviceInterfaceState(dx-ifSymLinkName,FALSE);RtlFreeUnicodeString
2、(dx-ifSymLinkName);//unattachfromstack从设备栈脱离if(dx-NextStackDevice)IoDetachDevice(dx-NextStackDevice);//deleteourfdo删除设备IoDeleteDevice(fdo);}CreateFileIRP_MJ_CreateJ_J_CLOSEDeviceIoControlMJ_DEVICEIOCONTROLReadFileMJ_CLOSE所有的分发例程都有相同的函数原型,均需传递一个设备对象的指针和IRP,IRP由IRP首部和一系列的栈单元组成,每个栈单元是一个IO_
3、STACK_LOCATION结构,首部和栈单元指出要作的动作,栈中有主要的重要参数如MajorFunction和MinorFunction,每个驱动只认识一个栈单元。2.7即插即用驱动必须有AddDevice例程并处理各种PnPIRP:IRP_MN_START_DEVICE分配资源并启动一个设备。IRP_MN_STOP_DEVICE停止设备进行资源重新分配。3.具体实现同许多应用程序一样,驱动程序是PE格式的,但是它却没有ain或main这样的入口,取而代之的是DriverEntry:NTSTATUSDriverEntry(INPDRIVER_OBJECTDriver
4、Object,//不同于前面的PDOINPUNICODE_STRINGRegistryPath){DriverObject-DriverExtension-AddDevice=AddDevice;//DriverExtension中存放着驱动程序扩展信息,包括设备所需要的硬件资源等。DriverObject-MajorFunctionIRP_MJ_CREATE=RequestCreate;DriverObject-MajorFunctionIRP_MJ_CLOSE=RequestClose;DriverObject-MajorFunctionIRP_MJ_DEVICE
5、_CONTROL=RequestControl;DriverObject-MajorFunctionIRP_MJ_PNP=RequestPnp;returnSTATUS_SUCCESS;}----在DriverEntry驱动程序要向操作系统登记并注册一些消息处理器,而且还要指明是否对驱动程序输入输出的数据进行缓冲,另外还要我们提供一个AddDevice例程来把驱动程序添加到驱动程序堆栈中。其中,IRP_MJ_XXXXX为驱动程序所收到的系统消息,RequestXXXXX为相应的消息处理函数。在客户端程序中,我们一般要采用DeviceIoControl通过自定义的控制码
6、与驱动程序通信(在VxD中大多也采用这种方式)。看看驱动程序所收到的系统消息,我们不难发现当用户调用DeviceIoControl时操作系统就会向驱动程序发出一条IRP_MJ_DEVICE_CONTROL消息,以触发RequestControl消息处理函数。NTSTATUSRequestControl(INPDEVICE_OBJECTDeviceObject,.freeleters.DeviceIoControl.IoControlCode;//取得控制码InputLength=IrpStack-Parameters.DeviceIoControl.InputBuff
7、erLength;//取输入缓冲区大小OutputLength=IrpStack-Parameters.DeviceIoControl.OutputBufferLength;//取输出缓冲区大小s./n");//向调试器输出字符串status=STATUS_SUCCESS;//置返回值break;default:status=STATUS_INVALID_DEVICE_REQUEST;//输入的控制码不支持}returnpleteRequest(Irp,status,0);//调用pleteRequest通知操作系统完成IRP操作立刻注册,享受三天的
此文档下载收益归作者所有