[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
> -----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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |