[registry] Add WvlRegFetchDword function
authorShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Fri, 31 Dec 2010 11:37:07 +0000 (06:37 -0500)
committerShao Miller <Shao.Miller@yrdsb.edu.on.ca>
Fri, 31 Dec 2010 11:37:07 +0000 (06:37 -0500)
src/include/registry.h
src/winvblock/registry.c

index cc40177..e371a4b 100644 (file)
@@ -45,6 +45,11 @@ extern winvblock__lib_func NTSTATUS STDCALL WvlRegFetchMultiSz(
     LPCWSTR,
     LPWSTR **
   );
+extern winvblock__lib_func NTSTATUS STDCALL WvlRegFetchDword(
+    IN HANDLE,
+    IN LPCWSTR,
+    OUT winvblock__uint32 *
+  );
 extern winvblock__lib_func NTSTATUS STDCALL WvlRegStoreSz(
     HANDLE,
     LPCWSTR,
index 06cf6ff..26f9d44 100644 (file)
@@ -268,6 +268,52 @@ winvblock__lib_func NTSTATUS STDCALL WvlRegFetchMultiSz(
     return status;
   }
 
+/**
+ * Fetch registry DWORD value.
+ *
+ * @v RegKey            Handle for the registry key with the value.
+ * @v ValueName         Registry value name.
+ * @v Value             DWORD value to fill in.
+ * @ret NTSTATUS        The status of the operation.
+ */
+winvblock__lib_func NTSTATUS STDCALL WvlRegFetchDword(
+    IN HANDLE RegKey,
+    IN LPCWSTR ValueName,
+    OUT winvblock__uint32 * Value
+  ) {
+    PKEY_VALUE_PARTIAL_INFORMATION kvi;
+    NTSTATUS status;
+
+    if (!Value) {
+        DBG("No DWORD provided.\n");
+        status = STATUS_INVALID_PARAMETER;
+        goto err_value;
+      }
+
+    /* Fetch key value information. */
+    status = WvlRegFetchKvi(RegKey, ValueName, &kvi);
+    if (!NT_SUCCESS(status))
+      goto err_fetchkvi;
+
+    /* Copy the value. */
+    if (kvi->DataLength != sizeof *Value) {
+        DBG("Registry value is not a DWORD.");
+        status = STATUS_INVALID_PARAMETER;
+        goto err_datalen;
+      }
+
+    RtlCopyMemory(Value, kvi->Data, kvi->DataLength);
+
+    err_datalen:
+
+    wv_free(kvi);
+    err_fetchkvi:
+
+    err_value:
+
+    return status;
+  }
+
 /**
  * Store registry string value.
  *