[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: "'Mackay, Eric'" <mackayem@xxxxxxxxxx>, "win-pv-devel@xxxxxxxxxxxxxxxxxxxx" <win-pv-devel@xxxxxxxxxxxxxxxxxxxx>
  • From: Paul Durrant <Paul.Durrant@xxxxxxxxxx>
  • Date: Tue, 27 Jun 2017 15:53:54 +0000
  • Accept-language: en-GB, en-US
  • Delivery-date: Tue, 27 Jun 2017 15:56:28 +0000
  • List-id: Developer list for the Windows PV Drivers subproject <win-pv-devel.lists.xenproject.org>
  • Thread-index: AQHS7rTmkredBsLkTUCXS495O8jUuqI4zJpA///i9oCAAC37IA==
  • 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

> -----Original Message-----
> From: Mackay, Eric [mailto:mackayem@xxxxxxxxxx]
> Sent: 27 June 2017 16:09
> To: Paul Durrant <Paul.Durrant@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
> 
> 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".

Ok. I'll handle the re-base and we'll take a look at that issue.

  Paul

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