X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=ntoskrnl%2Fio%2Fpnpmgr%2Fplugplay.c;h=9aafd0791869ba93d7cf1c7a917281751d0d9f57;hp=83a4cb6000886ef6ed75bf9bfed2cd3d45d74cca;hb=12fdc129cf8185ddaa038913de6d9479498b5841;hpb=dd11f4c34b66a6fe8229127d03e01f33024e1b4b diff --git a/ntoskrnl/io/pnpmgr/plugplay.c b/ntoskrnl/io/pnpmgr/plugplay.c index 83a4cb60008..9aafd079186 100644 --- a/ntoskrnl/io/pnpmgr/plugplay.c +++ b/ntoskrnl/io/pnpmgr/plugplay.c @@ -359,40 +359,61 @@ IopGetDeviceProperty(PPLUGPLAY_CONTROL_PROPERTY_DATA PropertyData) } else { -// DEVICE_CAPABILITIES DeviceCapabilities; + DEVICE_CAPABILITIES DeviceCapabilities; PCM_POWER_DATA PowerData; - -// Status = IopQueryDeviceCapabilities(DeviceNode, &DeviceCapabilities); + IO_STACK_LOCATION Stack; + IO_STATUS_BLOCK IoStatusBlock; PowerData = (PCM_POWER_DATA)Buffer; - RtlZeroMemory(PowerData, sizeof(CM_POWER_DATA)); PowerData->PD_Size = sizeof(CM_POWER_DATA); -// PowerData->PD_MostRecentPowerState; - PowerData->PD_Capabilities = PDCAP_D0_SUPPORTED | PDCAP_D3_SUPPORTED; -/* - if (DeviceCapabilities.DeviceD1) - PowerData->PD_Capabilities |= PDCAP_D1_SUPPORTED; - if (DeviceCapabilities.DeviceD2) - PowerData->PD_Capabilities |= PDCAP_D2_SUPPORTED; - if (DeviceCapabilities.WakeFromD0) - PowerData->PD_Capabilities |= PDCAP_WAKE_FROM_D0_SUPPORTED; - if (DeviceCapabilities.WakeFromD1) - PowerData->PD_Capabilities |= PDCAP_WAKE_FROM_D1_SUPPORTED; - if (DeviceCapabilities.WakeFromD2) - PowerData->PD_Capabilities |= PDCAP_WAKE_FROM_D2_SUPPORTED; - if (DeviceCapabilities.WakeFromD3) - PowerData->PD_Capabilities |= PDCAP_WAKE_FROM_D3_SUPPORTED; - if (DeviceCapabilities.WarmEjectSupported) - PowerData->PD_Capabilities |= PDCAP_WARM_EJECT_SUPPORTED; - PowerData->PD_D1Latency = DeviceCapabilities.D1Latency; - PowerData->PD_D2Latency = DeviceCapabilities.D2Latency; - PowerData->PD_D3Latency = DeviceCapabilities.D3Latency; - RtlCopyMemory(&PowerData->PD_PowerStateMapping, - &DeviceCapabilities.DeviceState, - sizeof(DeviceCapabilities.DeviceState)); - PowerData->PD_DeepestSystemWake = DeviceCapabilities.SystemWake; -*/ + + RtlZeroMemory(&DeviceCapabilities, sizeof(DEVICE_CAPABILITIES)); + DeviceCapabilities.Size = sizeof(DEVICE_CAPABILITIES); + DeviceCapabilities.Version = 1; + DeviceCapabilities.Address = -1; + DeviceCapabilities.UINumber = -1; + + Stack.Parameters.DeviceCapabilities.Capabilities = &DeviceCapabilities; + + Status = IopInitiatePnpIrp(DeviceObject, + &IoStatusBlock, + IRP_MN_QUERY_CAPABILITIES, + &Stack); + if (NT_SUCCESS(Status)) + { + DPRINT("Got device capabiliities\n"); + + PowerData->PD_MostRecentPowerState = PowerDeviceD0; // FIXME + if (DeviceCapabilities.DeviceD1) + PowerData->PD_Capabilities |= PDCAP_D1_SUPPORTED; + if (DeviceCapabilities.DeviceD2) + PowerData->PD_Capabilities |= PDCAP_D2_SUPPORTED; + if (DeviceCapabilities.WakeFromD0) + PowerData->PD_Capabilities |= PDCAP_WAKE_FROM_D0_SUPPORTED; + if (DeviceCapabilities.WakeFromD1) + PowerData->PD_Capabilities |= PDCAP_WAKE_FROM_D1_SUPPORTED; + if (DeviceCapabilities.WakeFromD2) + PowerData->PD_Capabilities |= PDCAP_WAKE_FROM_D2_SUPPORTED; + if (DeviceCapabilities.WakeFromD3) + PowerData->PD_Capabilities |= PDCAP_WAKE_FROM_D3_SUPPORTED; + if (DeviceCapabilities.WarmEjectSupported) + PowerData->PD_Capabilities |= PDCAP_WARM_EJECT_SUPPORTED; + PowerData->PD_D1Latency = DeviceCapabilities.D1Latency; + PowerData->PD_D2Latency = DeviceCapabilities.D2Latency; + PowerData->PD_D3Latency = DeviceCapabilities.D3Latency; + RtlCopyMemory(&PowerData->PD_PowerStateMapping, + &DeviceCapabilities.DeviceState, + sizeof(DeviceCapabilities.DeviceState)); + PowerData->PD_DeepestSystemWake = DeviceCapabilities.SystemWake; + } + else + { + DPRINT("IRP_MN_QUERY_CAPABILITIES failed (Status 0x%08lx)\n", Status); + + PowerData->PD_Capabilities = PDCAP_D0_SUPPORTED | PDCAP_D3_SUPPORTED; + PowerData->PD_MostRecentPowerState = PowerDeviceD0; + } } } else if (Property == PNP_PROPERTY_REMOVAL_POLICY_OVERRIDE)