[prev in list] [next in list] [prev in thread] [next in thread]
List: win-pv-devel
Subject: Re: [win-pv-devel] [PATCH] Added a function called from DriverEntry where we can safely read registr
From: Paul Durrant <Paul.Durrant () citrix ! com>
Date: 2017-06-27 15:53:54
Message-ID: 9368ecb09e204973932bffbf780304e5 () AMSPEX02CL03 ! citrite ! net
[Download RAW message or body]
> -----Original Message-----
> From: Mackay, Eric [mailto:mackayem@amazon.com]
> Sent: 27 June 2017 16:09
> To: Paul Durrant <Paul.Durrant@citrix.com>; win-pv-
> devel@lists.xenproject.org
> 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@citrix.com]
> Sent: Tuesday, June 27, 2017 7:55 AM
> To: Mackay, Eric <mackayem@amazon.com>; win-pv-
> devel@lists.xenproject.org
> 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@lists.xenproject.org]
> > On Behalf Of Eric Mackay
> > Sent: 26 June 2017 20:46
> > To: win-pv-devel@lists.xenproject.org
> > Cc: Eric Mackay <mackayem@amazon.com>
> > 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@amazon.com>
>
> Generally this looks ok so
>
> Acked-by: Paul Durrant <paul.durrant@citrix.com>
>
> 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@lists.xenproject.org
> > https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic