Ändern der Parameter für einen E/A-Vorgang
Ein Minifiltertreiber kann die Parameter für einen E/A-Vorgang ändern. Beispielsweise kann die Preoperations-Rückrufroutine eines Minifiltertreibers einen E/A-Vorgang an ein anderes Volume umleiten, indem die Ziel-instance für den Vorgang geändert wird. Die neue Ziel-instance muss ein instance desselben Minifiltertreibers auf derselben Höhe auf einem anderen Volume sein.
Die Parameter für einen E/A-Vorgang befinden sich in der Rückrufdatenstruktur (FLT_CALLBACK_DATA) und der E/A-Parameterblockstruktur (FLT_IO_PARAMETER_BLOCK) für den Vorgang. Die Preoperations-Rückrufroutine und die Postoperation-Rückrufroutine des Minifiltertreibers erhalten einen Zeiger auf die Rückrufdatenstruktur für den Vorgang im Parameter Dateneingabe . Das Iopb-Element der Rückrufdatenstruktur ist ein Zeiger auf eine E/A-Parameterblockstruktur, die die Parameter für den Vorgang enthält.
Wenn die Voroperationsrückrufroutine eines Minifiltertreibers die Parameter für einen E/A-Vorgang ändert, erhalten alle Minifiltertreiber unterhalb dieses Minifiltertreibers im Minifiltertreiber instance Stapel die geänderten Parameter in ihren Rückrufroutinen für preoperation und postoperation.
Die geänderten Parameter werden nicht von der Postoperation-Rückrufroutine des aktuellen Minifiltertreibers oder von Minifiltertreibern oberhalb dieses Minifiltertreibers im Minifiltertreiber instance Stapel empfangen. In allen Situationen erhalten die Preoperations- und Postoperation-Rückrufroutinen eines Minifiltertreibers die gleichen Eingabeparameterwerte für einen bestimmten E/A-Vorgang.
Nach dem Ändern der Parameter für einen E/A-Vorgang muss die Rückrufroutine für preoperation oder postoperation angeben, dass dies durch Aufrufen von FltSetCallbackDataDirty erfolgt ist, es sei denn, sie hat den Inhalt des IoStatus-Felds der Rückrufdatenstruktur geändert. Andernfalls ignoriert der Filter-Manager alle Änderungen an Parameterwerten. FltSetCallbackDataDirty legt das flag FLTFL_CALLBACK_DATA_DIRTY in der Rückrufdatenstruktur für den E/A-Vorgang fest. Minifiltertreiber können dieses Flag testen, indem sie FltIsCallbackDataDirty aufrufen oder durch Aufrufen von FltClearCallbackDataDirty löschen.
Wenn die Voroperationsrückrufroutine eines Minifiltertreibers die Parameter für einen E/A-Vorgang ändert, erhalten alle Minifiltertreiber unterhalb dieses Minifiltertreibers im Minifiltertreiber instance Stapel die geänderten Parameter in den Eingabeparametern Data und FltObjects in ihre Preoperations- und Postoperation-Rückrufroutinen. (Minifiltertreiber können den Inhalt der FLT_RELATED_OBJECTS Struktur, auf die der FltObjects-Parameter verweist, nicht direkt ändern. Wenn jedoch ein Minifiltertreiber das Ziel-instance- oder Zieldateiobjekt für einen E/A-Vorgang ändert, ändert der Filter-Manager den Wert des entsprechenden Instance- oder FileObject-Elements der FLT_RELATED_OBJECTS-Struktur, die an niedrigere Minifiltertreiber übergeben wird.)
Obwohl alle Parameteränderungen, die die Preoperation-Rückrufroutine eines Minifiltertreibers vornimmt, nicht von der postoperationsbasierten Rückrufroutine des Minifiltertreibers empfangen werden, kann eine Preoperation-Rückrufroutine Informationen über geänderte Parameter an die postoperationseigene Rückrufroutine des Minifiltertreibers übergeben. Wenn die Voroperationsrückrufroutine den E/A-Vorgang nach unten im Stapel übergibt, indem sie FLT_PREOP_SUCCESS_WITH_CALLBACK oder FLT_PREOP_SYNCHRONIZE zurückgibt, kann sie Informationen über geänderte Parameterwerte in einer vom Minifiltertreiber definierten Struktur speichern, auf die der Ausgabeparameter CompletionContext verweist. Der Filter-Manager übergibt diesen Strukturzeiger im Eingabeparameter CompletionContext an die Rückrufroutine nach der Operation.
Weitere Informationen zu den Parametern für einen E/A-Vorgang finden Sie unter FLT_CALLBACK_DATA und FLT_IO_PARAMETER_BLOCK.