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

Re: [win-pv-devel] [PATCH 2/2] Added a function called from DriverEntry where...



> -----Original Message-----
> From: win-pv-devel [mailto:win-pv-devel-bounces@xxxxxxxxxxxxxxxxxxxx] On
> Behalf Of Paul Durrant
> Sent: 28 June 2017 16:39
> To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx
> Cc: Eric Mackay <mackayem@xxxxxxxxxx>; Paul Durrant
> <Paul.Durrant@xxxxxxxxxx>
> Subject: [win-pv-devel] [PATCH 2/2] Added a function called from
> DriverEntry where...
> 
> From: Eric Mackay <mackayem@xxxxxxxxxx>
> 
> 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 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
> 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 PASSIVE_LEVEL is required on certain
> registry access functions.
> 
> Signed-off-by: Eric Mackay <mackayem@xxxxxxxxxx>
> 
> Re-based onto master and adjusted for style. Note this involved fixing
> whitespace issues in frontend.c.
> 
> Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
> ---
>  src/xenvbd/driver.c   |  96 ++++++++++++++++--
>  src/xenvbd/driver.h   |  31 ++++++
>  src/xenvbd/frontend.c | 269 ++++++++++++++++++++++++++++++++------
> ------------
>  src/xenvbd/registry.c |  26 +++++
>  src/xenvbd/registry.h |  25 ++++-
>  5 files changed, 342 insertions(+), 105 deletions(-)
> 
> diff --git a/src/xenvbd/driver.c b/src/xenvbd/driver.c index 62c3cbb..f8d5e82
> 100644
> --- a/src/xenvbd/driver.c
> +++ b/src/xenvbd/driver.c
> @@ -47,12 +47,21 @@
>  #include "debug.h"
>  #include "assert.h"
> 
> +// Feature Overrides From Registry Values typedef struct
> +_XENVBD_FEATURE_OVERRIDE {
> +    PCHAR                       Name;
> +    ULONG                       Value;
> +    BOOLEAN                     Present;
> +} XENVBD_FEATURE_OVERRIDE, *PXENVBD_FEATURE_OVERRIDE;
> +
>  typedef struct _XENVBD_DRIVER {
> -    PXENVBD_ADAPTER     Adapter;
> -    HANDLE              ParametersKey;
> -    PDRIVER_DISPATCH    StorPortDispatchPnp;
> -    PDRIVER_DISPATCH    StorPortDispatchPower;
> -    PDRIVER_UNLOAD      StorPortDriverUnload;
> +    PXENVBD_ADAPTER             Adapter;
> +    HANDLE                      ParametersKey;
> +    PDRIVER_DISPATCH            StorPortDispatchPnp;
> +    PDRIVER_DISPATCH            StorPortDispatchPower;
> +    PDRIVER_UNLOAD              StorPortDriverUnload;
> +    const CHAR                  *FeatureName[NumberOfFeatures];

FeatureName here is not initialised or used. Struct entry can be removed.

> +    XENVBD_FEATURE_OVERRIDE     FeatureOverride[NumberOfFeatures];
>  } XENVBD_DRIVER;
> 
>  static XENVBD_DRIVER Driver;
> @@ -240,7 +249,80 @@ DriverUnload(
>      RegistryTeardown();
>  }
> 
> -DRIVER_INITIALIZE           DriverEntry;
> +__drv_requiresIRQL(PASSIVE_LEVEL)
> +static FORCEINLINE VOID
> +__DriverInitializeOverrides(
> +    VOID
> +    )
> +{
> +    ULONG           Index;
> +    struct {
> +        PCHAR           Name;
> +        XENVBD_FEATURE  Feature;
> +    } Mapping[] =
> +          {
> +              { "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 (Index = 0; Index < ARRAYSIZE(Mapping); Index++) {
> +        XENVBD_FEATURE  Feature = Mapping[Index].Feature;
> +        PCHAR           Name = Mapping[Index].Name;
> +        ULONG           Value;
> +        NTSTATUS        status;
> +
> +        Driver.FeatureOverride[Feature].Name = Name;
> +
> +        status = RegistryQueryDwordValue(__DriverGetParametersKey(),
> +                                         Name,
> +                                         &Value);
> +
> +        if (!NT_SUCCESS(status))
> +            continue;
> +
> +        Driver.FeatureOverride[Feature].Present = TRUE;
> +        Driver.FeatureOverride[Feature].Value = Value;
> +    }
> +}
> +
> +__checkReturn
> +_Success_(return)
> +BOOLEAN
> +DriverGetFeatureOverride(
> +    IN  XENVBD_FEATURE   Feature,
> +    OUT PULONG           Value
> +    )
> +{
> +    BOOLEAN              Present = FALSE;
> +
> +    if (Feature < ARRAYSIZE(Driver.FeatureOverride)) {
> +        Present = Driver.FeatureOverride[Feature].Present;
> +        *Value = Driver.FeatureOverride[Feature].Value;
> +    }
> +
> +    return Present;
> +}
> +
> +__checkReturn
> +PCHAR
> +DriverGetFeatureName(
> +    IN  XENVBD_FEATURE  Feature
> +    )
> +{
> +    return (Feature < ARRAYSIZE(Driver.FeatureOverride)) ?
> +           Driver.FeatureOverride[Feature].Name :
> +           NULL;
> +}
> +
> +DRIVER_INITIALIZE   DriverEntry;
> 
>  NTSTATUS
>  DriverEntry(
> @@ -287,6 +369,8 @@ DriverEntry(
>      Driver.Adapter = NULL;
>      BufferInitialize();
> 
> +    __DriverInitializeOverrides();
> +
>      status = AdapterDriverEntry(RegistryPath,
>                                  DriverObject);
>      if (!NT_SUCCESS(status))
> diff --git a/src/xenvbd/driver.h b/src/xenvbd/driver.h index
> 386cd84..042c8b6 100644
> --- a/src/xenvbd/driver.h
> +++ b/src/xenvbd/driver.h
> @@ -67,4 +67,35 @@ DriverRequestReboot(
>      VOID
>      );
> 
> +// 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;
> +
> +__checkReturn
> +_Success_(return)
> +extern BOOLEAN
> +DriverGetFeatureOverride(
> +    IN  XENVBD_FEATURE   Feature,
> +    OUT PULONG           Value
> +    );
> +
> +__checkReturn
> +extern PCHAR
> +DriverGetFeatureName(
> +    IN  XENVBD_FEATURE  Feature
> +    );
> +
>  #endif // _XENVBD_DRIVER_H
> diff --git a/src/xenvbd/frontend.c b/src/xenvbd/frontend.c index
> 13ab9b4..1477417 100644
> --- a/src/xenvbd/frontend.c
> +++ b/src/xenvbd/frontend.c
> @@ -620,15 +620,55 @@ abort:
> 
>  static FORCEINLINE BOOLEAN
>  FrontendReadFeature(
> -    IN  PXENVBD_FRONTEND            Frontend,
> -    IN  PCHAR                       Name,
> -    IN  PBOOLEAN                    Value
> +    IN  PXENVBD_FRONTEND    Frontend,
> +    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;
> +    }
> +
> +    if (DriverGetFeatureOverride(Feature, &Override)) {
> +        *Value = !!Override;
> +    } else {
> +        status = XENBUS_STORE(Read,
> +                              &Frontend->StoreInterface,
> +                              NULL,
> +                              Frontend->BackendPath,
> +                              Name,
> +                              &Buffer);
> +        if (!NT_SUCCESS(status))
> +            return FALSE;   // no value, unchanged
> +
> +        *Value = !!(strtoul(Buffer, NULL, 10));
> +
> +        XENBUS_STORE(Free,
> +                     &Frontend->StoreInterface,
> +                     Buffer);
> +    }
> +
> +    return Old != *Value;
> +}
> +
> +static FORCEINLINE BOOLEAN
> +FrontendReadDiskFeature(
> +    IN  PXENVBD_FRONTEND    Frontend,
> +    IN  PCHAR               Name,
> +    IN  PBOOLEAN            Value
>      )
>  {
> -    NTSTATUS        status;
> -    PCHAR           Buffer;
> -    ULONG           Override;
> -    BOOLEAN         Old = *Value;
> +    NTSTATUS                status;
> +    PCHAR                   Buffer;
> +    BOOLEAN                 Old = *Value;
> 
>      status = XENBUS_STORE(Read,
>                            &Frontend->StoreInterface, @@ -640,34 +680,67 @@
> FrontendReadFeature(
>          return FALSE;   // no value, unchanged
> 
>      *Value = !!(strtoul(Buffer, NULL, 10));
> +
>      XENBUS_STORE(Free,
> -                    &Frontend->StoreInterface,
> -                    Buffer);
> +                 &Frontend->StoreInterface,
> +                 Buffer);
> +
> +    return Old != *Value;
> +}
> +
> +static FORCEINLINE BOOLEAN
> +FrontendReadValue32(
> +    IN  PXENVBD_FRONTEND    Frontend,
> +    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
> -    status = RegistryQueryDwordValue(DriverGetParametersKey(),
> -                                    Name,
> -                                    &Override);
> -    if (NT_SUCCESS(status)) {
> -        if (Override == 0)
> -            *Value = FALSE;
> +    if (AllowOverride && DriverGetFeatureOverride(Feature, &Override)) {
> +        *Value = Override;
> +    } else {
> +        status = XENBUS_STORE(Read,
> +                              &Frontend->StoreInterface,
> +                              NULL,
> +                              Frontend->BackendPath,
> +                              Name,
> +                              &Buffer);
> +        if (!NT_SUCCESS(status))
> +            return FALSE;   // no value, unchanged
> +
> +        *Value = strtoul(Buffer, NULL, 10);
> +
> +        XENBUS_STORE(Free,
> +                     &Frontend->StoreInterface,
> +                     Buffer);
>      }
> 
>      return Old != *Value;
>  }
> 
>  static FORCEINLINE BOOLEAN
> -FrontendReadValue32(
> -    IN  PXENVBD_FRONTEND            Frontend,
> -    IN  PCHAR                       Name,
> -    IN  BOOLEAN                     AllowOverride,
> -    IN  PULONG                      Value
> -    )
> +FrontendReadDiskValue32(
> +    IN  PXENVBD_FRONTEND    Frontend,
> +    IN  PCHAR               Name,
> +    IN  PULONG              Value
> +)
>  {
> -    NTSTATUS        status;
> -    PCHAR           Buffer;
> -    ULONG           Override;
> -    ULONG           Old = *Value;
> +    NTSTATUS                status;
> +    PCHAR                   Buffer;
> +    ULONG                   Old = *Value;
> 
>      status = XENBUS_STORE(Read,
>                            &Frontend->StoreInterface, @@ -679,33 +752,24 @@
> FrontendReadValue32(
>          return FALSE;   // no value, unchanged
> 
>      *Value = strtoul(Buffer, NULL, 10);
> -    XENBUS_STORE(Free,
> -                    &Frontend->StoreInterface,
> -                    Buffer);
> 
> -    // check registry for disable-override
> -    if (AllowOverride) {
> -        status = RegistryQueryDwordValue(DriverGetParametersKey(),
> -                                        Name,
> -                                        &Override);
> -        if (NT_SUCCESS(status)) {
> -            *Value = Override;
> -        }
> -    }
> +    XENBUS_STORE(Free,
> +                 &Frontend->StoreInterface,
> +                 Buffer);
> 
>      return Old != *Value;
>  }
> 
>  static FORCEINLINE BOOLEAN
>  FrontendReadValue64(
> -    IN  PXENVBD_FRONTEND            Frontend,
> -    IN  PCHAR                       Name,
> -    IN OUT PULONG64                 Value
> +    IN  PXENVBD_FRONTEND    Frontend,
> +    IN  PCHAR               Name,
> +    IN OUT PULONG64         Value
>      )
>  {
> -    NTSTATUS        status;
> -    PCHAR           Buffer;
> -    ULONG64         Old = *Value;
> +    NTSTATUS                status;
> +    PCHAR                   Buffer;
> +    ULONG64                 Old = *Value;
> 
>      status = XENBUS_STORE(Read,
>                            &Frontend->StoreInterface, @@ -717,57 +781,59 @@
> FrontendReadValue64(
>          return FALSE;   // no value, unchanged
> 
>      *Value = _strtoui64(Buffer, NULL, 10);
> +
>      XENBUS_STORE(Free,
> -                    &Frontend->StoreInterface,
> -                    Buffer);
> +                 &Frontend->StoreInterface,
> +                 Buffer);
> 
>      return Old != *Value;
>  }
> 
>  static FORCEINLINE ULONG
>  __Size(
> -    __in  PXENVBD_DISKINFO          Info
> +    __in  PXENVBD_DISKINFO  Info
>      )
>  {
> -    ULONG64 MBytes = (Info->SectorSize * Info->SectorCount) >> 20; // /
> (1024 * 1024);
> +    ULONG64                 MBytes = (Info->SectorSize * Info->SectorCount) 
> >>
> 20; // / (1024 * 1024);
> +
>      if (MBytes < 10240)
>          return (ULONG)MBytes;
> +
>      return (ULONG)(MBytes >> 10); // / 1024  }  static FORCEINLINE PCHAR
> __Units(
> -    __in  PXENVBD_DISKINFO          Info
> +    __in  PXENVBD_DISKINFO  Info
>      )
>  {
> -    ULONG64 MBytes = (Info->SectorSize * Info->SectorCount) >> 20; // /
> (1024 * 1024);
> +    ULONG64                 MBytes = (Info->SectorSize * Info->SectorCount) 
> >>
> 20; // / (1024 * 1024);
> +
>      if (MBytes < 10240)
>          return "MB";
> +
>      return "GB";
>  }
> 
>  __drv_requiresIRQL(DISPATCH_LEVEL)
>  static VOID
>  __ReadDiskInfo(
> -    __in  PXENVBD_FRONTEND        Frontend
> +    __in  PXENVBD_FRONTEND  Frontend
>      )
>  {
> -    BOOLEAN Changed = FALSE;
> -
> -    Changed |= FrontendReadValue32(Frontend,
> -                                  "info",
> -                                  FALSE,
> -                                  &Frontend->DiskInfo.DiskInfo);
> -    Changed |= FrontendReadValue32(Frontend,
> -                                  "sector-size",
> -                                  FALSE,
> -                                  &Frontend->DiskInfo.SectorSize);
> -    Changed |= FrontendReadValue32(Frontend,
> -                                  "physical-sector-size",
> -                                  FALSE,
> -                                  &Frontend->DiskInfo.PhysSectorSize);
> +    BOOLEAN                 Changed;
> +
> +    Changed = FrontendReadDiskValue32(Frontend,
> +                                      "info",
> +                                      &Frontend->DiskInfo.DiskInfo);
> +    Changed |= FrontendReadDiskValue32(Frontend,
> +                                       "sector-size",
> +                                       &Frontend->DiskInfo.SectorSize);
> +    Changed |= FrontendReadDiskValue32(Frontend,
> +                                       "physical-sector-size",
> +
> + &Frontend->DiskInfo.PhysSectorSize);
>      Changed |= FrontendReadValue64(Frontend,
> -                                  "sectors",
> -                                  &Frontend->DiskInfo.SectorCount);
> +                                   "sectors",
> +                                   &Frontend->DiskInfo.SectorCount);
> 
>      if (!Changed)
>          return;
> @@ -791,40 +857,41 @@ __ReadDiskInfo(
> 
>      // dump actual values
>      Verbose("Target[%d] : %lld sectors of %d bytes (%d)\n", Frontend-
> >TargetId,
> -                Frontend->DiskInfo.SectorCount, 
> Frontend->DiskInfo.SectorSize,
> -                Frontend->DiskInfo.PhysSectorSize);
> +            Frontend->DiskInfo.SectorCount, Frontend->DiskInfo.SectorSize,
> +            Frontend->DiskInfo.PhysSectorSize);
>      Verbose("Target[%d] : %d %s (%08x) %s\n", Frontend->TargetId,
> -                __Size(&Frontend->DiskInfo), __Units(&Frontend->DiskInfo),
> -                Frontend->DiskInfo.DiskInfo,
> -                Frontend->Caps.SurpriseRemovable ? "SURPRISE_REMOVABLE" :
> "");
> +            __Size(&Frontend->DiskInfo), __Units(&Frontend->DiskInfo),
> +            Frontend->DiskInfo.DiskInfo,
> +            Frontend->Caps.SurpriseRemovable ? "SURPRISE_REMOVABLE" :
> + "");
>  }
> 
>  static FORCEINLINE VOID
>  FrontendReadFeatures(
> -    IN  PXENVBD_FRONTEND            Frontend
> +    IN  PXENVBD_FRONTEND    Frontend
>      )
>  {
> -    BOOLEAN Changed = FALSE;
> +    BOOLEAN                 Changed;
> 
> -    Changed |= FrontendReadFeature(Frontend,
> -                                   "removable",
> -                                   &Frontend->Caps.Removable);
> +    Changed = FrontendReadFeature(Frontend,
> +                                  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)
>          return;
> 
>      Verbose("Target[%d] : Features: %s%s%s\n",
> -                Frontend->TargetId,
> -                Frontend->Features.Persistent ? "PERSISTENT " : "",
> -                Frontend->Features.Indirect ? "INDIRECT " : "",
> -                Frontend->Caps.Removable ? "REMOVABLE" : "");
> +            Frontend->TargetId,
> +            Frontend->Features.Persistent ? "PERSISTENT " : "",
> +            Frontend->Features.Indirect ? "INDIRECT " : "",
> +            Frontend->Caps.Removable ? "REMOVABLE" : "");
> +
>      if (Frontend->Features.Indirect) {
>          Verbose("Target[%d] : INDIRECT %x\n",
>                      Frontend->TargetId, @@ -834,40 +901,44 @@
> FrontendReadFeatures(
> 
>  static FORCEINLINE VOID
>  FrontendReadDiskInfo(
> -    IN  PXENVBD_FRONTEND            Frontend
> +    IN  PXENVBD_FRONTEND    Frontend
>      )
>  {
> -    BOOLEAN Changed = FALSE;
> -    BOOLEAN Discard;
> -    BOOLEAN DiscardFeature = FALSE;
> -    BOOLEAN DiscardEnable = TRUE;
> -
> +    BOOLEAN                 Changed;
> +    BOOLEAN                 Discard;
> +    BOOLEAN                 DiscardFeature = FALSE;
> +    BOOLEAN                 DiscardEnable = TRUE;
> +
> +    Changed = FrontendReadFeature(Frontend,
> +                                  FeatureBarrier,
> +                                  &Frontend->DiskInfo.Barrier);
>      Changed |= FrontendReadFeature(Frontend,
> -                                   "feature-barrier",
> -                                   &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);
> 
> @@ -879,6 +950,7 @@ FrontendReadDiskInfo(
>                  Frontend->DiskInfo.Barrier ? "BARRIER " : "",
>                  Frontend->DiskInfo.FlushCache ?  "FLUSH " : "",
>                  Frontend->DiskInfo.Discard ? "DISCARD " : "");
> +
>      if (Frontend->DiskInfo.Discard) {
>          Verbose("Target[%d] : DISCARD %s%x/%x\n",
>                      Frontend->TargetId, @@ -1240,6 +1312,8 @@ 
> FrontendDisable(
> 
> 
> //=========================================================
> ====================
>  // Init/Term
> +_IRQL_requires_(DISPATCH_LEVEL)
> +_Requires_lock_held_(Frontend->StateLock)
>  static DECLSPEC_NOINLINE NTSTATUS
>  __FrontendSetState(
>      __in  PXENVBD_FRONTEND        Frontend,
> @@ -1413,6 +1487,7 @@ FrontendSuspendLateCallback(
>      State = Frontend->State;
> 
>      // 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); diff --git a/src/xenvbd/registry.c b/src/xenvbd/registry.c index
> 40c77f1..bb105b9 100644
> --- a/src/xenvbd/registry.c
> +++ b/src/xenvbd/registry.c
> @@ -86,6 +86,7 @@ RegistryTeardown(
>      RegistryPath.MaximumLength = RegistryPath.Length = 0;  }
> 
> +__drv_requiresIRQL(PASSIVE_LEVEL)
>  NTSTATUS
>  RegistryOpenKey(
>      IN  HANDLE          Parent,
> @@ -115,6 +116,7 @@ fail1:
>      return status;
>  }
> 
> +__drv_requiresIRQL(PASSIVE_LEVEL)
>  static NTSTATUS
>  RegistryOpenRoot(
>      IN  PWCHAR          Path,
> @@ -148,6 +150,7 @@ fail1:
>      return status;
>  }
> 
> +__drv_requiresIRQL(PASSIVE_LEVEL)
>  NTSTATUS
>  RegistryCreateKey(
>      IN  HANDLE          Root,
> @@ -247,6 +250,7 @@ fail1:
>      return status;
>  }
> 
> +__drv_requiresIRQL(PASSIVE_LEVEL)
>  NTSTATUS
>  RegistryOpenServiceKey(
>      IN  ACCESS_MASK     DesiredAccess,
> @@ -256,6 +260,7 @@ RegistryOpenServiceKey(
>      return RegistryOpenKey(NULL, &RegistryPath, DesiredAccess, Key);  }
> 
> +__drv_requiresIRQL(PASSIVE_LEVEL)
>  NTSTATUS
>  RegistryCreateServiceKey(
>      OUT PHANDLE         Key
> @@ -264,6 +269,7 @@ RegistryCreateServiceKey(
>      return RegistryCreateKey(NULL, &RegistryPath,
> REG_OPTION_NON_VOLATILE, Key);  }
> 
> +__drv_requiresIRQL(PASSIVE_LEVEL)
>  NTSTATUS
>  RegistryOpenSoftwareKey(
>      IN  PDEVICE_OBJECT  DeviceObject,
> @@ -286,6 +292,7 @@ fail1:
>      return status;
>  }
> 
> +__drv_requiresIRQL(PASSIVE_LEVEL)
>  NTSTATUS
>  RegistryOpenHardwareKey(
>      IN  PDEVICE_OBJECT      DeviceObject,
> @@ -363,6 +370,7 @@ fail1:
>      return status;
>  }
> 
> +__drv_requiresIRQL(PASSIVE_LEVEL)
>  NTSTATUS
>  RegistryOpenSubKey(
>      IN  PHANDLE         Key,
> @@ -396,6 +404,7 @@ fail1:
>      return status;
>  }
> 
> +__drv_requiresIRQL(PASSIVE_LEVEL)
>  NTSTATUS
>  RegistryCreateSubKey(
>      IN  PHANDLE         Key,
> @@ -429,6 +438,7 @@ fail1:
>      return status;
>  }
> 
> +__drv_requiresIRQL(PASSIVE_LEVEL)
>  NTSTATUS
>  RegistryDeleteSubKey(
>      IN  PHANDLE         Key,
> @@ -472,6 +482,7 @@ fail1:
>      return status;
>  }
> 
> +__drv_requiresIRQL(PASSIVE_LEVEL)
>  NTSTATUS
>  RegistryEnumerateSubKeys(
>      IN  HANDLE              Key,
> @@ -576,6 +587,7 @@ fail1:
>      return status;
>  }
> 
> +__drv_requiresIRQL(PASSIVE_LEVEL)
>  NTSTATUS
>  RegistryEnumerateValues(
>      IN  HANDLE                      Key,
> @@ -674,6 +686,7 @@ fail1:
>      return status;
>  }
> 
> +__drv_requiresIRQL(PASSIVE_LEVEL)
>  NTSTATUS
>  RegistryDeleteValue(
>      IN  PHANDLE         Key,
> @@ -707,6 +720,7 @@ fail1:
>      return status;
>  }
> 
> +__drv_requiresIRQL(PASSIVE_LEVEL)
>  NTSTATUS
>  RegistryQueryDwordValue(
>      IN  HANDLE                      Key,
> @@ -777,6 +791,7 @@ fail1:
>      return status;
>  }
> 
> +__drv_requiresIRQL(PASSIVE_LEVEL)
>  NTSTATUS
>  RegistryUpdateDwordValue(
>      IN  HANDLE                      Key,
> @@ -835,6 +850,7 @@ fail1:
>      return status;
>  }
> 
> +__drv_requiresIRQL(PASSIVE_LEVEL)
>  static PANSI_STRING
>  RegistrySzToAnsi(
>      IN  PWCHAR      Buffer
> @@ -874,6 +890,7 @@ fail1:
>      return NULL;
>  }
> 
> +__drv_requiresIRQL(PASSIVE_LEVEL)
>  static PANSI_STRING
>  RegistryMultiSzToAnsi(
>      IN  PWCHAR      Buffer
> @@ -936,6 +953,7 @@ fail1:
>      return NULL;
>  }
> 
> +__drv_requiresIRQL(PASSIVE_LEVEL)
>  NTSTATUS
>  RegistryQuerySzValue(
>      IN  HANDLE                      Key,
> @@ -1023,6 +1041,7 @@ fail1:
>      return status;
>  }
> 
> +__drv_requiresIRQL(PASSIVE_LEVEL)
>  NTSTATUS
>  RegistryQueryBinaryValue(
>      IN  HANDLE                      Key,
> @@ -1108,6 +1127,7 @@ fail1:
>      return status;
>  }
> 
> +__drv_requiresIRQL(PASSIVE_LEVEL)
>  NTSTATUS
>  RegistryUpdateBinaryValue(
>      IN  HANDLE                      Key,
> @@ -1167,6 +1187,7 @@ fail1:
>      return status;
>  }
> 
> +__drv_requiresIRQL(PASSIVE_LEVEL)
>  NTSTATUS
>  RegistryQueryKeyName(
>      IN  HANDLE              Key,
> @@ -1222,6 +1243,7 @@ fail1:
>      return status;
>  }
> 
> +__drv_requiresIRQL(PASSIVE_LEVEL)
>  NTSTATUS
>  RegistryQuerySystemStartOption(
>      IN  const CHAR                  *Prefix,
> @@ -1300,6 +1322,7 @@ fail1:
>      return status;
>  }
> 
> +__drv_requiresIRQL(PASSIVE_LEVEL)
>  static PKEY_VALUE_PARTIAL_INFORMATION
>  RegistryAnsiToSz(
>      PANSI_STRING                    Ansi
> @@ -1339,6 +1362,7 @@ fail1:
>      return NULL;
>  }
> 
> +__drv_requiresIRQL(PASSIVE_LEVEL)
>  static PKEY_VALUE_PARTIAL_INFORMATION
>  RegistryAnsiToMultiSz(
>      PANSI_STRING                    Ansi
> @@ -1392,6 +1416,7 @@ fail1:
>      return NULL;
>  }
> 
> +__drv_requiresIRQL(PASSIVE_LEVEL)
>  NTSTATUS
>  RegistryUpdateSzValue(
>      IN  HANDLE                      Key,
> @@ -1482,6 +1507,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.5.3
> 
> 
> _______________________________________________
> 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®.