IRP_MN_DEVICE_USAGE_NOTIFICATION

I componenti di sistema inviano questo IRP per chiedere ai driver di un dispositivo se il dispositivo può supportare un file speciale. I file speciali includono file di paging, file di dump e file di ibernazione. Se tutti i driver per il dispositivo hanno esito positivo, il sistema crea il file speciale. Il sistema invia anche questo IRP per informare i driver che un file speciale è stato rimosso dal dispositivo.

I driver di funzione devono gestire questo IRP se il dispositivo può contenere un file di paging, un file di dump o un file di ibernazione. I driver di filtro devono gestire questo IRP se il driver di funzione che filtra gestisce l'IRP. I driver del bus devono gestire questa IRP per l'adattatore o il controller (FDO del bus) e per i dispositivi figlio (PDO figlio).

Valore

0x16

Codice principale

IRP_MJ_PNP

Data di invio

Il sistema invia questo IRP durante la creazione o l'eliminazione di un file di paging, un file di dump o un file di ibernazione. Se un dispositivo ha una relazione di risparmio energia che rientra all'esterno della relazione padre-figlio convenzionale, il driver può inviare questa IRP per propagare le informazioni sull'utilizzo dei dispositivi a un altro stack di dispositivi. Per altre informazioni, vedere la descrizione della richiesta PowerRelations in IRP_MN_QUERY_DEVICE_RELATIONS.

I componenti di sistema e i driver inviano l'IRP in irQL PASSIVE_LEVEL in un contesto di thread arbitrario.

Parametri di input

Il membro Parameters.UsageNotification.InPath della struttura IO_STACK_LOCATION è un valore BOOLEAN. Quando questo parametro è TRUE, il sistema sta creando un paging, un dump di arresto anomalo o un file di ibernazione nel dispositivo. Quando InPath è FALSE, tale file è stato rimosso dal dispositivo.

Parameters.UsageNotification.Type è un'enumerazione che indica il tipo di file. Questo parametro ha uno dei valori seguenti: DeviceUsageTypePaging, DeviceUsageTypeDumpFile o DeviceUsageTypeHibernation.

Parametri di output

Nessuno

Blocco dello stato I/O

I driver impostano Irp-IoStatus.Status> su STATUS_SUCCESS o su uno stato di errore appropriato.

I driver non modificano il campo Irp-IoStatus.Information>. Rimane a zero, come impostato dal componente che invia l'IRP.

Operazione

Un driver gestisce l'IRP nel modo in cui l'IRP viene eseguito verso il basso dello stack di dispositivi e nel modo in cui viene eseguito il backup dello stack.

Un driver risponde a questa IRP con una procedura simile alla seguente:

  • Se Parameters.UsageNotification.InPath è TRUE, determinare se il dispositivo supporta il file speciale.

    Un driver deve testare parametri specifici.UsageNotification.Type(s) che il driver può supportare. Altri tipi di notifica potrebbero essere aggiunti in futuro.

    Vedere altre informazioni di seguito che descrivono le azioni necessarie per supportare ogni tipo di notifica.

    Se Parameters.UsageNotification.InPath è TRUE e il driver non può supportare il file speciale nel dispositivo, il driver deve completare l'IRP con uno stato di errore.

  • Se il dispositivo supporta il file speciale:

    1. Eseguire azioni appropriate per riflettere che il dispositivo ora contiene o non contiene più un file speciale.

      In genere un driver incrementa o decrementa un contatore. Ad esempio, se Parameters.UsageNotification.Type è DeviceUsageTypePaging e Parameters.UsageNotification.InPath è TRUE, aumentare un conteggio del numero di file di paging nel dispositivo. Alcune routine di invio driver devono controllare i contatori.

      Un dispositivo che contiene un file speciale non deve essere disabilitato. Un driver può chiamare IoInvalidateDeviceState, richiedendo alla gestione PnP di eseguire nuovamente una query per le informazioni sullo stato del dispositivo PnP del dispositivo. In risposta al IRP_MN_QUERY_PNP_DEVICE_STATE IRP risultante, il driver deve impostare il flag di PNP_DEVICE_NOT_DISABLEABLE.

      Se InPath è FALSE, un driver imposta il bit di DO_POWER_PAGABLE nel relativo oggetto dispositivo per il dispositivo.

    2. Propagare le informazioni sull'utilizzo del dispositivo a tutti i dispositivi correlati che richiedono le informazioni.

      Come parte della gestione di un IRP_MN_DEVICE_USAGE_NOTIFICATION IRP, un driver potrebbe essere necessario per passare le informazioni a uno o più stack di dispositivi. Tale driver crea una nuova IRP_MN_DEVICE_USAGE_NOTIFICATION IRP (o IRP) e li invia allo stack di dispositivi appropriato (o stack). Il driver deve attendere il completamento di qualsiasi IRP di notifica dell'utilizzo del dispositivo inviato prima che il driver finisca l'elaborazione dell'IRP di utilizzo del dispositivo ricevuta.

      Come identificare i dispositivi correlati è specifico del dispositivo e del driver. In genere, un driver invia l'IRP ad altri driver a cui invia richieste di I/O per il file. Quando un driver del bus gestisce questa richiesta per un dispositivo figlio, deve inviare un'IRP di notifica di utilizzo allo stack di dispositivi per l'elemento padre del dispositivo.

      Ad esempio, quando ftdisk esegue un set di striping a cinque dischi, propaga le notifiche di paging a ognuno di questi cinque dischi, poiché ognuno di questi dispositivi può essere necessario per gestire le operazioni di paging dei file.

    3. In una funzione o un driver di filtro impostare una routine IoCompletion .

    4. In una funzione o un driver di filtro impostare Irp-IoStatus.Status> su STATUS_SUCCESS, configurare il percorso dello stack successivo e passare l'IRP al driver inferiore successivo con IoCallDriver. Non completare l'IRP.

      In un driver del bus che gestisce l'IRP per un PDO figlio: impostare Irp-IoStatus.Status> e completare l'IRP (IoCompleteRequest).

    5. Durante l'elaborazione del completamento di IRP:

      Se una routine IoCompletion rileva che un driver inferiore ha avuto esito negativo, la funzione o il driver di filtro deve annullare le operazioni eseguite in risposta all'IRP e propagare l'errore. Se la funzione o il driver di filtro hanno propagato le informazioni sull'utilizzo a qualsiasi altro stack di dispositivi, il driver deve inviare un'altra IRP di utilizzo a tali stack per notificarli dell'errore.

      Se lo stato è STATUS_SUCCESS e InPath è TRUE, deselezionare il bit di DO_POWER_PAGABLE.

