2005年05月08日

ドライバからのレジストリアクセス

 Windowsでは、設定情報などの重要情報は、レジストリデータベースに記録される。

■レジストリキーのオープン

 レジストリキーを開くとき、まずはOBJECT_ATTRIBUTES構造体を初期化しなければならない。初期化はInitializeObjectAttributesマクロを利用することができる。

NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,
 PUNICODE_STRING RegistryPath)
{
 ...
 OBJECT_ATTRIBUTES oa;

 InitializeObjectAttributes(&oa, RegistryPath, 0, NULL, NULL);
 HANDLE key;
 status = ZwOpenKey(&hkey, KEY_READ, &oa);
 if (NT_SUCCESS(status)) {
  ZwClose(hkey);
 }
}

■レジストリキーの読み書き

 以下は、ドライバのサービスキーのImagePath値を取得するコード例である。

UNICODE_STRING valname;
RtlInitUnicodeString(&valname, L"ImagePath");
size = 0;
status = ZwQueryValueKey(hkey, &valname, KeyValuePartialInformation,
  NULL, 0, &size);
if (status == STATUS_OBJECT_NAME_NOT_FOUND || size == 0)
 <エラー処理>;
PKEY_VALUE_PARTIAL_INFORMATION vpip = (PKEY_VALUE_PARTIAL_INFORMATION)
 ExAllocatePool(PagedPool, size);
if (!vpip)
 <エラー処理>;
status = ZwQueryValueKey(hkey, &valname, KeyValuePartialInformation,
 vpip, size, &size);
if (!NT_SUCCESS(status))
 <エラー処理>;

ExFreePool(vpip);

 レジストリキーの書き込みでは、関数ZwSetValueKeyが使われる。

RtlInitUnicodeString(&valname, L"TheAnswer");
ULONG value = 42;
ZwSetValueKey(hkey, &valname, 0, REG_DWORD, &value, sizeof(value));

■サブキーの削除

 レジストリサブキーの削除には、関数RtlDeleteRegistryValueかZwDeleteKeyが使われる。

■サブキーの列挙

 サブキーを列挙するには、まずZwQueryKeyで、サブキーの情報を集める必要がある。

ULONG size;
ZwQueryKey(hkey, KeyFullInformation, NULL, 0, &size);
PKEY_FULL_INFORMATION fip = (PKEY_FULL_INFORMATION)
 ExAllocatePool(PagedPool, size);
ZwQueryKey(hkey, KeyFullInformation, bip, size, &size);
for (ULONG i = 0; i < fip->SubKeys; ++i) {
 ZwEnumerateKey(hkey, i, KeyBasicInformation, NULL, 0, &size);
 PKEY_BASIC_INFORMATION bip = (PKEY_BASIC_INFORMATION)
  ExAllocatePool(PagedPool, size);
 ZwEnumerateKey(hkey, i, KeyBasicInformation, bip, size, &size);
 Nameを使って何かをする>
 ExFreePool(bip);
}




参考文献

1. Microsoft WDMプログラミング―WindowsXP対応
2.WindowsXPフィルタドライバプログラミング 入門と実践
3. WDMデバイスドライバプログラミング完全ガイド〈上〉
4. WDMデバイスドライバプログラミング完全ガイド〈下〉

blackcat_1973 at 23:51│Comments(0)TrackBack(0)ソフトウェア開発 

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
Profile
blackcat
スポンサー
訪問者数

QRコード
QRコード