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