Vedere Plug and Play per le regole generali per la gestione di irp secondari Plug and Play.

Supporto di paging, dump di arresto anomalo e file di ibernazione in un dispositivo

Quando uno dei conteggi dei file speciali di un driver è diverso da zero, il driver deve supportare la presenza dei file speciali nel dispositivo (o un dispositivo discendente).

Per un file DeviceUsageTypePaging creato nel dispositivo, un driver deve eseguire le operazioni seguenti:

  • Bloccare il codice in memoria per le routine DispatchRead, DispatchWrite, DispatchDeviceControl e DispatchPower .

  • Cancellare il bit di DO_POWER_PAGABLE bit nel relativo oggetto dispositivo per il dispositivo (nel modo in cui si trova lo stack di dispositivi).

  • Non è possibile IRP_MN_QUERY_STOP_DEVICE e IRP_MN_QUERY_REMOVE_DEVICE richieste per il dispositivo.

Per un file DeviceUsageTypeDumpFile nel dispositivo, un driver deve eseguire le operazioni seguenti:

  • Bloccare il codice in memoria per le routine DispatchRead, DispatchWrite, DispatchDeviceControl e DispatchPower .

  • Non prendere il dispositivo dallo stato D0.

    Non registrare il dispositivo per il rilevamento inattiva (PoRegisterDeviceForIdleDetection). Se il dispositivo è già registrato, annullare la registrazione. Se il driver esegue il proprio rilevamento inattiva per il dispositivo, sospendere tale rilevamento.

  • Cancellare il bit di DO_POWER_PAGABLE bit nel relativo oggetto dispositivo per il dispositivo (nel modo in cui si trova lo stack di dispositivi).

  • Non è possibile IRP_MN_QUERY_STOP_DEVICE e IRP_MN_QUERY_REMOVE_DEVICE richieste per il dispositivo.

Per un file DeviceUsageTypeHibernation nel dispositivo, un driver deve eseguire le operazioni seguenti:

  • Bloccare il codice in memoria per le routine DispatchRead, DispatchWrite, DispatchDeviceControl e DispatchPower .

  • Assicurarsi che il dispositivo si trova nello stato D0 quando il driver riceve un'IRP di alimentazione del sistema S4 che indica che il sistema sta per ibernare.

  • Non attivare il dispositivo in risposta a un'IRP di alimentazione D3 che fa parte di un'azione di ibernazione S4. Per altre informazioni, vedere Azioni di power system .

    Al momento della ricezione di un'IRP impostata su D3, eseguire tutte le attività necessarie per inserire il dispositivo nello stato D3, ad eccezione dell'alimentazione del dispositivo e notificando il risparmio energia (PoSetPowerState). Il dispositivo deve conservare l'alimentazione fino a quando non è stato scritto il file di ibernazione.

  • Cancellare il bit di DO_POWER_PAGABLE bit nel relativo oggetto dispositivo per il dispositivo (nel modo in cui si trova lo stack di dispositivi).

  • Non è possibile IRP_MN_QUERY_STOP_DEVICE e IRP_MN_QUERY_REMOVE_DEVICE richieste per il dispositivo.

Per altre informazioni sugli stati di alimentazione del dispositivo, sugli indirizzi IP di alimentazione e sul supporto della gestione delle energia nei driver, vedere Power Management.See Power Management for more information about device power states, power IRPs e supportato power management in driver.

Invio di questo IRP

Un driver può inviare un'IRP_MN_DEVICE_USAGE_INFORMATION IRP, ma solo per propagare le informazioni sull'utilizzo dei dispositivi in un altro stack di dispositivi. Un driver non è mai l'origine iniziale delle informazioni sull'utilizzo del dispositivo.

Requisiti

Intestazione

Wdm.h (include Wdm.h, Ntddk.h o Ntifs.h)

Vedi anche

DispatchDeviceControl

DispatchPower

DispatchRead

DispatchWrite

IoAdjustPagingPathCount

IoCallDriver

IoCompleteRequest

IO_STACK_LOCATION

IRP_MJ_PNP

IRP_MN_QUERY_DEVICE_RELATIONS

IRP_MN_QUERY_PNP_DEVICE_STATE

IRP_MN_QUERY_REMOVE_DEVICE

IRP_MN_QUERY_STOP_DEVICE

PoRegisterDeviceForIdleDetection

PoSetPowerState