[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[win-pv-devel] [PATCH] Added a function called from DriverEntry where we can safely read registry keys and convert strings at PASSIVE_LEVEL



The MSDN documentation for various registry key access and string
conversion functions requires the caller to be at
IRQL = PASSIVE_LEVEL. One of the reasons for this is that the string
conversion tables used by functions such as
RtlAnsiStringToUnicodeString are stored in paged pool memory. Both the
page fault handler and the process scheduler
run at IRQL = DISPATCH_LEVEL, therefore you must not touch memory at
DISPATCH_LEVEL that could be paged out. A process
running at DISPATCH_LEVEL cannot be preempted for the page fault handler
to run.

To aid Static Driver Verifier code analysis and inform developers, I have
added SAL annotations that indicate
IRQL = PASSIVE_LEVEL is required on certain registry access functions.

Signed-off-by: Eric Mackay <mackayem@xxxxxxxxxx>
---
 src/xenvbd/driver.c   |  86 +++++++++++++++++++++++++
 src/xenvbd/driver.h   |  45 ++++++++++++++
 src/xenvbd/frontend.c | 169 ++++++++++++++++++++++++++++++++++----------------
 src/xenvbd/registry.c |  26 ++++++++
 src/xenvbd/registry.h |  25 +++++++-
 5 files changed, 296 insertions(+), 55 deletions(-)

diff --git a/src/xenvbd/driver.c b/src/xenvbd/driver.c
index bb1954f..0c9275b 100644
--- a/src/xenvbd/driver.c
+++ b/src/xenvbd/driver.c
@@ -58,6 +58,8 @@ XENVBD_PARAMETERS   DriverParameters;
 
 #define XENVBD_POOL_TAG     'dbvX'
 
+XENVBD_REGISTRY_OVERRIDE DriverFeatureOverrides[NumberOfFeatures] = { 0 };
+
 static DECLSPEC_NOINLINE VOID
 __DriverParseOption(
     IN  const CHAR  *Key,
@@ -301,6 +303,88 @@ DriverFormatFree(
         __FreePoolWithTag(Buffer, XENVBD_POOL_TAG);
 }
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
+VOID
+DriverInitializeOverrides(
+    )
+{
+    ULONG                       Value;
+    NTSTATUS                    Status;
+    PCHAR                       FeatureName;
+    XENVBD_FEATURE              Feature; 
+    
+    struct INIT_OVERRIDES {
+        PCHAR Name;
+        XENVBD_FEATURE Feature;
+    }  Init[] = {
+        { "removable" , FeatureRemovable },
+        { "feature-persistent", FeaturePersistent },
+        { "feature-max-indirect-segments", FeatureMaxIndirectSegments },
+        { "feature-barrier", FeatureBarrier },
+        { "feature-flush-cache", FeatureFlushCache },
+        { "feature-discard", FeatureDiscard },
+        { "discard-enable", FeatureDiscardEnable },
+        { "discard-secure", FeatureDiscardSecure },
+        { "discard-alignment", FeatureDiscardAlignment },
+        { "discard-granularity", FeatureDiscardGranularity }
+    };
+
+    for (ULONG Index = 0; Index < ARRAYSIZE(Init); Index++) {
+        Feature = Init[Index].Feature;
+        FeatureName = Init[Index].Name;
+        DriverFeatureOverrides[(ULONG)Feature].Name = FeatureName;
+        DriverFeatureOverrides[(ULONG)Feature].Value = 0;
+        DriverFeatureOverrides[(ULONG)Feature].Found = FALSE;
+
+        Status = RegistryQueryDwordValue(DriverGetParametersKey(),
+                                         FeatureName,
+                                         &Value);
+
+        if (NT_SUCCESS(Status)) {
+            DriverFeatureOverrides[(ULONG)Feature].Found = TRUE;
+            DriverFeatureOverrides[(ULONG)Feature].Value = Value;
+        }
+    }
+}
+
+// Return value indicates whether reg key was found and stored in 
DriverFeatureOverrides
+// Will set Value to the corresponding reg value if found, otherwise it will 
leave Value untouched
+__checkReturn
+_Success_(return)
+BOOLEAN
+DriverGetRegOverride(
+    __in XENVBD_FEATURE              Feature,
+    __out PULONG                     Value
+    )
+{
+    BOOLEAN Found = FALSE;
+
+    if ((ULONG)Feature < (ULONG)NumberOfFeatures) {
+        Found = DriverFeatureOverrides[(ULONG)Feature].Found;
+        *Value = DriverFeatureOverrides[(ULONG)Feature].Value;
+    }
+
+    return Found;
+}
+
+// Return value indicates whether a feature enum to string mapping was found
+// FeatureString will be set to point to the string if a mapping is found, 
otherwise
+// is not modified
+__checkReturn
+PCHAR
+DriverGetFeatureName(
+    __in XENVBD_FEATURE              Feature
+    )
+{
+    PCHAR Name = NULL;
+
+    if ((ULONG)Feature < (ULONG)NumberOfFeatures) {
+        Name = DriverFeatureOverrides[(ULONG)Feature].Name;
+    }
+
+    return Name;
+}
+
 HW_INITIALIZE       HwInitialize;
 
 BOOLEAN 
@@ -549,6 +633,8 @@ DriverEntry(
 
     RtlZeroMemory(&InitData, sizeof(InitData));
 
+    DriverInitializeOverrides();
+
     InitData.HwInitializationDataSize   =   sizeof(InitData);
     InitData.AdapterInterfaceType       =   Internal;
     InitData.HwInitialize               =   HwInitialize;
diff --git a/src/xenvbd/driver.h b/src/xenvbd/driver.h
index e7730a9..9bf0034 100644
--- a/src/xenvbd/driver.h
+++ b/src/xenvbd/driver.h
@@ -50,6 +50,51 @@
 
 #define XENVBD_MIN_GRANT_REFS           (XENVBD_MAX_SEGMENTS_PER_SRB)
 
+// Registry overrides for driver features
+typedef enum _XENVBD_FEATURE {
+    FeatureRemovable = 0,
+    FeaturePersistent,
+    FeatureMaxIndirectSegments,
+    FeatureBarrier,
+    FeatureFlushCache,
+    FeatureDiscard,
+    FeatureDiscardEnable,
+    FeatureDiscardSecure,
+    FeatureDiscardAlignment,
+    FeatureDiscardGranularity,
+
+    // Add any new features before this enum
+    NumberOfFeatures
+} XENVBD_FEATURE, *PXENVBD_FEATURE;
+
+// Feature Overrides From Registry Values
+typedef struct _XENVBD_REGISTRY_OVERRIDE {
+    PCHAR                       Name;
+    ULONG                       Value;
+    BOOLEAN                     Found;
+} XENVBD_REGISTRY_OVERRIDE, *PXENVBD_REGISTRY_OVERRIDE;
+
+extern XENVBD_REGISTRY_OVERRIDE DriverFeatureOverrides[NumberOfFeatures];
+
+// Return value indicates whether reg key was found and stored in 
DriverFeatureOverrides
+// Will set Value to the corresponding reg value if found, otherwise it will 
leave Value untouched
+__checkReturn
+_Success_(return)
+extern BOOLEAN
+DriverGetRegOverride(
+    __in XENVBD_FEATURE              Name,
+    __out PULONG                     Value
+    );
+
+// Return value indicates whether a feature enum to string mapping was found
+// FeatureString will be set to point to the string if a mapping is found, 
otherwise
+// is not modified
+__checkReturn
+extern PCHAR
+DriverGetFeatureName(
+    __in XENVBD_FEATURE              Feature
+    );
+
 typedef struct _XENVBD_PARAMETERS {
     BOOLEAN     SynthesizeInquiry;
     BOOLEAN     PVCDRom;
diff --git a/src/xenvbd/frontend.c b/src/xenvbd/frontend.c
index 227b93b..aa8ed62 100644
--- a/src/xenvbd/frontend.c
+++ b/src/xenvbd/frontend.c
@@ -619,37 +619,69 @@ abort:
 static FORCEINLINE BOOLEAN
 FrontendReadFeature(
     IN  PXENVBD_FRONTEND            Frontend,
-    IN  PCHAR                       Name,
+    IN  XENVBD_FEATURE              Feature,
     IN  PBOOLEAN                    Value
-    )
+)
 {
     NTSTATUS        status;
     PCHAR           Buffer;
     ULONG           Override;
     BOOLEAN         Old = *Value;
+    PCHAR           Name;
+
+    Name = DriverGetFeatureName(Feature);
+    if (Name == NULL) {
+        Trace("Target[%d] : Could not find Feature %u.\n", Frontend->TargetId, 
Feature);
+        return FALSE;
+    }
+
+    // check registry for disable-override
+    if (DriverGetRegOverride(Feature, &Override)) {
+        *Value = (Override == 0) ? FALSE : TRUE;
+    } else {
+
+        status = XENBUS_STORE(Read,
+            Frontend->Store,
+            NULL,
+            Frontend->BackendPath,
+            Name,
+            &Buffer);
+        if (!NT_SUCCESS(status))
+            return FALSE;   // no value, unchanged
+
+        *Value = !!(strtoul(Buffer, NULL, 10));
+        XENBUS_STORE(Free,
+            Frontend->Store,
+            Buffer);
+    }
+
+    return Old != *Value;
+}
+
+static FORCEINLINE BOOLEAN
+FrontendReadDiskFeature(
+    IN  PXENVBD_FRONTEND            Frontend,
+    IN  PCHAR                       Name,
+    IN  PBOOLEAN                    Value
+)
+{
+    NTSTATUS        status;
+    PCHAR           Buffer;
+    BOOLEAN         Old = *Value;
 
     status = XENBUS_STORE(Read,
-                          Frontend->Store,
-                          NULL,
-                          Frontend->BackendPath,
-                          Name,
-                          &Buffer);
+        Frontend->Store,
+        NULL,
+        Frontend->BackendPath,
+        Name,
+        &Buffer);
     if (!NT_SUCCESS(status))
         return FALSE;   // no value, unchanged
 
     *Value = !!(strtoul(Buffer, NULL, 10));
     XENBUS_STORE(Free,
-                    Frontend->Store,
-                    Buffer);
-
-    // check registry for disable-override
-    status = RegistryQueryDwordValue(DriverGetParametersKey(),
-                                    Name,
-                                    &Override);
-    if (NT_SUCCESS(status)) {
-        if (Override == 0)
-            *Value = FALSE;
-    }
+        Frontend->Store,
+        Buffer);
 
     return Old != *Value;
 }
@@ -657,39 +689,69 @@ FrontendReadFeature(
 static FORCEINLINE BOOLEAN
 FrontendReadValue32(
     IN  PXENVBD_FRONTEND            Frontend,
-    IN  PCHAR                       Name,
+    IN  XENVBD_FEATURE              Feature,
     IN  BOOLEAN                     AllowOverride,
     IN  PULONG                      Value
-    )
+)
 {
     NTSTATUS        status;
     PCHAR           Buffer;
     ULONG           Override;
     ULONG           Old = *Value;
+    PSTR            Name;
+
+    Name = DriverGetFeatureName(Feature);
+    if (Name == NULL) {
+        Trace("Target[%d] : Could not find Feature %u.\n", Frontend->TargetId, 
Feature);
+        return FALSE;
+    }
+
+    // check registry for disable-override
+    if (AllowOverride && DriverGetRegOverride(Feature, &Override)) {
+        *Value = Override;
+    } else {
+        status = XENBUS_STORE(Read,
+            Frontend->Store,
+            NULL,
+            Frontend->BackendPath,
+            Name,
+            &Buffer);
+        if (!NT_SUCCESS(status))
+            return FALSE;   // no value, unchanged
+
+        *Value = strtoul(Buffer, NULL, 10);
+        XENBUS_STORE(Free,
+            Frontend->Store,
+            Buffer);
+    }
+
+    return Old != *Value;
+}
+
+static FORCEINLINE BOOLEAN
+FrontendReadDiskValue32(
+    IN  PXENVBD_FRONTEND            Frontend,
+    IN  PCHAR                       Name,
+    IN  PULONG                      Value
+)
+{
+    NTSTATUS        status;
+    PCHAR           Buffer;
+    ULONG           Old = *Value;
 
     status = XENBUS_STORE(Read,
-                          Frontend->Store,
-                          NULL,
-                          Frontend->BackendPath,
-                          Name,
-                          &Buffer);
+        Frontend->Store,
+        NULL,
+        Frontend->BackendPath,
+        Name,
+        &Buffer);
     if (!NT_SUCCESS(status))
         return FALSE;   // no value, unchanged
 
     *Value = strtoul(Buffer, NULL, 10);
     XENBUS_STORE(Free,
-                    Frontend->Store,
-                    Buffer);
-
-    // check registry for disable-override
-    if (AllowOverride) {
-        status = RegistryQueryDwordValue(DriverGetParametersKey(),
-                                        Name,
-                                        &Override);
-        if (NT_SUCCESS(status)) {
-            *Value = Override;
-        }
-    }
+        Frontend->Store,
+        Buffer);
 
     return Old != *Value;
 }
