流程:

  1. 创建OBJECT_ATTRIBUTES对象,InitializeObjectAttributes初始化对象
  2. 通过ZwOpenKey打开注册表对象
  3. 通过ZwQueryValueKey查询指定的注册表对象的值
  1. #include <ntddk.h>
  2. VOID UnloadDriver(PDRIVER_OBJECT pDriver)
  3. {
  4. DbgPrint("卸载成功\n");
  5. }
  6. NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pRegPath)
  7. {
  8. NTSTATUS status = NULL;
  9. HANDLE hKey = NULL;
  10. OBJECT_ATTRIBUTES oKey;
  11. UNICODE_STRING uKeyname = RTL_CONSTANT_STRING(L"\\Registry\\MACHINE\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion");
  12. UNICODE_STRING uKeyvalue = RTL_CONSTANT_STRING(L"DigitalProductId");
  13. KEY_VALUE_PARTIAL_INFORMATION getkey = { 0 };
  14. ULONG uResultLen ;
  15. InitializeObjectAttributes(&oKey,
  16. &uKeyname,
  17. OBJ_OPENIF | OBJ_CASE_INSENSITIVE,
  18. NULL,
  19. NULL);
  20. status = ZwOpenKey(
  21. &hKey,
  22. KEY_ALL_ACCESS,
  23. &oKey);
  24. if (!NT_SUCCESS(status))
  25. {
  26. DbgPrint("打开注册表失败,错误码%d",status);
  27. return STATUS_SUCCESS;
  28. }
  29. status = ZwQueryValueKey(
  30. hKey,
  31. &uKeyvalue,
  32. KeyValuePartialInformation,
  33. &getkey ,
  34. sizeof(KEY_VALUE_PARTIAL_INFORMATION),
  35. &uResultLen
  36. );
  37. if (!NT_SUCCESS(status))
  38. {
  39. DbgPrint("查询失败,错误码是:%d", status);
  40. }
  41. DbgPrint("查询到的值得长度为:%d", getkey.DataLength);
  42. DbgPrint("驱动加载成功\n");
  43. pDriver->DriverUnload = UnloadDriver;
  44. }