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

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


  • To: Paul Durrant <Paul.Durrant@xxxxxxxxxx>, "win-pv-devel@xxxxxxxxxxxxxxxxxxxx" <win-pv-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: "Mackay, Eric" <mackayem@xxxxxxxxxx>
  • Date: Tue, 27 Jun 2017 15:08:37 +0000
  • Accept-language: en-US
  • Delivery-date: Tue, 27 Jun 2017 15:08:51 +0000
  • List-id: Developer list for the Windows PV Drivers subproject <win-pv-devel.lists.xenproject.org>
  • Thread-index: AQHS71WDfCx84FxPU0yQC2tshnKkkaI4zniA
  • Thread-topic: [win-pv-devel] [PATCH] Added a function called from DriverEntry where we can safely read registry keys and convert strings at PASSIVE_LEVEL

I believe the patch should work as-is on top of the 8.2.0 release (I based it 
on the 8.2.0 tag). I tried directly making a version of the patch on top of the 
most recent commits from Owen, but I ran across the bug I mentioned in another 
post to the mailing list, subject line " XenVBD bug - IRQL mismatch between 
AdapterHwFindAdapter and AdapterInitialize".

-----Original Message-----
From: Paul Durrant [mailto:Paul.Durrant@xxxxxxxxxx] 
Sent: Tuesday, June 27, 2017 7:55 AM
To: Mackay, Eric <mackayem@xxxxxxxxxx>; win-pv-devel@xxxxxxxxxxxxxxxxxxxx
Subject: RE: [win-pv-devel] [PATCH] Added a function called from DriverEntry 
where we can safely read registry keys and convert strings at PASSIVE_LEVEL

> -----Original Message-----
> From: win-pv-devel [mailto:win-pv-devel-bounces@xxxxxxxxxxxxxxxxxxxx] 
> On Behalf Of Eric Mackay
> Sent: 26 June 2017 20:46
> To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx
> Cc: Eric Mackay <mackayem@xxxxxxxxxx>
> Subject: [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>

Generally this looks ok so

Acked-by: Paul Durrant <paul.durrant@xxxxxxxxxx>

However it needs re-basing now that Owen's recent patches have gone in. I'll do 
that, and I'll probably split out the addition of the annotations into a 
separate patch.

  Paul

> ---
>  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
_______________________________________________
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®.