Leggere in inglese

Condividi tramite


Macro WdfDeviceStopIdle (wdfdevice.h)

[si applica a KMDF e UMDF]

Il metodo WdfDeviceStopIdle informa il framework che il dispositivo specificato deve essere posizionato nello stato di alimentazione funzionante (D0).

Sintassi

NTSTATUS WdfDeviceStopIdle(
   _In_ WDFDEVICE Device,
   _In_ BOOLEAN WaitForD0
);

Parametri

[in] Device

Handle per un oggetto dispositivo framework.

[in] WaitForD0

Valore booleano che indica quando verrà restituito WdfDeviceStopIdle. Se TRUE, restituisce solo dopo che il dispositivo specificato ha immesso lo stato di alimentazione del dispositivo D0. Se FALSE, il metodo restituisce immediatamente .

Valore restituito

Nessuno

Osservazioni:

Questa macro può restituire i valori seguenti:

Valore restituito Significato
STATUS_PENDING Il dispositivo viene alimentato in modo asincrono.
STATUS_INVALID_DEVICE_STATE Il driver non è il proprietario dei criteri di alimentazione per il dispositivo.
STATUS_POWER_STATE_INVALID Si è verificato un errore del dispositivo e il dispositivo non può entrare nello stato di alimentazione D0.

Il metodo potrebbe restituire altri valori NTSTATUS.

Nota

Per i dispositivi che specificano SystemManagedIdleTimeout o SystemManagedIdleTimeoutWithHint nell'enumerazione WDF_POWER_POLICY_IDLE_TIMEOUT_TYPE, quando si chiama WdfDeviceStopIdle con WaitForD0 impostato su FALSE, se il dispositivo è ancora in D0 e il periodo di timeout di inattività non è ancora trascorso, a partire dalle versioni WDF 1.33/2.33, WdfDeviceStopIdle restituisce STATUS_SUCCESS (nelle versioni precedenti viene restituito un valore restituito di STATUS_PENDING).

Se il driver fornisce un handle di oggetto non valido, si verifica un controllo di bug.

Se il dispositivo può entrare in uno stato a basso consumo quando diventa inattivo, il driver potrebbe dover chiamare occasionalmente WdfDeviceStopIdle per riportare il dispositivo al suo stato di lavoro (D0) o per impedirne l'ingresso in uno stato a basso consumo.

WdfDeviceStopIdle non impedisce al framework di passare il dispositivo a uno stato di sospensione quando il sistema passa a uno stato di sospensione Sx. Il suo unico effetto è quello di impedire transizioni agli stati di sospensione Dx mentre il sistema si trova nello stato di lavoro S0. Analogamente, se il dispositivo supporta risparmio energia diretta, WdfDeviceStopIdle non impedisce al dispositivo di immettere l'alimentazione diretta.

Avviso

Non chiamare WdfDeviceStopIdle con WaitForD0 = TRUE durante l'accensione, direttamente o indirettamente. Ad esempio, se il EvtDeviceArmWakeFromS0 il callback attende su un altro thread che chiama WdfDeviceStopIdle(TRUE), la transizione di alimentazione viene bloccata e il sistema si arresta in modo anomalo.

Il driver non deve chiamare WdfDeviceStopIdle quando un dispositivo è inattivo e il framework inserisce una richiesta di I/O nella coda di I/O gestita dal dispositivo. Inoltre, il driver non deve chiamare WdfDeviceStopIdle quando un dispositivo è inattivo e rileva un segnale di riattivazione. In entrambi questi casi, il framework richiede al conducente del bus di ripristinare lo stato di alimentazione del dispositivo su D0.

Anche se i driver in genere non devono chiamare WdfDeviceStopIdle quando gestiscono le richieste di I/O che ottengono da una coda di I/O gestita dall'alimentazione, la chiamata è consentita. Tuttavia, i driver non devono impostare il parametro WaitForD0TRUE quando si gestiscono le richieste di I/O da una coda di I/O gestita dall'alimentazione.

