Funzione ScsiPortGetPhysicalAddress (srb.h)
La routine ScsiPortGetPhysicalAddress converte un intervallo di indirizzi virtuali specificato in un intervallo di indirizzi fisici per un'operazione DMA.
Sintassi
SCSIPORT_API SCSI_PHYSICAL_ADDRESS ScsiPortGetPhysicalAddress(
[in] PVOID HwDeviceExtension,
[in] PSCSI_REQUEST_BLOCK Srb,
[in] PVOID VirtualAddress,
[out] ULONG *Length
);
Parametri
[in] HwDeviceExtension
Puntatore all'estensione del dispositivo hardware. Si tratta di un'area di archiviazione per HBA che il driver di porta alloca e inizializza per conto del driver miniport. I driver Miniport archivia in genere informazioni specifiche dell'HBA in questa estensione, ad esempio lo stato dell'HBA e gli intervalli di accesso mappati dell'HBA. Questa area è disponibile per il driver miniport nel membro DeviceExtension-HwDeviceExtension> dell'oggetto dispositivo HBA subito dopo che il driver miniport chiama ScsiPortInitialize. Il driver della porta libera questa memoria quando rimuove il dispositivo.
[in] Srb
Puntatore al blocco di richiesta SCSI se VirtualAddress da convertire proviene dal membro DataBuffer di tale SRB o, possibilmente, da SenseInfoBuffer. In caso contrario, questo parametro deve essere NULL.
[in] VirtualAddress
Puntatore all'indirizzo virtuale di base da convertire. Se questo indirizzo virtuale rientra nell'intervallo per un DataBuffer fornito da SRB, il chiamante deve anche fornire il puntatore Srb .
[out] Length
Restituisce il numero di byte mappati, a partire dall'indirizzo fisico restituito.
Valore restituito
ScsiPortGetPhysicalAddress restituisce l'indirizzo fisico corrispondente per un oggetto VirtualAddress specificato. Se l'indirizzo specificato non può essere convertito, restituisce NULL.
Commenti
I driver miniport degli HBA master del bus chiamano ScsiPortGetPhysicalAddress per ottenere intervalli di indirizzi fisici mappati da usare durante le operazioni DMA. Ad esempio, ScsiPortGetPhysicalAddress può essere usato per creare un elenco di dispersione/raccolta per i trasferimenti di dati che si estendono su pagine. Si noti che la lunghezza restituita può essere maggiore delle dimensioni di DataBuffer in un determinato SRB.
Se viene passato uno Srb non NULL, VirtualAddress deve essere compreso nell'intervallo di DataBuffer di SRB o deve essere un puntatore da SenseInfoBuffer. In caso contrario, l'oggetto VirtualAddress specificato deve trovarsi nell'estensione non memorizzata nella cache del driver miniport, nell'oggetto SrbExtension o in SenseInfoBuffer.
Un driver miniport può chiamare ScsiPortGetPhysicalAddress per convertire un indirizzo di estensione solo se la routine DriverEntry del driver miniport imposta NeedPhysicalAddresses su TRUE nel HW_INITIALIZATION_DATA quando ha chiamato ScsiPortInitialize.
A causa di vincoli su alcuni autobus, ad esempio ISA, l'indirizzo restituito da questa routine non è garantito che corrisponda all'indirizzo restituito da una routine esterna analoga (ad esempio MmGetPhysicalAddress). Un driver miniport deve chiamare solo routine ScsiPortXxx per essere portabili.
ScsiPortGetPhysicalAddress usa SCSI_PHYSICAL_ADDRESS per rappresentare gli indirizzi fisici.
typedef PHYSICAL_ADDRESS SCSI_PHYSICAL_ADDRESS, *PSCSI_PHYSICAL_ADDRESS;
Il tipo SCSI_PHYSICAL_ADDRESS è un tipo di dati indipendente dal sistema operativo usato dai driver miniport SCSI per rappresentare indirizzi fisici o un indirizzo relativo al bus.
Requisiti
Requisito | Valore |
---|---|
Piattaforma di destinazione | Desktop |
Intestazione | srb.h (include Miniport.h, Scsi.h) |
Libreria | Scsiport.lib |