Share via


NDK_FN_BUILD_LAM Rückruffunktion (ndkpi.h)

Die Funktion NdkBuildLam (NDK_FN_BUILD_LAM) ruft eine Adapter-Lam (Logical Address Mapping) vom NDK-Anbieter für einen nahezu zusammenhängenden Speicherbereich ab.

Syntax

NDK_FN_BUILD_LAM NdkFnBuildLam;

NTSTATUS NdkFnBuildLam(
  [in]           NDK_ADAPTER *pNdkAdapter,
  [in]           MDL *Mdl,
  [in]           SIZE_T Length,
  [in]           NDK_FN_REQUEST_COMPLETION RequestCompletion,
  [in, optional] PVOID RequestContext,
                 NDK_LOGICAL_ADDRESS_MAPPING *pNdkLAM,
                 ULONG *pLAMSize,
  [out]          ULONG *pFBO
)
{...}

Parameter

[in] pNdkAdapter

Ein Zeiger auf ein NDK-Adapterobjekt (NDK_ADAPTER).

[in] Mdl

Eine Speicherdeskriptorliste (Memory Descriptor List, MDL) oder eine Kette von MDLs. Der Teil der MDL-Kette von der virtuellen Startadresse bis zur Anzahl der Bytes im Parameter Length muss einen nahezu zusammenhängenden Speicherbereich darstellen.

[in] Length

Die Anzahl der Bytes, die ab der virtuellen Adresse der ersten MDL zugeordnet werden sollen. Die virtuelle MDL-Adresse kann mit dem Makro MmGetMdlVirtualAddress abgerufen werden. Die Länge darf die Gesamtzahl der Byte, die durch die MDL-Kette dargestellt wird, nicht überschreiten.

[in] RequestCompletion

Ein Zeiger auf eine Rückruffunktion von NdkRequestCompletion (NDK_FN_REQUEST_COMPLETION).

[in, optional] RequestContext

Ein Kontextwert, der vom Anbieter an die Rückruffunktion NdkRequestCompletion zurückgegeben werden soll, die im RequestCompletion-Parameter angegeben ist.

pNdkLAM

Ein Zeiger auf einen Puffer, der eine NDK_LOGICAL_ADDRESS_MAPPING Struktur enthält, die ein Adapterseitenarray enthält. Das Adapterseitenarray wird im AdapterPageArray-Element gespeichert, und das AdapterPageCount-Element enthält die Anzahl der Adapterseitenelemente.

pLAMSize

Die Größe des Puffers am pNdkLAM-Parameter für die Eingabe in Bytes oder die tatsächliche Anzahl von Bytes, die für die Ausgabe geschrieben wurden.

[out] pFBO

Der erste Byteoffsetwert (FBO) wird an dieser Position zurückgegeben. Der FBO ist der Startoffset auf der ersten Adapterseite.

Rückgabewert

Die NdkBuildLam-Funktion gibt einen der folgenden NTSTATUS-Codes zurück.

Rückgabecode Beschreibung
STATUS_SUCCESS
Der Vorgang wurde erfolgreich abgeschlossen.
STATUS_PENDING
Die Anforderung ist ausstehend. Die im RequestCompletion-Parameter (NDK_FN_REQUEST_COMPLETION) angegebene Funktion wird aufgerufen, wenn der LAM-Buildvorgang abgeschlossen ist.
STATUS_INVALID_PARAMETER
Der Teil der MDL-Kette von der virtuellen Startadresse bis zur Anzahl von Bytes, die im Parameter Length angegeben ist, stellt keinen praktisch zusammenhängenden Speicherbereich dar.
STATUS_INSUFFICIENT_RESOURCES
Fehler bei der Anforderung aufgrund unzureichender Ressourcen.
Wichtig Die Anforderung kann sowohl inline als auch asynchron mit diesem status Code fehlschlagen.
 
STATUS_BUFFER_TOO_SMALL
Die durch den *pLAMSize-Parameter angegebene Puffergröße ist zu klein, um die LAM-Datei zu speichern. In diesem Fall wird der Wert von *pLAMSize mit der erforderlichen Puffergröße aktualisiert.
Andere status Codes
Ein Fehler ist aufgetreten.

Hinweise

Der Teil der MDL-Kette von der virtuellen Startadresse bis zur Anzahl von Bytes, die im Parameter Length angegeben ist, muss einen nahezu zusammenhängenden Speicherbereich darstellen. Andernfalls muss der NDK-Anbieter die Anforderung fehlschlagen. Es liegt in der Verantwortung des NDK-Consumers sicherzustellen, dass die MDL-Kette gesperrt ist. Das heißt, die Seiten der MDL-Änderung werden im physischen Speicher angeheftet.

Wichtig Der NDK-Consumer darf die MDL-Kette nicht verwenden, während NdkBuildLam aussteht.
 
Ein Adapter greift auf physischen Arbeitsspeicher mit logischen Adressen zu. Dies ähnelt einer CPU, die auf physischen Arbeitsspeicher mit virtuellen Adressen zugreift. Wenn ein NDK-Consumer physische Speicherseiten direkt als lokale Datenpuffer in Sende-, Empfangs-, Lese- oder Schreibanforderungen verwendet, muss er eine logische Adresszuordnung des NDK-Adapters vom NDK-Anbieter abrufen und die logischen Adressen anstelle physischer Adressen verwenden. Ebenso muss ein NDK-Consumer auch logische Adressen in Schnellregistrierungsanforderungen verwenden.

Ein NDK-Consumer kann die Funktion NdkGetPrivilegedMemoryRegionToken (NDK_FN_GET_PRIVILEGED_MEMORY_REGION_TOKEN) aufrufen, um ein Token für privilegierte Speicherbereiche von einem NDK-Anbieter abzurufen.

Alle von einem NDK-Anbieter zurückgegebenen Adapterseiten müssen PAGE_SIZE Bytes lang sein, wobei PAGE_SIZE die Größe der Speicherseite ist, die von der Hostplattform unterstützt wird, wie in wdm.h definiert.

Der Anbieter muss den Wert der virtuellen Adresse, den das MmGetMdlVirtualAddress-Makro für die MDL zurückgibt, als Index für den Anfang des zugeordneten Speicherbereichs behandeln. Der Anbieter darf den Wert der virtuellen Adresse nicht als gültige virtuelle Adresse zum Lesen oder Schreiben von Pufferinhalten verwenden.

Wenn bei einem Anbieter bei der Verarbeitung einer NdkBuildLam-Anforderung ein Fehler auftritt, muss der Anbieter alle Teilzuordnungen freigeben, die er bisher intern erstellt hat, bevor die Anforderung mit einem Fehler abgeschlossen wird.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Keine unterstützt, unterstützt in NDIS 6.30 und höher.
Unterstützte Mindestversion (Server) Windows Server 2012
Zielplattform Windows
Kopfzeile ndkpi.h (Ndkpi.h einschließen)
IRQL <=DISPATCH_LEVEL

Weitere Informationen

MmGetMdlVirtualAddress

Anforderungen an die Lebensdauer des NDKPI-Objekts

NDK_ADAPTER

NDK_ADAPTER_DISPATCH

NDK_FN_GET_PRIVILEGED_MEMORY_REGION_TOKEN

NDK_FN_RELEASE_LAM

NDK_FN_REQUEST_COMPLETION

NDK_LOGICAL_ADDRESS_MAPPING