Il driver deve chiamare WdfDeviceStopIdle se deve accedere al dispositivo a causa di una richiesta che il driver ha ricevuto all'esterno di una coda di I/O gestita dall'alimentazione. Ad esempio, il driver potrebbe supportare un'interfaccia definita dal driver o una richiesta WMI che richiede l'accesso al dispositivo. In questo caso, è necessario assicurarsi che il dispositivo sia nello stato di funzionamento prima che il driver acceda al dispositivo e che il dispositivo rimanga nello stato di lavoro fino al termine dell'accesso al dispositivo.

La chiamata WdfDeviceStopIdle forza lo stato di funzionamento (D0) del dispositivo, se il sistema è nello stato funzionante (S0). Il dispositivo rimane nello stato di lavoro fino a quando il driver non chiama WdfDeviceResumeIdle, a questo punto il framework può posizionare il dispositivo in uno stato a basso consumo se rimane inattiva.

Non chiamare WdfDeviceStopIdle prima che il framework abbia chiamato il evtDeviceD0Entry funzione di callback del driver per la prima volta.

Una chiamata a WdfDeviceStopIdle può ripristinare lo stato di funzionamento di un dispositivo inattivo solo se il sistema si trova nello stato di lavoro (S0). Se il sistema passa a uno stato a basso consumo o il dispositivo è già stato spento in risposta a Sx (dove x > 0) quando un driver chiama WdfDeviceStopIdle con il parametro WaitForD0 impostato su TRUE, la funzione non restituisce fino a quando il sistema non torna allo stato S0. Analogamente, se il dispositivo supporta risparmio energia direttae il sottosistema di alimentazione ha avviato una potenza diretta, una chiamata a WdfDeviceStopIdle con il parametro WaitForD0 impostato su TRUE, non restituisce fino a quando il sottosistema di alimentazione non ha indirizzato il dispositivo a eseguire il backup.

Ogni chiamata riuscita a WdfDeviceStopIdle deve essere seguita da una chiamata a WdfDeviceResumeIdleoppure il dispositivo non tornerà mai a uno stato a basso consumo se diventa nuovamente inattivo. Le chiamate a WdfDeviceStopIdle possono essere annidate, pertanto il numero di chiamate a WdfDeviceResumeIdle deve corrispondere al numero di chiamate a WdfDeviceStopIdle. Non chiamare WdfDeviceResumeIdle se una chiamata a WdfDeviceStopIdle ha esito negativo.

Se il sistema entra in uno stato a basso consumo dopo WdfDeviceStopIdle, il dispositivo passa anche a uno stato a basso consumo. Quando il sistema torna allo stato di lavoro (S0), il dispositivo torna allo stato di lavoro (D0). Il riferimento di alimentazione dalla chiamata a WdfDeviceStopIdle rimane attivo e impedisce al dispositivo di entrare in uno stato a basso consumo finché non è presente una chiamata corrispondente a WdfDeviceResumeIdle.

Per altre informazioni, vedere Supporto dell'di risparmio di energia inattivo.

Se WaitForD0 è TRUE, WdfDeviceStopIdle deve essere chiamato in IRQL = PASSIVE_LEVEL. Se WaitForD0 è FALSE, questo metodo deve essere chiamato in IRQL <= DISPATCH_LEVEL.

Chiamando WdfDeviceStopIdleWithTag anziché WdfDeviceStopIdle fornisce informazioni aggiuntive (valore del tag, numero di riga e nome file) che è possibile visualizzare nei debugger Microsoft.

Esempi

Nell'esempio di codice seguente WdfDeviceStopIdle viene restituito dopo che il dispositivo specificato ha immesso lo stato di alimentazione del dispositivo D0.

NTSTATUS  status;

status = WdfDeviceStopIdle(Device, TRUE);

Requisiti

Requisito Valore
Piattaforma di destinazione Universale
versione minima di KMDF 1.0
versione minima di UMDF 2.0
intestazione wdfdevice.h (include Wdf.h)
Biblioteca Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF)
IRQL Vedere la sezione Osservazioni.
regole di conformità DDI DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

Vedere anche