Программирование драйверов Windows

       

Функции RtlXxx прямого доступа к Системному Реестру


RtlCheckRegistryKey возвращает STATUS_SUCCESS в том случае, если указанный вложенный подраздел существует внутри подраздела, описанного первым параметром вызова. Первый параметр указывается как одно из значений RTL_REGISTRY_Xxx. Например, раздел \Registry\Machine\System\CurrentControlSet\Services описывается значением RTL_REGISTRY_SERVICES, а раздел \Registry\User\CurrentUser описывается значением RTL_REGISTRY_USER (см. заголовочные файлы ntddk.h или wdm.h).

RtlCreateRegistryKey создает подраздел внутри подраздела Реестра, указанного вторым параметром, который работает так же, как и в описанной выше функции RtlCheckRegistryKey.

RtlQueryRegistryValues позволяет одним вызовом получить значения нескольких параметров из всего поддерева указанного подраздела Реестра. При обнаружении требуемого параметра происходит вызов callback процедуры QueryRoutine, предоставляемой драйвером. Тем не менее, во всем многообразии примеров DDK нет ни одного случая использования этого вызова с callback процедурой QueryRoutine. На практике, вызов RtlQueryRegistryValues выполняется с первым параметром, имеющим в своем составе флаг RTL_QUERY_REGISTRY_DIRECT, при котором callback процедура не используется.

RtlWriteRegistryValue производит запись значения параметра Системного Реестра. Попутно может быть создан один вложенный подраздел, см. пример ниже.

UNICODE_STRING newParameterUnicodeTextValue; RtlInitUnicodeString( &newParameterUnicodeTextValue, L"Example text parameter 1");

NTSTATUS status = RtlWriteRegistryValue( RTL_REGISTRY_SERVICES, L"Example1\\InnerKey", L"NewParameter", // можно даже L"Вложенный Раздел" REG_SZ, newParameterUnicodeTextValue.Buffer, sizeof(WCHAR)*( wcslen(newParameterUnicodeTextValue.Buffer)+1) ); if ( !NT_SUCCESS( status ) ) { #if DBG DbgPrint("RtlWriteRegistryValue call is unsuccessful."); #endif }

Первый параметр RTL_REGISTRY_SERVICES указывает на то, что действия будут выполняться в разделе \Registry\Machine\System\CurrentControlSet\Services, или, в общепринятых терминах, HKLM\SYSTEM\CurrentControlSet\Services.
В нем должен существовать вложенный подраздел \Example1. Тогда возможны два варианта: в подраздел \Example1 вложен существующий подраздел \InnerKey, либо раздел \InnerKey не существует (и тогда он будет создан). В результате вызова получится подраздел HKLM\SYSTEM\CurrentControlSet\Services\Example1\InnerKey, в котором будет присутствовать строковый параметр NewParameter со значением "Example text parameter 1".

В том случае, если не существует не только подраздел \InnerKey, но и подраздел \Example1, вызов RtlWriteRegistryValue завершится неудачей.

В том случае, если все указанные подразделы присутствуют, и параметр NewParameter уже имеет какое-то значение, то в результате последовательности действий, как в описанном выше примере, в Системный Реестр будет записано новое значение, то есть "Example text parameter 1" .

RtlDeleteRegistryVaIue удаляет параметр из указанного подраздела, например:

status = RtlDeleteRegistryValue( RTL_REGISTRY_SERVICES, L"Example1\\InnerKey ", L"NewParameter" ); if( !NT_SUCCESS(x_status ) ) { #if DBG DbgPrint("RtlDeleteRegistryValue call is unsuccessful."); #endif }

В результате, в HKLM\SYSTEM\CurrentControlSet\Services\Example1\InnerKey исчезнет параметр NewParameter.


Содержание раздела