BOOLEAN FxPkgPnp::PnpCheckAndIncrementRestartCount( VOID ) /*++ Routine Description: This is a mode-dependent wrapper for PnpIncrementRestartCountLogic, which determines if this device should ask the bus driver to reenumerate the device. Please refer to PnpIncrementRestartCountLogic's comment block for more information. Arguments: None Return Value: TRUE if a restart should be requested. --*/ { HRESULT hr; FxAutoRegKey restart; FxDevice* device; IWudfDeviceStack* deviceStack; WDF_PROPERTY_STORE_ROOT propertyStore; WDF_PROPERTY_STORE_DISPOSITION disposition; device = GetDevice(); deviceStack = device->GetDeviceStack(); propertyStore.LengthCb = sizeof(WDF_PROPERTY_STORE_ROOT); propertyStore.RootClass = WdfPropertyStoreRootClassHardwareKey; propertyStore.Qualifier.HardwareKey.ServiceName = L"WudfDiagnostics"; hr = deviceStack->CreateRegistryEntry(&propertyStore, WdfPropertyStoreCreateVolatile, KEY_QUERY_VALUE | KEY_SET_VALUE, L"Restart", (HKEY*)&restart.m_Key, &disposition); if (FAILED(hr)) { return FALSE; } return PnpIncrementRestartCountLogic(restart.m_Key, disposition == CreatedNewStore); }
NTSTATUS FxDriver::OpenParametersKey( VOID ) { HRESULT hr; NTSTATUS status; PFX_DRIVER_GLOBALS FxDriverGlobals = GetDriverGlobals(); PDRIVER_OBJECT_UM pDrvObj = GetDriverObject(); IWudfDeviceStack* pDevStack = (IWudfDeviceStack*)pDrvObj->WudfDevStack; UMINT::WDF_PROPERTY_STORE_ROOT rootSpecifier; UMINT::WDF_PROPERTY_STORE_RETRIEVE_FLAGS flags; CANSI_STRING serviceNameA; DECLARE_UNICODE_STRING_SIZE(serviceNameW, WDF_DRIVER_GLOBALS_NAME_LEN); HKEY hKey; RtlInitAnsiString(&serviceNameA, FxDriverGlobals->Public.DriverName); status = RtlAnsiStringToUnicodeString(&serviceNameW, &serviceNameA, FALSE); if (NT_SUCCESS(status)) { rootSpecifier.LengthCb = sizeof(UMINT::WDF_PROPERTY_STORE_ROOT); rootSpecifier.RootClass = UMINT::WdfPropertyStoreRootDriverParametersKey; rootSpecifier.Qualifier.ParametersKey.ServiceName = serviceNameW.Buffer; flags = UMINT::WdfPropertyStoreCreateIfMissing; hr = pDevStack->CreateRegistryEntry(&rootSpecifier, flags, GENERIC_ALL & ~(GENERIC_WRITE | KEY_CREATE_SUB_KEY | WRITE_DAC), NULL, &hKey, NULL); status = FxDevice::NtStatusFromHr(pDevStack, hr); if (NT_SUCCESS(status)) { m_DriverParametersKey = hKey; } } return status; }