reactos操作系统实现(90)

下面来分析函数IoAllocateDriverObjectExtension的实现,这个函数主要实现创建驱动程序扩展内存。

#001 NTSTATUS

#002 NTAPI

#003 IoAllocateDriverObjectExtension(IN PDRIVER_OBJECT DriverObject,

#004 IN PVOID ClientIdentificationAddress,

#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 sizeof(IO_CLIENT_EXTENSION) +

#018 DriverObjectExtensionSize,

#019 TAG_DRIVER_EXTENSION);

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

#020 if (!NewDriverExtension) return STATUS_INSUFFICIENT_RESOURCES;

#021

清空扩展区对象的内存空间。

#022 /* Clear the extension for teh caller */

#023 RtlZeroMemory(NewDriverExtension,

#024 sizeof(IO_CLIENT_EXTENSION) + DriverObjectExtensionSize);

#025

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

#026 /* Acqure lock */

#027 OldIrql = KeRaiseIrqlToDpcLevel();

#028

填写扩展对象。

#029 /* Fill out the extension */

#030 NewDriverExtension->ClientIdentificationAddress = ClientIdentificationAddress;

#031

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

#032 /* Loop the current extensions */

#033 DriverExtensions = IoGetDrvObjExtension(DriverObject)->

#034 ClientDriverExtension;

#035 while (DriverExtensions)

#036 {

#037 /* Check if the identifier matches */

#038 if (DriverExtensions->ClientIdentificationAddress ==

#039 ClientIdentificationAddress)

#040 {

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

#041 /* We have a collision, break out */

#042 break;

#043 }

#044

#045 /* Go to the next one */

#046 DriverExtensions = DriverExtensions->NextExtension;

#047 }

#048

如果没有冲突的驱动程序扩展,就创建一个新的扩展。

#049 /* Check if we didn't collide */

#050 if (!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 if insertion failed */

#064 if (!Inserted)

#065 {

#066 /* Free the entry and fail */

#067 ExFreePool(NewDriverExtension);

#068 return STATUS_OBJECT_NAME_COLLISION;

#069 }

#070

返回驱动程序扩展的开始位置。

#071 /* Otherwise, return the pointer */

#072 *DriverObjectExtension = NewDriverExtension + 1;

#073 return STATUS_SUCCESS;

#074 }

#075

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值