FltCreateSectionForDataScan-Funktion (fltkernel.h)

Die FltCreateSectionForDataScan-Routine erstellt ein Abschnittsobjekt für eine Datei. Der Filter-Manager kann optional E/A mit dem erstellten Abschnitt synchronisieren.

Syntax

NTSTATUS FLTAPI FltCreateSectionForDataScan(
  [in]            PFLT_INSTANCE      Instance,
  [in]            PFILE_OBJECT       FileObject,
  [in]            PFLT_CONTEXT       SectionContext,
  [in]            ACCESS_MASK        DesiredAccess,
  [in, optional]  POBJECT_ATTRIBUTES ObjectAttributes,
  [in, optional]  PLARGE_INTEGER     MaximumSize,
  [in]            ULONG              SectionPageProtection,
  [in]            ULONG              AllocationAttributes,
  [in]            ULONG              Flags,
  [out]           PHANDLE            SectionHandle,
  [out]           PVOID              *SectionObject,
  [out, optional] PLARGE_INTEGER     SectionFileSize
);

Parameter

[in] Instance

Der undurchsichtige instance Zeiger für den Minifiltertreiber instance dessen Kontext abgerufen werden soll.

[in] FileObject

Das Dateiobjekt für eine geöffnete Datei. Das Abschnittsobjekt wird von der angegebenen Datei unterstützt. Dieser Parameter ist erforderlich und darf nicht NULL sein.

[in] SectionContext

Ein Zeiger auf einen zuvor zugewiesenen Abschnittskontext.

[in] DesiredAccess

Der Zugriffstyp für das Abschnittsobjekt als mindestens eines der folgenden ACCESS_MASK Flags.

Flag Ermöglicht dem Anrufer,
SECTION_MAP_READ Leseansichten des Abschnitts.
SECTION_MAP_WRITE Schreiben Sie Ansichten des Abschnitts.
SECTION_QUERY Fragen Sie das Abschnittsobjekt nach Informationen zum Abschnitt ab. Treiber sollten dieses Flag festlegen.
SECTION_ALL_ACCESS Alle Aktionen, die durch die vorherigen Flags definiert wurden, sowie die aktionen, die durch STANDARD_RIGHTS_REQUIRED definiert wurden. Weitere Informationen zu STANDARD_RIGHTS_REQUIRED finden Sie unter ACCESS_MASK.

[in, optional] ObjectAttributes

Ein Zeiger auf eine optionale OBJECT_ATTRIBUTES-Struktur , die den Objektnamen und andere Attribute angibt. Verwenden Sie das Makro InitializeObjectAttributes , um diese Struktur zu initialisieren.

[in, optional] MaximumSize

Dieser Parameter ist für die zukünftige Verwendung reserviert.

[in] SectionPageProtection

Der Schutz, der auf jeder Seite im Abschnitt platziert werden soll. Geben Sie einen der folgenden Werte an. Dieser Parameter ist erforderlich und darf nicht 0 sein.

Flag Bedeutung
PAGE_READONLY Ermöglicht schreibgeschützten Zugriff auf den zugesicherten Seitenbereich. Ein Versuch, in die region zu schreiben, führt zu einer Zugriffsverletzung. Wenn das System zwischen schreibgeschütztem Zugriff und Ausführungszugriff unterscheidet, führt ein Versuch, Code in der committeten Region auszuführen, zu einer Zugriffsverletzung.
PAGE_READWRITE Ermöglicht Lese- und Schreibzugriff auf den zugesicherten Seitenbereich.

[in] AllocationAttributes

Bitmasken der SEC_XXX-Flags bestimmen die Zuordnungsattribute des Abschnitts. Geben Sie mindestens einen der folgenden Werte an. Dieser Parameter ist erforderlich und darf nicht 0 sein.

