专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »编程综合 » reactos:reactos操作系统实现(89) »正文

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);
#149      Status = (*InitializationFunction)(DriverObject, RegistryPath);


  通过内核就知道DriverEntry应具备两个参数个参数是驱动对象这是内核表示个驱动对象第 2个参数是驱动文件在注册表里路径因此驱动入口就写成下面这样:

#001  NTSTATUS NTAPI
#002  DriverEntry(
#003     IN PDRIVER_OBJECT DriverObject,
#004     IN PUNICODE_STRING RegistryPath)
#005  {
#006     PI8042_DRIVER_EXTENSION DriverExtension;
#007     ULONG i;
#008     NTSTATUS Status;
#009 
#010     /* ROS Hack: ideally, we shouldn't have to initialize debug level this way,
#011        but since the only way is to change it via KDBG, it's better to leave
#012        it here too. */
#013  # 0
#014     DbgSetDebugFilterState(
#015         DPFLTR_I8042PRT_ID,
#016         (1 << DPFLTR_ERROR_LEVEL) | (1 << DPFLTR_WARNING_LEVEL) |
#017         (1 << DPFLTR_TRACE_LEVEL) /*| (1 << DPFLTR_INFO_LEVEL)*/ | DPFLTR_MASK,
#018         TRUE);
#019  #end
#020    
#021 


  IoAllocateDriverObjectExtension来分配键盘驱动对象内存以便保存更多扩展属性

#022     Status = IoAllocateDriverObjectExtension(
#023         DriverObject,
#024         DriverObject,
#025         (I8042_DRIVER_EXTENSION),
#026         (PVOID*)&DriverExtension);
#027      (!NT_SUCCESS(Status))
#028     {
#029         WARN_(I8042PRT, "IoAllocateDriverObjectExtension failed with status 0x%08lx\n", Status);
#030          Status;
#031     }


  化扩展分区内存

#032     RtlZeroMemory(DriverExtension, (I8042_DRIVER_EXTENSION));

  化扩展设备列表

#033     KeInitializeSpinLock(&DriverExtension->Port.SpinLock);
#034     InitializeListHead(&DriverExtension->DeviceListHead);
#035     KeInitializeSpinLock(&DriverExtension->DeviceListLock);
#036 


  拷贝注册表路径

#037     Status = DuplicateUnicodeString(
#038         RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE,
#039         RegistryPath,
#040         &DriverExtension->RegistryPath);
#041      (!NT_SUCCESS(Status))
#042     {
#043         WARN_(I8042PRT, "DuplicateUnicodeString failed with status 0x%08lx\n", Status);
#044          Status;
#045     }
#046 


  从注册表里获取驱动资源分配

#047     Status = ReadRegistryEntries(RegistryPath, &DriverExtension->Port.Settings);
#048      (!NT_SUCCESS(Status))
#049     {
#050         WARN_(I8042PRT, "ReadRegistryEntries failed with status 0x%08lx\n", Status);
#051          Status;
#052     }
#053


  添加即插即用以便创建这个驱动支持设备

#054     DriverObject->DriverExtension->AddDevice = i8042AddDevice;

  指向驱动中处理串行I/O请求I/O管理器自动为驱动串行化多个I/O请求

#055     DriverObject->DriverStartIo = i8042StartIo;
#056


  缺省地化IRP消息为IrpStub处理

#057     for (i = 0; i <= IRP_MJ_MAXIMUM_FUNCTION; i)
#058         DriverObject->MajorFunction[i] = IrpStub;
#059 


  指定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;
#066 


  判断驱动是否化安装时运行如果是化时就i8042AddLegacyKeyboard处理

#067      (IsFirstStageSetup)
#068          i8042AddLegacyKeyboard(DriverObject, RegistryPath);
#069 
#070      STATUS_SUCCESS;
#071  }




标签:reactos
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: