MmProbeAndLockPages-Funktion (wdm.h)
Die MmProbeAndLockPages Routinesonden die angegebenen virtuellen Speicherseiten, macht sie resident und sperrt sie im Speicher (z. B. für eine DMA-Übertragung). Dadurch wird sichergestellt, dass die Seiten nicht freigegeben und neu angeordnet werden können, während ein Gerätetreiber (oder eine Hardware) sie noch verwendet.
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 im Arbeitsspeicher erfolgreich sperrt, wird die MDL aktualisiert, um die zugrunde liegenden physischen Seiten zu beschreiben.
[in] AccessMode
Der Zugriffsmodus zum Überprüfen der Argumente, entweder KernelMode oder UserMode-.
[in] Operation
Der Typ des Vorgangs, für den der Aufrufer die Zugriffsberechtigungen durchsucht und die Seiten gesperrt werden soll. Legen Sie diesen Parameter auf IoReadAccess, IoWriteAccessoder IoModifyAccessfest. IoReadAccess gibt an, dass der Treiber den Inhalt des Puffers untersuchen kann, 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
Nichts
Bemerkungen
Der Treiber der höchsten Ebene in einer Kette von mehrstufigen Treibern, die direkte E/A verwenden, ruft diese Routine auf. Treiber, die gepufferte E/A verwenden, rufen nie MmProbeAndLockPagesauf.
MmProbeAndLockPages führt die folgenden Vorgänge aus:
- Wenn der angegebene Speicherbereich auf einen Sicherungsspeicher (Datenträger, Netzwerk usw.) ausgelagert wird, MmProbeAndLockPages ihn eingibt.
- 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 Seitenframezahlen- (PFN)-Array in der MDL, um die gesperrten physischen Seiten zu beschreiben.
Wenn zwei oder mehr 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 nicht gesperrten Zustand festgelegt ist.
Eine Routine wie MmBuildMdlForNonPagedPool oder IoBuildPartialMdl aktualisiert eine MDL, um Seiten zu beschreiben, die entweder nicht seitenfähig oder bereits gesperrt sind. Ein Aufruf von MmProbeAndLockPages oder MmUnlockPages zum Sperren oder Entsperren einer solchen MDL ist nicht zulässig.
Aufrufe an 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 bei IRQL-<= APC_LEVEL für seitenfähige Adressen oder bei IRQL-<= DISPATCH_LEVEL für nicht seitenfähige Adressen ausgeführt werden.
Diese Routine bietet keine Garantien für die virtuelle Adresse, die diese Seiten beschreibt (d. a. die virtuelle Adresse ist möglicherweise nicht zugeordnet, wiederverwendet usw.). Die physischen Seiten werden jedoch garantiert bei erfolgreicher Rückgabe 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 explizit frei, indem Sie VirtualFree oder UnmapViewOfFile-aufrufen.
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- | Siehe Abschnitt "Hinweise". |
DDI-Complianceregeln | HwStorPortProhibitedDIs(storport) |