Flag Bedeutung
SEC_COMMIT Ordnet physischen Speicher im Arbeitsspeicher oder in der Auslagerungsdatei auf dem Datenträger für alle Seiten eines Abschnitts zu. Dies ist die Standardeinstellung. Beachten Sie, dass dieses Flag erforderlich ist und nicht weggelassen werden kann.
SEC_FILE Die durch den FileObject-Parameter angegebene Datei ist eine zugeordnete Datei.

[in] Flags

Dieser Parameter ist für die zukünftige Verwendung reserviert.

[out] SectionHandle

Ein Zeiger auf eine vom Aufrufer zugewiesene Variable, die ein undurchsichtiges Handle für den Abschnitt empfängt. Standardmäßig ist das Abschnittshandle ein Benutzerhandle. Wenn der Aufrufer ein Kernelhandle benötigt, muss er einen Zeiger an eine initialisierte OBJECT_ATTRIBUTES Struktur im ObjectAttributes-Parameter übergeben, wobei das OBJ_KERNEL_HANDLE-Flag festgelegt ist.

[out] SectionObject

Ein Zeiger auf eine vom Aufrufer zugewiesene Variable, die einen undurchsichtigen Zeiger auf das Abschnittsobjekt empfängt.

[out, optional] SectionFileSize

Ein Zeiger auf eine vom Aufrufer zugewiesene Variable, die die Größe der Datei in Bytes zum Zeitpunkt der Erstellung des Abschnittsobjekts empfängt. Dieser Parameter ist optional und kann NULL sein.

Rückgabewert

FltCreateSectionForDataScan gibt STATUS_SUCCESS oder einen entsprechenden NTSTATUS-Wert zurück, z. B. einen der folgenden.

Rückgabecode Beschreibung
STATUS_END_OF_FILE Die Größe der Datei, die durch den FileObject-Parameter angegeben wird, ist 0.
STATUS_FILE_LOCK_CONFLICT Die durch den FileObject-Parameter angegebene Datei ist gesperrt.
STATUS_INSUFFICIENT_RESOURCES FltCreateSectionForDataScan ist ein Poolzuordnungsfehler aufgetreten.
STATUS_INVALID_FILE_FOR_SECTION Die vom FileObject-Parameter angegebene Datei unterstützt keine Abschnitte.
STATUS_INVALID_PARAMETER Der Minifilter ist nicht registriert.
STATUS_INVALID_PARAMETER_8 Der für den SectionPageProtection-Parameter angegebene Wert ist ungültig.
STATUS_INVALID_PARAMETER_9 Der Aufrufer hat einen ungültigen Wert für den AllocationAttributes-Parameter angegeben.
STATUS_NOT_SUPPORTED Das Volume, das diesem instance angefügt ist, unterstützt keine Abschnittskontexte.
STATUS_PRIVILEGE_NOT_HELD Der Aufrufer verfügte nicht über die erforderlichen Berechtigungen zum Erstellen eines Abschnittsobjekts mit dem im DesiredAccess-Parameter angegebenen Zugriff.
STATUS_FILE_IS_A_DIRECTORY Die durch den FileObject-Parameter angegebene Datei ist ein Verzeichnis.
STATUS_FLT_CONTEXT_ALREADY_DEFINED Der von Instance angegebene Filter instance hat bereits einen geöffneten Abschnitt für den Stream. Es wird nur ein Abschnitt pro Stream und damit pro instance unterstützt.

Hinweise

Vor dem Aufrufen von FltCreateSectionForDataScan muss ein Minifilter zuerst sein Volume für die Datenüberprüfung registrieren, indem Er FltRegisterForDataScan aufruft. Wie bei anderen Filterkontextelementen wird SectionContext zuerst FltAllocateContext zugeordnet.

FltCreateSectionForDataScan fügt das Handle in das Objekt (SectionHandle) in die Prozesshandle-Tabelle für den Thread ein, für den FltCreateSectionForDataScan aufgerufen wird.

