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

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

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

reactos:reactos操作系统实现(90)

来源: 发布时间:星期一, 2009年9月28日 浏览:0次 评论:0
  下面来分析IoAllocateDriverObjectExtension实现这个主要实现创建驱动扩展内存

#001  NTSTATUS
#002  NTAPI
#003  IoAllocateDriverObjectExtension(IN PDRIVER_OBJECT DriverObject,
#004                                  IN PVOID ClientIdenticationAddress,
#005                                  IN ULONG DriverObjectExtensionSize,
#006                                  OUT PVOID *DriverObjectExtension)
#007  {
#008      KIRQL OldIrql;
#009      PIO_CLIENT_EXTENSION DriverExtensions, NewDriverExtension;
#010      BOOLEAN Inserted = FALSE;
#011 


  首先假定分配扩展驱动对象失败

#012      /* Assume failure */
#013      *DriverObjectExtension = NULL;
#014 


  为扩展驱动对象分配新内存

#015      /* Allocate the extension */
#016      NewDriverExtension = ExAllocatePoolWithTag(NonPagedPool,
#017                                                 (IO_CLIENT_EXTENSION) +
#018                                                 DriverObjectExtensionSize,
#019                                                 TAG_DRIVER_EXTENSION);


  如果分配内存失败就直接返回

#020       (!NewDriverExtension)  STATUS_INSUFFICIENT_RESOURCES;
#021 


  清空扩展区对象内存空间

#022      /* Clear the extension for teh caller */
#023      RtlZeroMemory(NewDriverExtension,
#024                    (IO_CLIENT_EXTENSION) + DriverObjectExtensionSize);
#025


  获取DPC级别锁以便操作扩展对象

#026      /* Acqure lock */
#027      OldIrql = KeRaiseIrqlToDpcLevel;
#028 


  填写扩展对象

#029      /* Fill out the extension */
#030      NewDriverExtension->ClientIdenticationAddress = ClientIdenticationAddress;
#031 


  查找到当前扩展对象并判断是否有冲突

#032      /* Loop the current extensions */
#033      DriverExtensions = IoGetDrvObjExtension(DriverObject)->
#034                         ClientDriverExtension;
#035      while (DriverExtensions)
#036      {
#037          /* Check  the identier matches */
#038           (DriverExtensions->ClientIdenticationAddress 
#039              ClientIdenticationAddress)
#040          {


  这里发现有冲突ID就跳出循环返回失败

#041              /* We have a collision,  out */
#042              ;
#043          }
#044 
#045          /* Go to the next one */
#046          DriverExtensions = DriverExtensions->NextExtension;
#047      }
#048 


  如果没有冲突驱动扩展就创建个新扩展

#049      /* Check  we didn't collide */
#050       (!DriverExtensions)
#051      {
#052          /* Link this one in */
#053          NewDriverExtension->NextExtension =
#054              IoGetDrvObjExtension(DriverObject)->ClientDriverExtension;
#055          IoGetDrvObjExtension(DriverObject)->ClientDriverExtension =
#056              NewDriverExtension;


  标记已经插入到扩展

#057          Inserted = TRUE;
#058      }
#059 
#060      /* Release the lock */
#061      KeLowerIrql(OldIrql);
#062 


  如果没有插入到驱动扩展介绍说明有冲突因此删除的前分配内存

#063      /* Check  insertion failed */
#064       (!Inserted)
#065      {
#066          /* Free the entry and fail */
#067          ExFreePool(NewDriverExtension);
#068           STATUS_OBJECT_NAME_COLLISION;
#069      }
#070 




  返回驱动扩展开始位置

#071      /* Otherwise,  the poer */
#072      *DriverObjectExtension = NewDriverExtension + 1;
#073       STATUS_SUCCESS;
#074  }
#075 


  有了驱动扩展就可以填写用户编写驱动保存数据地方了比如驱动锁、列表、还有驱动要访问IO资源等等



标签:reactos
0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: