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

Re: [win-pv-devel] [BACKPORT:staging-8.2] Added a function called from DriverEntry where...



> -----Original Message-----
> From: owen.smith@xxxxxxxxxx [mailto:owen.smith@xxxxxxxxxx]
> Sent: 12 July 2017 18:00
> To: win-pv-devel@xxxxxxxxxxxxxxxxxxxx
> Cc: Eric Mackay <mackayem@xxxxxxxxxx>; Paul Durrant
> <Paul.Durrant@xxxxxxxxxx>
> Subject: [BACKPORT:staging-8.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>
> ---
> 
> v2:
>  - Remove unused FeatureName array
>  - Make more use of const qualifier for override name
> 
> Fixed git cherry-pick conflicts for backport to staging-8.2
> 
> Backported-by: Owen Smith <owen.smith@xxxxxxxxxx>

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

> ---
>  src/xenvbd/driver.c   |  97 +++++++++++++++++--
>  src/xenvbd/driver.h   |  33 ++++++-
>  src/xenvbd/frontend.c | 257 ++++++++++++++++++++++++++++++++------
> ------------
>  src/xenvbd/registry.c |  26 +++++
>  src/xenvbd/registry.h |  25 ++++-
>  5 files changed, 337 insertions(+), 101 deletions(-)
> 
> diff --git a/src/xenvbd/driver.c b/src/xenvbd/driver.c
> index 4438023..8ce98f6 100644
> --- a/src/xenvbd/driver.c
> +++ b/src/xenvbd/driver.c
> @@ -43,13 +43,21 @@
>  #include <xencrsh_interface.h>
>  #include <xenvbd-ntstrsafe.h>
> 
> +// Feature Overrides From Registry Values
> +typedef struct _XENVBD_FEATURE_OVERRIDE {
> +    const CHAR                  *Name;
> +    ULONG                       Value;
> +    BOOLEAN                     Present;
> +} XENVBD_FEATURE_OVERRIDE, *PXENVBD_FEATURE_OVERRIDE;
> +
>  typedef struct _XENVBD_DRIVER {
> -    HANDLE              ParametersKey;
> -    PDRIVER_DISPATCH    StorPortDispatchPnp;
> -    PDRIVER_DISPATCH    StorPortDispatchPower;
> -    PDRIVER_UNLOAD      StorPortDriverUnload;
> -    PXENVBD_FDO         Fdo;
> -    KSPIN_LOCK          Lock;
> +    HANDLE                      ParametersKey;
> +    PDRIVER_DISPATCH            StorPortDispatchPnp;
> +    PDRIVER_DISPATCH            StorPortDispatchPower;
> +    PDRIVER_UNLOAD              StorPortDriverUnload;
> +    PXENVBD_FDO                 Fdo;
> +    KSPIN_LOCK                  Lock;
> +    XENVBD_FEATURE_OVERRIDE     FeatureOverride[NumberOfFeatures];
>  } XENVBD_DRIVER;
> 
>  static XENVBD_DRIVER Driver;
> @@ -493,7 +501,80 @@ DriverUnload(
>      Trace("<=== (Irql=%d)\n", KeGetCurrentIrql());
>  }
> 
> -DRIVER_INITIALIZE           DriverEntry;
> +__drv_requiresIRQL(PASSIVE_LEVEL)
> +static FORCEINLINE VOID
> +__DriverInitializeOverrides(
> +    VOID
> +    )
> +{
> +    ULONG           Index;
> +    struct {
> +        const CHAR      *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;
> +        const CHAR      *Name = Mapping[Index].Name;
> +        ULONG           Value;
> +        NTSTATUS        status;
> +
> +        Driver.FeatureOverride[Feature].Name = Name;
> +
> +        status = RegistryQueryDwordValue(__DriverGetParametersKey(),
> +                                         (PCHAR)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
> +const CHAR *
> +DriverGetFeatureName(
> +    IN  XENVBD_FEATURE  Feature
> +    )
> +{
> +    return (Feature < ARRAYSIZE(Driver.FeatureOverride)) ?
> +           Driver.FeatureOverride[Feature].Name :
> +           NULL;
> +}
> +
> +DRIVER_INITIALIZE   DriverEntry;
> 
>  NTSTATUS
>  DriverEntry(
> @@ -547,6 +628,8 @@ DriverEntry(
>      __DriverParseOption("XENVBD:PVCDROM=",
>                          &DriverParameters.PVCDRom);
> 
> +    __DriverInitializeOverrides();
> +
>      RtlZeroMemory(&InitData, sizeof(InitData));
> 
>      InitData.HwInitializationDataSize   =   sizeof(InitData);
> diff --git a/src/xenvbd/driver.h b/src/xenvbd/driver.h
> index e7730a9..8b8095b 100644
> --- a/src/xenvbd/driver.h
> +++ b/src/xenvbd/driver.h
> @@ -103,4 +103,35 @@ DriverFormatFree(
>      __in __drv_freesMem(mem) PCHAR Buffer
>      );
> 
> -#endif // _XENVBD_XENVBD_H
> +// 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 const CHAR *
> +DriverGetFeatureName(
> +    IN  XENVBD_FEATURE  Feature
> +    );
> +
> +#endif // _XENVBD_DRIVER_H
> diff --git a/src/xenvbd/frontend.c b/src/xenvbd/frontend.c
> index 227b93b..4ec159b 100644
> --- a/src/xenvbd/frontend.c
> +++ b/src/xenvbd/frontend.c
> @@ -618,15 +618,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;
> +    const CHAR              *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->Store,
> +                              NULL,
> +                              Frontend->BackendPath,
> +                              (PCHAR)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;
> -    ULONG           Override;
> -    BOOLEAN         Old = *Value;
> +    NTSTATUS                status;
> +    PCHAR                   Buffer;
> +    BOOLEAN                 Old = *Value;
> 
>      status = XENBUS_STORE(Read,
>                            Frontend->Store,
> @@ -638,34 +678,67 @@ FrontendReadFeature(
>          return FALSE;   // no value, unchanged
> 
>      *Value = !!(strtoul(Buffer, NULL, 10));
> +
>      XENBUS_STORE(Free,
>                      Frontend->Store,
>                      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;
> +    const CHAR              *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->Store,
> +                              NULL,
> +                              Frontend->BackendPath,
> +                              (PCHAR)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
> -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->Store,
> @@ -681,29 +754,19 @@ FrontendReadValue32(
>                      Frontend->Store,
>                      Buffer);
> 
> -    // check registry for disable-override
> -    if (AllowOverride) {
> -        status = RegistryQueryDwordValue(DriverGetParametersKey(),
> -                                        Name,
> -                                        &Override);
> -        if (NT_SUCCESS(status)) {
> -            *Value = Override;
> -        }
> -    }
> -
>      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->Store,
> @@ -715,6 +778,7 @@ FrontendReadValue64(
>          return FALSE;   // no value, unchanged
> 
>      *Value = _strtoui64(Buffer, NULL, 10);
> +
>      XENBUS_STORE(Free,
>                      Frontend->Store,
>                      Buffer);
> @@ -724,48 +788,49 @@ FrontendReadValue64(
> 
>  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;
> @@ -789,40 +854,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,
> @@ -832,40 +898,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);
> 
> @@ -877,6 +947,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,
> @@ -1238,6 +1309,8 @@ FrontendDisable(
> 
> 
> //=========================================================
> ====================
>  // Init/Term
> +_IRQL_requires_(DISPATCH_LEVEL)
> +_Requires_lock_held_(Frontend->StateLock)
>  static DECLSPEC_NOINLINE NTSTATUS
>  __FrontendSetState(
>      __in  PXENVBD_FRONTEND        Frontend,
> @@ -1413,6 +1486,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 +1494,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.8.3


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