用Visual studio11在Windows8上開發核心枚舉註冊表

來源:互聯網
上載者:User

在Windows NT中,80386保護模式的“保護”比Windows 95中更堅固,這個“鍍金的籠子”更加結實,更加難以打破。在Windows 95中,至少應用程式I/O操作是不受限制的,而在Windows NT中,我們的應用程式連這點許可權都被剝奪了。在NT中幾乎不太可能進入真正的ring0層。 
在Windows NT中,存在三種Device Driver:

  1.“Virtual device Driver” (VDD)。通過VDD,16位應用程式,如DOS 和Win16應用程式可以訪問特定的I/O連接埠(注意,不是直接存取,而是要通過VDD來實現訪問)。

  2.“GDI Driver”,提供顯示和列印所需的GDI函數。

  3.“Kernel Mode Driver”,實現對特定硬體的操作,比如說CreateFile, CloseHandle (對於檔案對象而言), ReadFile, WriteFile, DeviceIoControl 等操作。“Kernel Mode Driver”還是Windows NT中唯一可以對硬體中斷和DMA進行操作的Driver。SCSI 小連接埠驅動和 網卡NDIS 驅動都是Kernel Mode Driver的一種特殊形式。

 

 

Visual studio11與Windows8帶來格外不同的新體驗

 

1.啟動Vs11

2.看見滿目的驅動開發模板

3.選擇一個驅動模式,有核心模式與使用者模式兩種的驅動

 

4.建立一個驅動程式,KMDF DriverMVP

 

5.我們選擇的是核心模式的驅動程式,下面是建立成功後的介面,分別是驅動程式本身,與驅動安裝包

6.按下F5,選擇驅動編譯,

 


插入下列代碼實現ring0層枚舉註冊表,請見程式碼分析

#include <ntddk.h>VOID DriverUnload(IN PDRIVER_OBJECT DriverObject){DbgPrint("Driver Unload");}//自訂枚舉註冊表索引值函數NTSTATUSMyRegEnumSubValue()  {UNICODE_STRING RegUnicodeString;HANDLE hRegister;ULONG ulSize;NTSTATUS ntStatus;UNICODE_STRING uniKeyName;PKEY_VALUE_FULL_INFORMATION  pvbi;PKEY_FULL_INFORMATION pfi;ULONG i;OBJECT_ATTRIBUTES objectAttributes;//初始化UNICODE_STRING字串RtlInitUnicodeString( &RegUnicodeString,L"\\REGISTRY\\MACHINE\\SOFTWARE\\MICROSOFT\\WINDOWS\\CURRENTVERSION\\RUN");//初始化objectAttributesInitializeObjectAttributes(&objectAttributes,        &RegUnicodeString,        OBJ_CASE_INSENSITIVE,//對大小寫敏感        NULL,        NULL );//開啟註冊表    ntStatus = ZwOpenKey( &hRegister,        KEY_ALL_ACCESS,        &objectAttributes);if (NT_SUCCESS(ntStatus)){KdPrint(("Open register successfully\n"));}ZwQueryKey(hRegister,KeyFullInformation,NULL,0,&ulSize);pfi=(PKEY_FULL_INFORMATION)ExAllocatePool(PagedPool,ulSize);//查詢註冊表ZwQueryKey(hRegister,KeyFullInformation,pfi,ulSize,&ulSize);//開始迴圈枚舉註冊表for(i=0;i<pfi->Values;i++){ZwEnumerateValueKey(hRegister,i,KeyValueFullInformation,NULL,0,&ulSize);pvbi =(PKEY_VALUE_FULL_INFORMATION )ExAllocatePool(PagedPool,ulSize);ZwEnumerateValueKey(hRegister,i,KeyValueFullInformation,pvbi,ulSize,&ulSize);uniKeyName.Length = uniKeyName.MaximumLength =(USHORT)pvbi->NameLength;uniKeyName.Buffer = pvbi->Name;//將索引值輸出DbgPrint("第%d個索引值名稱是:%wZ\n",i,&uniKeyName);//判斷索引值的類型if (pvbi->Type==REG_SZ){DbgPrint("索引值的類型是:REG_SZ\n");}else if (pvbi->Type==REG_MULTI_SZ){DbgPrint("索引值的類型是:REG_MULTI_SZ\n");}else if (pvbi->Type==REG_DWORD){KdPrint(("索引值的類型是:REG_DWORD\n"));}else if (pvbi->Type==REG_BINARY){KdPrint(("索引值的類型是:REG_BINARY\n"));}ExFreePool(pvbi);}ExFreePool(pfi);ZwClose(hRegister);return STATUS_SUCCESS;}NTSTATUS DriverEntry( IN PDRIVER_OBJECT  DriverObject, IN PUNICODE_STRING  RegistryPath     ){MyRegEnumSubValue();DriverObject->DriverUnload = DriverUnload;return STATUS_SUCCESS;}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

Tags Index: