Freigeben über


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:

  1. Wenn der angegebene Speicherbereich auf einen Sicherungsspeicher (Datenträger, Netzwerk usw.) ausgelagert wird, MmProbeAndLockPages ihn eingibt.
  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 Seitenframezahlen- (PFN)-Array 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. Jeder solcher Aufruf muss mit einem entsprechenden Aufruf von MmUnlockPages abgeglichen 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 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)

Siehe auch

IoBuildPartialMdl-

MmBuildMdlForNonPagedPool

MmUnlockPages-