加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

reactos操作系统实现(74)

发布时间:2020-12-15 05:00:58 所属栏目:百科 来源:网络整理
导读:很多驱动程序,都是通过硬件检测时写到注册表里保存起来的,因此读取注册表里键值列表,就知道有多少设备需要需要加载了。下面就从注册表里创建一组驱动程序列表,实现的代码如下: #001 NTSTATUS INIT_FUNCTION #002 IoCreateDriverList(VOID) #003 { #004

很多驱动程序,都是通过硬件检测时写到注册表里保存起来的,因此读取注册表里键值列表,就知道有多少设备需要需要加载了。下面就从注册表里创建一组驱动程序列表,实现的代码如下:

#001 NTSTATUS INIT_FUNCTION

#002 IoCreateDriverList(VOID)

#003 {

#004 RTL_QUERY_REGISTRY_TABLE QueryTable[2];

#005 PKEY_BASIC_INFORMATION KeyInfo = NULL;

#006 OBJECT_ATTRIBUTES ObjectAttributes;

注册表里的键。

#007 UNICODE_STRING ServicesKeyName = RTL_CONSTANT_STRING(L"//Registry//Machine//System//CurrentControlSet//Services");

#008 UNICODE_STRING SubKeyName;

#009 HANDLE KeyHandle;

#010 NTSTATUS Status;

#011 ULONG Index;

#012

#013 ULONG KeyInfoLength = 0;

#014 ULONG ReturnedLength;

#015

#016 DPRINT("IoCreateDriverList() called/n");

#017

初始化全局变量的驱动程序组和服务列表。

#018 /* Initialize basic variables */

#019 InitializeListHead(&GroupListHead);

#020 InitializeListHead(&ServiceListHead);

#021

清空查询表的数据。

#022 /* Build group order list */

#023 RtlZeroMemory(&QueryTable,

#024 sizeof(QueryTable));

#025

设置查询的名称。

#026 QueryTable[0].Name = L"List";

设置查询的回调函数。

#027 QueryTable[0].QueryRoutine = IopCreateGroupListEntry;

#028

建立组列表。

#029 Status = RtlQueryRegistryValues(RTL_REGISTRY_CONTROL,

#030 L"ServiceGroupOrder",

#031 QueryTable,

#032 NULL,

#033 NULL);

#034 if (!NT_SUCCESS(Status))

#035 return(Status);

#036

枚举服务和创建服务列表。

#037 /* Enumerate services and create the service list */

#038 InitializeObjectAttributes(&ObjectAttributes,

#039 &ServicesKeyName,

#040 OBJ_CASE_INSENSITIVE,

#041 NULL,

#042 NULL);

#043

打开注册表的键。

#044 Status = ZwOpenKey(&KeyHandle,

#045 KEY_ENUMERATE_SUB_KEYS,

#046 &ObjectAttributes);

#047 if (!NT_SUCCESS(Status))

#048 {

#049 return(Status);

#050 }

#051

#052 KeyInfoLength = sizeof(KEY_BASIC_INFORMATION) + MAX_PATH * sizeof(WCHAR);

#053 KeyInfo = ExAllocatePool(NonPagedPool,KeyInfoLength);

#054 if (KeyInfo == NULL)

#055 {

#056 ZwClose(KeyHandle);

#057 return(STATUS_INSUFFICIENT_RESOURCES);

#058 }

#059

#060 Index = 0;

循环地枚举所有注册表里的键。

#061 while (TRUE)

#062 {

#063 Status = ZwEnumerateKey(KeyHandle,

#064 Index,

#065 KeyBasicInformation,

#066 KeyInfo,

#067 KeyInfoLength,

#068 &ReturnedLength);

#069 if (NT_SUCCESS(Status))

#070 {

#071 if (KeyInfo->NameLength < MAX_PATH * sizeof(WCHAR))

#072 {

#073

#074 SubKeyName.Length = (USHORT)KeyInfo->NameLength;

#075 SubKeyName.MaximumLength = (USHORT)KeyInfo->NameLength + sizeof(WCHAR);

#076 SubKeyName.Buffer = KeyInfo->Name;

#077 SubKeyName.Buffer[SubKeyName.Length / sizeof(WCHAR)] = 0;

#078

#079 DPRINT("KeyName: '%wZ'/n",&SubKeyName);

每个子键都创建一个入口,保存到全局变量ServiceListHead里。

#080 IopCreateServiceListEntry(&SubKeyName);

#081 }

#082 }

#083

#084 if (!NT_SUCCESS(Status))

#085 break;

#086

#087 Index++;

#088 }

#089

#090 ExFreePool(KeyInfo);

#091 ZwClose(KeyHandle);

#092

#093 DPRINT("IoCreateDriverList() done/n");

#094

#095 return(STATUS_SUCCESS);

#096 }

#097

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读