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:

  1. Wenn der angegebene Speicherbereich in einen Sicherungsspeicher (Datenträger, Netzwerk usw.) ausgelagert wird, wird er von MmProbeAndLockPages als resident festgelegt.
  2. Die Routine bestätigt dann, dass die Seiten den durch den Parameter Operation angegebenen Vorgang zulassen.
  3. 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.
  4. Schließlich aktualisiert die Routine das Seitenrahmennummer-Array (PFN) in der MDL, um die gesperrten physischen Seiten zu beschreiben.
Ein erfolgreicher Aufruf von MmProbeAndLockPages sperrt die Seiten in einer MDL und legt die MDL-Struktur auf den gesperrten Zustand fest. Jedem solchen Aufruf muss ein entsprechender Aufruf von MmUnlockPages zugeordnet werden, der die Seiten entsperrt und die MDL auf den entsperrten Zustand festlegt. Nachdem ein MmProbeAndLockPages-Aufruf eine MDL auf den gesperrten Zustand festgelegt hat, ist ein zweiter Aufruf von MmProbeAndLockPages zum Sperren derselben MDL erst zulässig, wenn MmUnlockPages zuerst aufgerufen wird, um die MDL zu entsperren.

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)

Weitere Informationen

IoBuildPartialMdl

MmBuildMdlForNonPagedPool

MmUnlockPages