reactos:reactos操作系统实现(89)来源: 发布时间:星期一, 2009年9月28日 浏览:0次 评论:0
键盘驱动是个最基本驱动通过学习这个简单而实用驱动来了解ReactOS驱动结构驱动运行流程在前面I/O管理器分析里已经知道操作系统加载驱动过程也了解了驱动在系统里是以驱动对象来管理也就是通过DRIVER_OBJECT对象来表示个驱动 键盘驱动是个输入输出设备但在ReactOS驱动分类里是分在输入设备类这个驱动源所在目录是在reactos\drivers\input\i8042prt目录在分析这个驱动还是采用从运行过程来分析它流程那么驱动加载运行入口点在那里呢?这是个最先要解决问题其实每个驱动都固定有个名称DriverEntry因此操作系统加载驱动时就会找到这个入口然后就调这个就可以把驱动和操作系统内核联系在起了就可以驱动相关功能了在内核I/O管理器里是这样这个如下: #148 DPRINT("Calling driver entrypo at %p\n", InitializationFunction); 通过内核就知道DriverEntry应具备两个参数第个参数是驱动对象这是内核表示个驱动对象第 2个参数是驱动文件在注册表里路径因此驱动入口就写成下面这样: #001 NTSTATUS NTAPI IoAllocateDriverObjectExtension来分配键盘驱动对象内存以便保存更多扩展属性 #022 Status = IoAllocateDriverObjectExtension( 化扩展分区内存 #032 RtlZeroMemory(DriverExtension, (I8042_DRIVER_EXTENSION)); 化扩展设备列表 #033 KeInitializeSpinLock(&DriverExtension->Port.SpinLock); 拷贝注册表路径 #037 Status = DuplicateUnicodeString( 从注册表里获取驱动资源分配 #047 Status = ReadRegistryEntries(RegistryPath, &DriverExtension->Port.Settings); 添加即插即用以便创建这个驱动支持设备 #054 DriverObject->DriverExtension->AddDevice = i8042AddDevice; 指向驱动中处理串行I/O请求I/O管理器自动为驱动串行化多个I/O请求 #055 DriverObject->DriverStartIo = i8042StartIo; 缺省地化IRP消息为IrpStub处理 #057 for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i) 指定IRP消息IRP_MJ_CREATE处理i8042Create #060 DriverObject->MajorFunction[IRP_MJ_CREATE] = i8042Create; 清除分配资源i8042Cleanup #061 DriverObject->MajorFunction[IRP_MJ_CLEANUP] = i8042Cleanup; 指定关闭设备时i8042Close #062 DriverObject->MajorFunction[IRP_MJ_CLOSE] = i8042Close; 通过IO操作i8042DeviceControl #063 DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = i8042DeviceControl; 指定中断处理i8042InternalDeviceControl #064 DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = i8042InternalDeviceControl; 指定即插即用时响应i8042Pnp #065 DriverObject->MajorFunction[IRP_MJ_PNP] = i8042Pnp; 判断驱动是否化安装时运行如果是化时就i8042AddLegacyKeyboard处理 #067 (IsFirstStageSetup) 0
相关文章读者评论发表评论 |
|