@@ -751,17 +813,14 @@ __ReadDiskInfo(
 {
     BOOLEAN Changed = FALSE;
 
-    Changed |= FrontendReadValue32(Frontend,
+    Changed |= FrontendReadDiskValue32(Frontend,
                                   "info",
-                                  FALSE,
                                   &Frontend->DiskInfo.DiskInfo);
-    Changed |= FrontendReadValue32(Frontend,
+    Changed |= FrontendReadDiskValue32(Frontend,
                                   "sector-size",
-                                  FALSE,
                                   &Frontend->DiskInfo.SectorSize);
-    Changed |= FrontendReadValue32(Frontend,
+    Changed |= FrontendReadDiskValue32(Frontend,
                                   "physical-sector-size",
-                                  FALSE,
                                   &Frontend->DiskInfo.PhysSectorSize);
     Changed |= FrontendReadValue64(Frontend,
                                   "sectors",
@@ -805,14 +864,14 @@ FrontendReadFeatures(
     BOOLEAN Changed = FALSE;
 
     Changed |= FrontendReadFeature(Frontend,
-                                   "removable",
+                                   FeatureRemovable,
                                    &Frontend->Caps.Removable);
     Changed |= FrontendReadValue32(Frontend,
-                                   "feature-max-indirect-segments",
+                                   FeatureMaxIndirectSegments,
                                    TRUE,
                                    &Frontend->Features.Indirect);
     Changed |= FrontendReadFeature(Frontend,
-                                   "feature-persistent",
+                                   FeaturePersistent,
                                    &Frontend->Features.Persistent);
 
     if (!Changed)
@@ -841,31 +900,31 @@ FrontendReadDiskInfo(
     BOOLEAN DiscardEnable = TRUE;
 
     Changed |= FrontendReadFeature(Frontend,
-                                   "feature-barrier",
+                                   FeatureBarrier,
                                    &Frontend->DiskInfo.Barrier);
     Changed |= FrontendReadFeature(Frontend,
-                                   "feature-flush-cache",
+                                   FeatureFlushCache,
                                    &Frontend->DiskInfo.FlushCache);
 
     // discard related
     FrontendReadFeature(Frontend,
-                        "feature-discard",
+                        FeatureDiscard,
                         &DiscardFeature);
     FrontendReadFeature(Frontend,
-                        "discard-enable",
+                        FeatureDiscardEnable,
                         &DiscardEnable);
     Discard = DiscardFeature && DiscardEnable;
     Changed |= (Discard != Frontend->DiskInfo.Discard);
     Frontend->DiskInfo.Discard = Discard;
     Changed |= FrontendReadFeature(Frontend,
-                                   "discard-secure",
+                                   FeatureDiscardSecure,
                                    &Frontend->DiskInfo.DiscardSecure);
     Changed |= FrontendReadValue32(Frontend,
-                                   "discard-alignment",
+                                   FeatureDiscardAlignment,
                                    TRUE,
                                    &Frontend->DiskInfo.DiscardAlignment);
     Changed |= FrontendReadValue32(Frontend,
-                                   "discard-granularity",
+                                   FeatureDiscardGranularity,
                                    TRUE,
                                    &Frontend->DiskInfo.DiscardGranularity);
 
@@ -1238,6 +1297,8 @@ FrontendDisable(
 
 //=============================================================================
 // Init/Term
+_IRQL_requires_(DISPATCH_LEVEL)
+_Requires_lock_held_(Frontend->StateLock)
 static DECLSPEC_NOINLINE NTSTATUS
 __FrontendSetState(
     __in  PXENVBD_FRONTEND        Frontend,
@@ -1413,6 +1474,7 @@ FrontendSuspendLateCallback(
     PdoPreResume(Frontend->Pdo);
 
     // dont acquire state lock - called at DISPATCH on 1 vCPU with interrupts 
enabled
+#pragma warning(suppress: 26110) // warning C26110: Caller failing to hold 
lock <lock> before calling function <func>.
     Status = __FrontendSetState(Frontend, XENVBD_CLOSED);
     if (!NT_SUCCESS(Status)) {
         Error("Target[%d] : SetState CLOSED (%08x)\n", Frontend->TargetId, 
Status);
@@ -1420,6 +1482,7 @@ FrontendSuspendLateCallback(
     }
 
     // dont acquire state lock - called at DISPATCH on 1 vCPU with interrupts 
enabled
+#pragma warning(suppress: 26110) // warning C26110: Caller failing to hold 
lock <lock> before calling function <func>.
     Status = __FrontendSetState(Frontend, State);
     if (!NT_SUCCESS(Status)) {
         Error("Target[%d] : SetState %s (%08x)\n", Frontend->TargetId, 
__XenvbdStateName(State), Status);
diff --git a/src/xenvbd/registry.c b/src/xenvbd/registry.c
index 9ceffa5..885ab6d 100644
--- a/src/xenvbd/registry.c
+++ b/src/xenvbd/registry.c
@@ -89,6 +89,7 @@ RegistryTeardown(
     RegistryPath.MaximumLength = RegistryPath.Length = 0;
 }
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 NTSTATUS
 RegistryOpenKey(
     IN  HANDLE          Parent,
@@ -118,6 +119,7 @@ fail1:
     return status;
 }
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 static NTSTATUS
 RegistryOpenRoot(
     IN  PWCHAR          Path,
@@ -151,6 +153,7 @@ fail1:
     return status;
 }
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 NTSTATUS
 RegistryCreateKey(
     IN  HANDLE          Root,
@@ -250,6 +253,7 @@ fail1:
     return status;
 }
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 NTSTATUS
 RegistryOpenServiceKey(
     IN  ACCESS_MASK     DesiredAccess,
@@ -259,6 +263,7 @@ RegistryOpenServiceKey(
     return RegistryOpenKey(NULL, &RegistryPath, DesiredAccess, Key);
 }
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 NTSTATUS
 RegistryCreateServiceKey(
     OUT PHANDLE         Key
@@ -267,6 +272,7 @@ RegistryCreateServiceKey(
     return RegistryCreateKey(NULL, &RegistryPath, REG_OPTION_NON_VOLATILE, 
Key);
 }
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 NTSTATUS
 RegistryOpenSoftwareKey(
     IN  PDEVICE_OBJECT  DeviceObject,
@@ -289,6 +295,7 @@ fail1:
     return status;
 }
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 NTSTATUS
 RegistryOpenHardwareKey(
     IN  PDEVICE_OBJECT      DeviceObject,
@@ -366,6 +373,7 @@ fail1:
     return status;
 }
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 NTSTATUS
 RegistryOpenSubKey(
     IN  PHANDLE         Key,
@@ -399,6 +407,7 @@ fail1:
     return status;
 }
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 NTSTATUS
 RegistryCreateSubKey(
     IN  PHANDLE         Key,
@@ -432,6 +441,7 @@ fail1:
     return status;
 }
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 NTSTATUS
 RegistryDeleteSubKey(
     IN  PHANDLE         Key,
@@ -475,6 +485,7 @@ fail1:
     return status;
 }
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 NTSTATUS
 RegistryEnumerateSubKeys(
     IN  HANDLE              Key,
@@ -579,6 +590,7 @@ fail1:
     return status;
 }
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 NTSTATUS
 RegistryEnumerateValues(
     IN  HANDLE                      Key,
@@ -677,6 +689,7 @@ fail1:
     return status;
 }
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 NTSTATUS
 RegistryDeleteValue(
     IN  PHANDLE         Key,
@@ -710,6 +723,7 @@ fail1:
     return status;
 }
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 NTSTATUS
 RegistryQueryDwordValue(
     IN  HANDLE                      Key,
@@ -780,6 +794,7 @@ fail1:
     return status;
 }
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 NTSTATUS
 RegistryUpdateDwordValue(
     IN  HANDLE                      Key,
@@ -838,6 +853,7 @@ fail1:
     return status;
 }
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 static PANSI_STRING
 RegistrySzToAnsi(
     IN  PWCHAR      Buffer
@@ -877,6 +893,7 @@ fail1:
     return NULL;
 }
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 static PANSI_STRING
 RegistryMultiSzToAnsi(
     IN  PWCHAR      Buffer
@@ -939,6 +956,7 @@ fail1:
     return NULL;
 }
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 NTSTATUS
 RegistryQuerySzValue(
     IN  HANDLE                      Key,
@@ -1026,6 +1044,7 @@ fail1:
     return status;
 }
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 NTSTATUS
 RegistryQueryBinaryValue(
     IN  HANDLE                      Key,
@@ -1111,6 +1130,7 @@ fail1:
     return status;
 }
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 NTSTATUS
 RegistryUpdateBinaryValue(
     IN  HANDLE                      Key,
@@ -1170,6 +1190,7 @@ fail1:
     return status;
 }
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 NTSTATUS
 RegistryQueryKeyName(
     IN  HANDLE              Key,
@@ -1225,6 +1246,7 @@ fail1:
     return status;
 }
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 NTSTATUS
 RegistryQuerySystemStartOption(
     IN  const CHAR                  *Prefix,
@@ -1303,6 +1325,7 @@ fail1:
     return status;
 }
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 static PKEY_VALUE_PARTIAL_INFORMATION
 RegistryAnsiToSz(
     PANSI_STRING                    Ansi
@@ -1342,6 +1365,7 @@ fail1:
     return NULL;
 }
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 static PKEY_VALUE_PARTIAL_INFORMATION
 RegistryAnsiToMultiSz(
     PANSI_STRING                    Ansi
@@ -1395,6 +1419,7 @@ fail1:
     return NULL;
 }
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 NTSTATUS
 RegistryUpdateSzValue(
     IN  HANDLE                      Key,
@@ -1485,6 +1510,7 @@ RegistryFreeBinaryValue(
     __RegistryFree(Buffer);
 }
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 VOID
 RegistryCloseKey(
     IN  HANDLE  Key
diff --git a/src/xenvbd/registry.h b/src/xenvbd/registry.h
index d39f016..9bf492e 100644
--- a/src/xenvbd/registry.h
+++ b/src/xenvbd/registry.h
@@ -44,6 +44,7 @@ RegistryTeardown(
     VOID
     );
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 extern NTSTATUS
 RegistryOpenKey(
     IN  HANDLE          Parent,
@@ -52,6 +53,7 @@ RegistryOpenKey(
     OUT PHANDLE         Key
     );
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 extern NTSTATUS
 RegistryCreateKey(
     IN  HANDLE          Parent,
@@ -60,17 +62,20 @@ RegistryCreateKey(
     OUT PHANDLE         Key
     );
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 extern NTSTATUS
 RegistryOpenServiceKey(
     IN  ACCESS_MASK DesiredAccess,
     OUT PHANDLE     Key
     );
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 extern NTSTATUS
 RegistryCreateServiceKey(
     OUT PHANDLE     Key
     );
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 extern NTSTATUS
 RegistryOpenSoftwareKey(
     IN  PDEVICE_OBJECT  DeviceObject,
@@ -78,6 +83,7 @@ RegistryOpenSoftwareKey(
     OUT PHANDLE         Key
     );
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 extern NTSTATUS
 RegistryOpenHardwareKey(
     IN  PDEVICE_OBJECT  DeviceObject,
@@ -85,6 +91,7 @@ RegistryOpenHardwareKey(
     OUT PHANDLE         Key
     );
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 extern NTSTATUS
 RegistryOpenSubKey(
     IN  HANDLE      Key,
@@ -93,6 +100,7 @@ RegistryOpenSubKey(
     OUT PHANDLE     SubKey
     );
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 extern NTSTATUS
 RegistryCreateSubKey(
     IN  HANDLE      Key,
@@ -101,12 +109,14 @@ RegistryCreateSubKey(
     OUT PHANDLE     SubKey
     );
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 extern NTSTATUS
 RegistryDeleteSubKey(
     IN  HANDLE      Key,
     IN  PCHAR       Name
     );
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 extern NTSTATUS
 RegistryEnumerateSubKeys(
     IN  HANDLE      Key,
@@ -114,6 +124,7 @@ RegistryEnumerateSubKeys(
     IN  PVOID       Context
     );
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 extern NTSTATUS
 RegistryEnumerateValues(
     IN  HANDLE      Key,
@@ -121,26 +132,30 @@ RegistryEnumerateValues(
     IN  PVOID       Context
     );
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 extern NTSTATUS
 RegistryDeleteValue(
     IN  HANDLE      Key,
     IN  PCHAR       Name
     );
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 extern NTSTATUS
 RegistryQueryDwordValue(
     IN  HANDLE          Key,
     IN  PCHAR           Name,
     OUT PULONG          Value
     );
-    
+
+__drv_requiresIRQL(PASSIVE_LEVEL)
 extern NTSTATUS
 RegistryUpdateDwordValue(
     IN  HANDLE          Key,
     IN  PCHAR           Name,
     IN  ULONG           Value
     );
-    
+
+__drv_requiresIRQL(PASSIVE_LEVEL)
 extern NTSTATUS
 RegistryQuerySzValue(
     IN  HANDLE          Key,
@@ -149,6 +164,7 @@ RegistryQuerySzValue(
     OUT PANSI_STRING    *Array
     );
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 extern NTSTATUS
 RegistryQueryBinaryValue(
     IN  HANDLE          Key,
@@ -157,6 +173,7 @@ RegistryQueryBinaryValue(
     OUT PULONG          Length
     );
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 extern NTSTATUS
 RegistryUpdateBinaryValue(
     IN  HANDLE          Key,
@@ -165,12 +182,14 @@ RegistryUpdateBinaryValue(
     IN  ULONG           Length
     );
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 extern NTSTATUS
 RegistryQueryKeyName(
     IN  HANDLE              Key,
     OUT PANSI_STRING        *Array
     );
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 extern NTSTATUS
 RegistryQuerySystemStartOption(
     IN  const CHAR      *Prefix,
@@ -187,6 +206,7 @@ RegistryFreeBinaryValue(
     IN  PVOID           Buffer
     );
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 extern NTSTATUS
 RegistryUpdateSzValue(
     IN  HANDLE          Key,
@@ -195,6 +215,7 @@ RegistryUpdateSzValue(
     IN  PANSI_STRING    Array
     );
 
+__drv_requiresIRQL(PASSIVE_LEVEL)
 extern VOID
 RegistryCloseKey(
     IN  HANDLE  Key
-- 
2.10.1.windows.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.