Поделиться через


Рутинные подпрограммы библиотеки реестра Run-Time

Для управления записями реестра драйверы могут вызывать процедуры RtlXxxRegistryXxx, которые предоставляют более простой интерфейс, чем процедуры ZwXxxKey. При этом драйверу не требуется открывать и закрывать дескрипторы; Вместо этого драйвер ссылается на ключи по имени.

Параметры RelativeTo и Path передаются каждой подпрограмме RtlXxxRegistryXxx . Если RelativeTo является RTL_REGISTRY_ABSOLUTE, Путь указывает полный путь ключа, начиная с корня \Registry. Если RelativeTo равно RTL_REGISTRY_HANDLE, Path действительно является открытым дескриптором. Дополнительные значения RTL_REGISTRY_XXX дляRelativeTo указывают пути общих корней для ключа; В таких случаях Path указывает путь относительно этого корня. Например, RTL_REGISTRY_USER требуется, чтобы путь был относительно параметров реестра текущего пользователя. (Это значение эквивалентно указанию HKEY_CURRENT_USER в приложении пользовательского режима.) Описание всех значений RTL_REGISTRY_XXX см. в разделе RtlCheckRegistryKey.

В следующей таблице перечислены операции, которые драйверы могут выполнять, вызывая подпрограммы RtlXxxRegistryXxx.

Операция Подпрограмма RtlXxx RegistryXxx для вызова.

Создать ключ реестра

RtlCreateRegistryKey

Проверьте, существует ли ключ реестра

RtlCheckRegistryKey

Проверка одного или нескольких значений раздела реестра

RtlQueryRegistryValues

Записать значение ключа реестра

RtlWriteRegistryValue

Удалите значение ключа реестра

RtlDeleteRegistryValue

В следующем примере кода показано, как задать ValueName для \Registry\Machine\System\KeyName значение типа ULONG, равное 0xFF. Сравните этот пример с соответствующим в разделе "Процедуры объектов ключа реестра".

NTSTATUS status;
ULONG data = 0xFF;

status = RtlWriteRegistryValue(RTL_REGISTRY_ABSOLUTE,
                               (PWCSTR)L"\\Registry\\Machine\\System\\KeyName",
                               (PWCSTR)L"ValueName",
                               REG_DWORD,
                               &data,
                               sizeof(ULONG));

Несмотря на то, что при использовании рутин RtlXxxRegistryXxx вместо рутин ZwXxxKey последние необходимы для выполнения некоторых операций. Например, нет подпрограммы RtlXxxRegistryXxx , соответствующей ZwEnumerateKey.

Если вы выполняете несколько операций с одним и тем же ключом, подпрограммы ZwXxxKey работают более эффективно — вы можете использовать один и тот же открытый дескриптор для каждой операции. В отличие от этого, подпрограммы RtlXxxRegistryXxx открывают и закрывают новый дескриптор для каждой операции.