[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [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> --- 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |