+static ULONG
+GetRegInt(
+ IN PCWSTR KeyName,
+ IN PCWSTR ValueName,
+ IN ULONG DefaultValue)
+{
+ NTSTATUS Status;
+ ULONG Value = DefaultValue;
+ UNICODE_STRING String;
+ OBJECT_ATTRIBUTES ObjectAttributes;
+ HANDLE KeyHandle;
+ ULONG ResultLength;
+ UCHAR ValueBuffer[sizeof(KEY_VALUE_PARTIAL_INFORMATION) + sizeof(ULONG)];
+ PKEY_VALUE_PARTIAL_INFORMATION ValueInfo = (PKEY_VALUE_PARTIAL_INFORMATION)ValueBuffer;
+
+ RtlInitUnicodeString(&String, KeyName);
+ InitializeObjectAttributes(&ObjectAttributes,
+ &String,
+ OBJ_CASE_INSENSITIVE,
+ NULL,
+ NULL);
+
+ /* Open the registry key */
+ Status = NtOpenKey(&KeyHandle, KEY_READ, &ObjectAttributes);
+ if (NT_SUCCESS(Status))
+ {
+ /* Query the value */
+ RtlInitUnicodeString(&String, ValueName);
+ Status = NtQueryValueKey(KeyHandle,
+ &String,
+ KeyValuePartialInformation,
+ ValueInfo,
+ sizeof(ValueBuffer),
+ &ResultLength);
+
+ /* Close the registry key */
+ NtClose(KeyHandle);
+
+ if (NT_SUCCESS(Status) && (ValueInfo->Type == REG_DWORD))
+ {
+ /* Directly retrieve the data */
+ Value = *(PULONG)ValueInfo->Data;
+ }
+ }
+
+ return Value;
+}
+