Handles können entweder Benutzerhandles oder Kernelhandles sein. Ein Handle, das mit OBJ_KERNEL_HANDLE erstellt wurde, das in der OBJECT_ATTRIBUTES-Struktur festgelegt ist, auf die ObjectAttributes verweist, ist ein Kernelhandle, auf das nur im Kernelmodus zugegriffen werden kann. Ein Ohne das OBJ_KERNEL_HANDLE-Flag erstelltes Handle ist ein Benutzerhandle, auf das über den Benutzer- oder Kernelmodus zugegriffen werden kann. Ein Filter kann ein Benutzerhandle erstellen und es dann zur Verarbeitung an eine Benutzermodusanwendung übergeben. Beispielsweise kann eine Virenscan-Engine in einer Anwendung im Benutzermodus leben und Benutzerhandles aus einem Dateisystemfilter erhalten.

In bestimmten Situationen kann es vorkommen, dass das Öffnen eines Abschnitts mit der aktuellen Datei-E/A nicht kompatibel ist. Insbesondere datei-E/A, die eine Cachelöschung auslöst, können Cacheinkohärenz verursachen, wenn die Cachelöschung aufgrund eines geöffneten Abschnitts verhindert wird. Ein Minifilter kann eine optionale Rückrufroutine für Benachrichtigungen zu diesen Ereignissen bereitstellen. Der Minifiltertreiber implementiert eine PFLT_SECTION_CONFLICT_NOTIFICATION_CALLBACK , um diese Benachrichtigungen zu empfangen. Konfliktbenachrichtigungen werden aktiviert, wenn das SectionNotificationCallback-Element von FLT_REGISTRATION auf diese Rückrufroutine festgelegt ist, wenn der Minifilter registriert wird. Wenn eine Benachrichtigung empfangen wird, kann der Abschnitt geschlossen werden, damit der konfliktierende E/A-Vorgang fortgesetzt werden kann.

Hinweis

Vor der Rückgabe von FltCreateSectionForDataScan kann ein Abschnittsbenachrichtigungsrückruf erfolgen. Ein Minifilter muss in der Lage sein, den Rückruf zu empfangen und den Fall zu behandeln, in dem SectionHandle und SectionObject noch nicht gültig sind.

Wenn das von dieser Routine erstellte Section-Objekt nicht mehr erforderlich ist, müssen Sie das Handle des Abschnittsobjekts (SectionHandle) schließen, indem Sie die ZwClose-Routine aufrufen und das Abschnittsobjekt selbst (SectionObject) durch Aufrufen der ObDereferenceObject-Routine deference zurückleiten .

Eine Übersicht zum Erstellen zugeordneter Abschnitte und Ansichten des Arbeitsspeichers finden Sie unter Abschnittsobjekte und Ansichten. Lesen Sie auch die Dokumentation zur CreateFileMapping-Routine im Microsoft Windows SDK.

Wichtig

Minifilter dürfen einen Abschnittskontext, der an FltCreateSectionForDataScan übergeben wurde, nicht explizit löschen. Rufen Sie FltDeleteContext nicht auf, nachdem ein Abschnittskontext an FltCreateSectionForDataScan übergeben wurde. Ein Abschnittskontext wird zugeordnet und aus einem Stream entfernt, indem in diesem Fall FltCloseSectionForDataScan aufgerufen wird.

Im Allgemeinen sollten Abschnitte schreibgeschützt erstellt werden. Insbesondere wenn sich eine schreibgeschützte Datei in einer Transaktion befindet und ein Minifilter keinen schreibgeschützten Abschnitt erstellt, wird ein Schreibvorgang in den Abschnitt verworfen und nicht als Teil der Transaktion eingeschlossen.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows 8
Zielplattform Universell
Header fltkernel.h (include Fltkernel.h)
Bibliothek FltMgr.lib
IRQL <= APC_LEVEL

Weitere Informationen

ACCESS_MASK

CcPurgeCacheSection

FLT_REGISTRATION

FltAllocateContext

FltCloseSectionForDataScan

FltRegisterForDataScan

ObDereferenceObject

PFLT_SECTION_CONFLICT_NOTIFICATION_CALLBACK

ZwClose

ZwCreateSection