Verwenden von ECPs zum Verarbeiten von IRP_MJ_CREATE Vorgängen in einem Dateisystemfiltertreiber
Sie können zusätzliche Parameter (Create Parameters, ECPs) in Ihrem Dateisystemfiltertreiber verwenden, um IRP_MJ_CREATE Vorgänge zu verarbeiten. Der Dateisystemfiltertreiber kann die Routinen in den folgenden Abschnitten aufrufen, um ECPs für den IRP_MJ_CREATE Vorgang abzurufen, festzulegen (hinzuzufügen), zu bestätigen und zu entfernen. Sie können auch den Betriebssystemspeicher bestimmen, aus dem die ECPs stammen.
Abrufen von ECPs
So rufen Sie ECPs für den IRP_MJ_CREATE-Vorgang ab:
Rufen Sie FltGetEcpListFromCallbackData (oder FsRtlGetEcpListFromIrp) auf, um einen Zeiger auf die ECP_LIST abzurufen, die dem Erstellungsvorgang zugeordnet ist.
Führen Sie eine der folgenden Vorgänge aus:
- Rufen Sie FltGetNextExtraCreateParameter (oder FsRtlGetNextExtraCreateParameter) auf, um einen Zeiger auf die nächste (oder erste) ECP-Kontextstruktur in der ECP-Liste abzurufen.
- Rufen Sie FltFindExtraCreateParameter (oder FsRtlFindExtraCreateParameter) auf, um die ECP-Liste nach einer ECP-Kontextstruktur eines bestimmten Typs zu durchsuchen. Eine der beiden Routinen gibt einen Zeiger auf die ECP-Kontextstruktur zurück, wenn die Struktur gefunden wird.
Festlegen von ECPs
Um ECPs für den IRP_MJ_CREATE-Vorgang festzulegen, führt Ihr Dateisystemfiltertreiber eine der folgenden Aktionen aus:
Legen Sie ECPs in einer vorhandenen ECP_LIST fest.
Legen Sie ECPs in einer neu erstellten ECP_LIST fest.
Festlegen von ECPs in einer vorhandenen ECP_LIST
So legen Sie ECPs in einer vorhandenen ECP_LIST fest, die dem Erstellungsvorgang zugeordnet ist:
Rufen Sie FltGetEcpListFromCallbackData (oder FsRtlGetEcpListFromIrp) auf, um einen Zeiger auf die ECP_LIST abzurufen, die dem Erstellungsvorgang zugeordnet ist.
Rufen Sie FltAllocateExtraCreateParameter (oder FsRtlAllocateExtraCreateParameter) auf, um den ausgelagerten Speicherpool für eine ECP-Kontextstruktur zuzuweisen und einen Zeiger auf diese Struktur zu generieren.
Rufen Sie FltInsertExtraCreateParameter (oder FsRtlInsertExtraCreateParameter) auf, um ECP-Kontextstrukturen in die ECP_LIST-Struktur einzufügen.
Festlegen von ECPs in einer neu erstellten ECP_LIST
Wenn derzeit kein ECP_LIST mit dem Erstellungsvorgang verknüpft ist, müssen Sie einen erstellen und dann ECPs darin festlegen:
Rufen Sie FltAllocateExtraCreateParameterList (oder FsRtlAllocateExtraCreateParameterList) auf, um Speicher für eine ECP_LIST Struktur zuzuweisen.
Rufen Sie FltAllocateExtraCreateParameter (oder FsRtlAllocateExtraCreateParameter) auf, um den ausgelagerten Speicherpool für eine ECP-Kontextstruktur zuzuweisen und einen Zeiger auf diese Struktur zu generieren.
Rufen Sie FltInsertExtraCreateParameter (oder FsRtlInsertExtraCreateParameter) auf, um ECP-Kontextstrukturen in die ECP_LIST einzufügen.
Rufen Sie FltSetEcpListIntoCallbackData (oder FsRtlSetEcpListIntoIrp) auf, um eine ECP-Liste an den Erstellungsvorgang anzufügen.
Entfernen von ECPs
So entfernen Sie ECPs für den IRP_MJ_CREATE Vorgang:
Rufen Sie FltRemoveExtraCreateParameter (oder FsRtlRemoveExtraCreateParameter) auf, um eine ECP-Liste nach einer ECP-Kontextstruktur zu durchsuchen. Wenn die ECP-Kontextstruktur gefunden wird, trennt die Routine die ECP-Kontextstruktur von der ECP-Liste.
Rufen Sie FltFreeExtraCreateParameter (oder FsRtlFreeExtraCreateParameter) auf, um den Speicher für die getrennte ECP-Kontextstruktur freizugeben. Sie können diese Routinen aufrufen, um Arbeitsspeicher für die ECP-Kontextstruktur freizugeben, wenn Sie den Speicher auf eine der folgenden Arten zugewiesen haben:
- Sie haben fltAllocateExtraCreateParameter (oder FsRtlAllocateExtraCreateParameter) aufgerufen, um den ausgelagerten Speicherpool zuzuweisen.
- Sie haben fltAllocateExtraCreateParameterFromLookasideList (oder FsRtlAllocateExtraCreateParameterFromLookasideList) aufgerufen, um speicherpool aus einer Lookaside-Liste zuzuweisen.
Kennzeichnen von ECPs als bestätigt oder Ermitteln des Bestätigungsstatus
Rufen Sie die folgenden Routinen auf, um ECPs entweder als bestätigt zu kennzeichnen oder zu bestimmen, ob die ECPs als bestätigt gekennzeichnet sind:
Rufen Sie FltAcknowledgeEcp (oder FsRtlAcknowledgeEcp) auf, um eine ECP-Kontextstruktur als bestätigt zu kennzeichnen. Das ECP kann als betrachtet, verwendet, verarbeitet oder eine andere Bedingung des ECP markiert werden.
Rufen Sie FltIsEcpAcknowledged (oder FsRtlIsEcpAcknowledged) auf, um zu ermitteln, ob eine ECP-Kontextstruktur als bestätigt gekennzeichnet ist.
Bestimmen des Ursprungsmodus
Rufen Sie FltIsEcpFromUserMode (oder FsRtlIsEcpFromUserMode) auf, um zu bestimmen, ob eine ECP-Kontextstruktur vom Benutzermodus stammt. Ein Dateisystemfiltertreiber kann die Annahme einer ECP-Kontextstruktur verweigern, die aus dem Benutzermodus stammt.
Verwenden von Lookaside-Listen zum Zuordnen von ECPs
Rufen Sie die folgenden Routinen auf, um ECPs aus Lookaside-Listen zuzuweisen und die Lookaside-Listen und ECPs zu verwalten:
Rufen Sie FltInitExtraCreateParameterLookasideList (oder FsRtlInitExtraCreateParameterLookasideList) auf, um eine seitenseitige oder nicht seitenseitige Pool-Lookaside-Liste zu initialisieren, die für die Zuordnung einer oder mehrerer ECP-Kontextstrukturen mit fester Größe verwendet wird.
Rufen Sie FltDeleteExtraCreateParameterLookasideList (oder FsRtlDeleteExtraCreateParameterLookasideList) auf, um die Lookaside-Liste freizulassen.
Rufen Sie FltAllocateExtraCreateParameterFromLookasideList (oder FsRtlAllocateExtraCreateParameterFromLookasideList) auf, um den Speicherpool aus der Lookaside-Liste für eine ECP-Kontextstruktur zuzuweisen und einen Zeiger auf diese Struktur zu generieren.
Rufen Sie FltFreeExtraCreateParameter (oder FsRtlFreeExtraCreateParameter) auf, um den Speicher für die ECP-Kontextstrukturen freizugeben.