MmProbeAndLockPages-Funktion (wdm.h)
Die MmProbeAndLockPages-Routine testet die angegebenen seiten des virtuellen Arbeitsspeichers, macht sie resident und sperrt sie im Arbeitsspeicher (z. B. für eine DMA-Übertragung). Dadurch wird sichergestellt, dass die Seiten nicht freigegeben und neu zugeordnet werden können, während sie noch von einem Gerätetreiber (oder einer Hardware) verwendet werden.
Syntax
void MmProbeAndLockPages(
[in, out] PMDL MemoryDescriptorList,
[in] KPROCESSOR_MODE AccessMode,
[in] LOCK_OPERATION Operation
);
Parameter
[in, out] MemoryDescriptorList
Ein Zeiger auf eine MDL, die einen virtuellen Speicherpuffer angibt. Wenn die Routine die Seiten erfolgreich im Arbeitsspeicher sperrt, wird die MDL aktualisiert, um die zugrunde liegenden physischen Seiten zu beschreiben.
[in] AccessMode
Der Zugriffsmodus, in dem die Argumente untersucht werden sollen, entweder KernelMode oder UserMode.
[in] Operation
Der Vorgangstyp, für den der Aufrufer die Zugriffsrechte überprüfen und die Seiten sperren möchte. Legen Sie diesen Parameter auf IoReadAccess, IoWriteAccess oder IoModifyAccess fest. IoReadAccess gibt an, dass der Treiber den Inhalt des Puffers untersuchen, den Inhalt aber nicht ändern kann. IoWriteAccess und IoModifyAccess, die gleichwertig sind, geben an, dass der Treiber sowohl Lese- als auch Schreibzugriff auf den Puffer hat.
Rückgabewert
Keine
Bemerkungen
Der Treiber der höchsten Ebene in einer Kette von Mehrschichttreibern, die direkte E/A verwenden, ruft diese Routine auf. Treiber, die gepufferte E/A verwenden, rufen nie MmProbeAndLockPages auf.
MmProbeAndLockPages führt die folgenden Vorgänge aus:
- Wenn der angegebene Speicherbereich in einen Sicherungsspeicher (Datenträger, Netzwerk usw.) ausgelagert wird, wird er von MmProbeAndLockPages als resident festgelegt.
- Die Routine bestätigt dann, dass die Seiten den durch den Parameter Operation angegebenen Vorgang zulassen.
- Wenn der Speicherbereich den angegebenen Vorgang zulässt, sperrt die Routine die Seiten im Arbeitsspeicher, sodass sie nicht ausgelagert werden können. Verwenden Sie die MmUnlockPages-Routine , um die Seiten zu entsperren.
- Schließlich aktualisiert die Routine das Seitenrahmennummer-Array (PFN) in der MDL, um die gesperrten physischen Seiten zu beschreiben.
Wenn mindestens zwei MDLs dieselbe physische Seite beschreiben, kann die Seite mehrmals gesperrt werden – einmal für jede MDL. Die Seite wird entsperrt, wenn die letzte MDL auf den entsperrten Zustand festgelegt ist.
Eine Routine wie MmBuildMdlForNonPagedPool oder IoBuildPartialMdl aktualisiert eine MDL, um Seiten zu beschreiben, die entweder nicht ausstellbar oder bereits gesperrt sind. Ein Aufruf von MmProbeAndLockPages oder MmUnlockPages zum Sperren oder Entsperren einer solchen MDL ist nicht zulässig.
Aufrufe von MmProbeAndLockPages müssen in einen try/except-Block eingeschlossen werden. Wenn die Seiten den angegebenen Vorgang nicht unterstützen, löst die Routine die STATUS_ACCESS_VIOLATION oder andere Ausnahmen aus. Weitere Informationen finden Sie unter Behandeln von Ausnahmen.
Aufrufer von MmProbeAndLockPages müssen unter IRQL <= APC_LEVEL für auslagerungsfähige Adressen oder unter IRQL <= DISPATCH_LEVEL für nicht ausgelagerte Adressen ausgeführt werden.
Diese Routine bietet keine Garantien für die virtuelle Adresse, die diese Seiten beschreibt (d. a. die virtuelle Adresse wird möglicherweise nicht zugeordnet, wiederverwendet usw.). Die physischen Seiten werden jedoch bei erfolgreicher Rückgabe garantiert gesperrt.
Um Seitenfehler zu vermeiden, verwenden Sie VirtualLock , um die virtuelle Adresse zu sperren, sodass sie nicht gekürzt wird, es sei denn, die App entsperrt sie oder gibt sie durch Aufrufen von VirtualFree oder UnmapViewOfFile explizit frei.
Anforderungen
Anforderung | Wert |
---|---|
Unterstützte Mindestversion (Client) | Verfügbar ab Windows 2000. |
Zielplattform | Universell |
Header | wdm.h (einschließlich Wdm.h, Ntddk.h, Ntifs.h) |
Bibliothek | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | Weitere Informationen finden Sie im Abschnitt mit den Hinweisen. |
DDI-Complianceregeln | HwStorPortProhibitedDDIs(storport) |