Share via


Collegamento dell'oggetto Filter Device all'oggetto Dispositivo di destinazione

Nota

Per garantire un'affidabilità e prestazioni ottimali, usare i driver minifilter del file system con il supporto di Gestione filtri anziché i driver di filtro del file system legacy. Per convertire il driver legacy in un driver minifilter, vedere Linee guida per la conversione dei driver di filtro legacy.

Un driver di filtro del file system legacy chiama IoAttachDeviceToDeviceStackSafe per collegare l'oggetto dispositivo filtro allo stack di driver di filtro per il file system o il volume di destinazione.

devExt = myLegacyFilterDeviceObject->DeviceExtension;

status = IoAttachDeviceToDeviceStackSafe(
           myLegacyFilterDeviceObject,        //SourceDevice
           DeviceObject,                      //TargetDevice
           &devext->AttachedToDeviceObject);  //AttachedToDeviceObject

Il puntatore all'oggetto dispositivo ricevuto dal parametro di output AttachedToDeviceObject può essere diverso da TargetDevice se altri filtri sono già stati concatenati sopra l'oggetto dispositivo a cui punta (TargetDevice).

Collegamento a un file system in base al nome

Ogni file system è necessario per creare uno o più oggetti dispositivo di controllo denominati. Per connettersi direttamente a un file system specifico, un driver di filtro del file system passa il nome dell'oggetto dispositivo di controllo del file system appropriato a IoGetDeviceObjectPointer per ottenere un puntatore a oggetti del dispositivo. Il frammento di codice seguente illustra come ottenere un puntatore di questo tipo a uno dei due oggetti dispositivo di controllo per il file system RAW:

RtlInitUnicodeString(&nameString, L"\\Device\\RawDisk");

status = IoGetDeviceObjectPointer(
            &nameString,                    //ObjectName
            FILE_READ_ATTRIBUTES,           //DesiredAccess
            &fileObject,                    //FileObject
            &rawDeviceObject);              //DeviceObject

if (NT_SUCCESS(status)) {
            ObDereferenceObject(fileObject);
}

Se la chiamata a IoGetDeviceObjectPointer ha esito positivo, il driver di filtro del file system può quindi chiamare IoAttachDeviceToDeviceStackSafe per collegarsi all'oggetto dispositivo di controllo restituito.

Oltre al puntatore a oggetti del dispositivo di controllo (rawDeviceObject), IoGetDeviceObjectPointer restituisce un puntatore a un oggetto file (fileObject) che rappresenta l'oggetto dispositivo in modalità utente. Nel frammento di codice l'oggetto file non è necessario, quindi viene chiuso chiamando ObDereferenceObject. È importante notare che il decremento del conteggio dei riferimenti sull'oggetto file restituito da IoGetDeviceObjectPointer fa sì che anche il conteggio dei riferimenti sull'oggetto dispositivo venga decrementato. Pertanto, i puntatori fileObject e rawDeviceObject devono essere considerati non validi dopo la chiamata precedente a ObDereferenceObject, a meno che il conteggio dei riferimenti nell'oggetto dispositivo non venga incrementato da un'altra chiamata a ObReferenceObject prima che ObDereferenceObject venga chiamato per l'oggetto file.