IoBuildPartialMdl-Funktion (wdm.h)
Die IoBuildPartialMdl Routine erstellt eine neue Speicherdeskriptorliste (MDL), die einen Teil eines Puffers darstellt, der von einer vorhandenen MDL beschrieben wird.
Syntax
void IoBuildPartialMdl(
[in] PMDL SourceMdl,
[in, out] PMDL TargetMdl,
[in] PVOID VirtualAddress,
[in] ULONG Length
);
Parameter
[in] SourceMdl
Ein Zeiger auf eine MDL, der den ursprünglichen Puffer beschreibt, dessen Unterbereich zugeordnet werden soll.
[in, out] TargetMdl
Ein Zeiger auf eine vom Aufrufer zugewiesene MDL. Diese MDL muss groß genug sein, um die Seiten im Unterbereich zu beschreiben, die durch VirtualAddress und Lengthangegeben werden.
[in] VirtualAddress
Ein Zeiger auf die virtuelle Basisadresse für den Unterbereich, der vom TargetMdl-beschrieben werden soll.
[in] Length
Gibt die Länge in Bytes an, die vom TargetMdl-zugeordnet werden soll. Dieser Wert muss in Kombination mit VirtualAddresseinen Puffer angeben, der eine richtige Unterrange des Puffers ist, der von SourceMdlbeschrieben wird. Wenn Length null ist, beginnt der zuzuordnende Unterbereich bei VirtualAddress und enthält den verbleibenden Bereich, der durch die SourceMdl-beschrieben wird.
Rückgabewert
Nichts
Bemerkungen
Diese Routine erstellt eine Ziel-MDL, die eine Unterrange des Puffers beschreibt, der von der Quell-MDL beschrieben wird. Dieser Unterbereich wird durch die Parameter VirtualAddress und Length angegeben. Die parameter SourceMdl und TargetMdl verweisen auf die MDL-Quell- und Ziel-MDL.
Ein Treiber kann IoBuildPartialMdl- verwenden, um eine große Übertragungsanforderung in kleinere Übertragungsanforderungen aufzuteilen. Die physischen Seiten, die die MDL-Quelle beschreibt, müssen gesperrt werden, bevor der Treiber IoBuildPartialMdlaufruft. In der Regel beschreibt die MDL-Quelle einen Puffer im Benutzeradressbereich, und der Treiber ruft die MmProbeAndLockPages Routine auf, um die Seiten in diesem Puffer zu sperren. Der Treiber kann jedoch die Quell-MDL aus nicht seitenseitigem Speicher erstellen, indem die MmBuildMdlForNonPagedPool, MmAllocatePagesForMdlExoder MmAllocatePagesForMdl Routine aufgerufen wird.
Beim Erstellen einer partiellen MDL:
- Wenn die ursprüngliche MDL bereits im Systembereich zugeordnet wurde, teilt die partielle MDL diese Zuordnung, und es muss nicht erneut zugeordnet werden.
- Wenn die ursprüngliche MDL nicht im Systembereich zugeordnet wurde, ist die partielle MDL auch nicht vorhanden. Wenn Sie eine Systemmodusadresse benötigen, rufen Sie MmGetSystemAddressForMdlSafe- für die partielle MDL auf.
- Wenn Sie nicht wissen, welche der oben genannten Punkte zutrifft, ist es sicher, MmGetSystemAddressForMdlSafe aufzurufen. Wenn eine partielle MDL aus einer Quell-MDL erstellt wird, die bereits dem Systemadressraum zugeordnet ist, verwendet MmGetSystemAddressForMdlSafe die vorhandene Quellzuordnung. Andernfalls erstellt MmGetSystemAddressForMdlSafe eine neue Zuordnung.
Um zu verhindern, dass diese neue Zuordnung verloren geht, müssen Treiber MmPrepareMdlForReuse- aufrufen, bevor sie eine partielle MDL wiederverwenden. Darüber hinaus gibt die IoFreeMdl Routine die Systemadressraumzuordnung für eine partielle MDL frei, sofern eine solche Zuordnung vorhanden ist.
Weitere Informationen zu MDLs finden Sie unter Verwenden von MDLs.
Anforderungen
Anforderung | Wert |
---|---|
mindestens unterstützte Client- | Ab Windows 2000 verfügbar. |
Zielplattform- | Universal |
Header- | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
Library | NtosKrnl.lib |
DLL- | NtosKrnl.exe |
IRQL- | <=DISPATCH_LEVEL |
DDI-Complianceregeln | MdlAfterReqCompletedIntIoctlA(kmdf), MdlAfterReqCompletedIoctlA(kmdf), MdlAfterReqCompletedReadA(kmdf), MdlAfterReqCompletedWriteA(kmdf) |