Condividi tramite


Una singola routine DispatchCreateClose

Molti conducenti, in particolare driver di livello inferiore in una catena di conducenti a più livelli, devono semplicemente stabilire la loro esistenza al ricevimento di una richiesta di creazione e semplicemente devono confermare la ricezione di una richiesta di chiusura .

Ad esempio, un driver di porta per un controller di dispositivo con uno o più driver di classe strettamente associati che chiamano IoGetDeviceObjectPointer potrebbe avere una routine DispatchCreateClose minima. La routine potrebbe non eseguire altro che completare l'IRP come indicato di seguito:

    :    : 
{ 
    Irp->IoStatus.Status = STATUS_SUCCESS; 
 Irp->IoStatus.Information = 0; 
    IoCompleteRequest(Irp, IO_NO_INCREMENT); 
 return STATUS_SUCCESS; 
}

Questa routine DispatchCreateClose minima imposta il membro Information del blocco di stato di I/O su zero, a indicare che l'oggetto file viene aperto per una richiesta di creazione; Le informazioni non hanno alcun significato per una richiesta di chiusura. La routine imposta il membro Status su STATUS_SUCCESS e restituisce anche questo valore di stato, a indicare che il driver è pronto per accettare le richieste di I/O.

Questa routine DispatchCreateClose minima completa l'IRP di creazione senza aumentare la priorità dell'origine dell'IRP (IO_NO_INCREMENT), perché si presuppone che l'originatore attenda un intervallo indeterminato ma molto ridotto per il completamento della richiesta.

Il funzionamento di una routine DispatchCreateClose dipende in parte dalla natura del dispositivo del driver o dal dispositivo sottostante e in parte dalla progettazione del driver. Se un driver esegue operazioni molto diverse per creare e chiudere le richieste, deve gestire queste richieste in routine DispatchCreate e DispatchClose separate.

Per gestire una richiesta di creazione per aprire un oggetto file che rappresenta un dispositivo logico o fisico, un driver di livello più alto deve eseguire le operazioni seguenti:

  1. Chiamare IoGetCurrentIrpStackLocation per ottenere un puntatore alla relativa posizione dello stack di I/O in IRP.

  2. Controllare FileObject. FileName nel percorso dello stack di I/O e completare l'IRP con STATUS_SUCCESS se la stringa Unicode in FileName ha una lunghezza zero; in caso contrario, completare l'IRP con STATUS_INVALID_PARAMETER.

Seguendo i passaggi precedenti si garantisce che nessun tentativo di aprire uno pseudofile in un dispositivo possa causare problemi in un secondo momento. Ciò impedisce, ad esempio, di aprire un oggetto \\device\parallel0\temp.dat inesistente.