Hello,
My minifilter needs to substitue the current file object by another file
object created by ZwCreateFile.
But the code gets Bug Checked. Is the following code correct?
Thanks for your valuable input. - Shangwu
Here is the code in post-create-callback when STATUS_REPARSE is set.
//Initial object attributes
RtlInitUnicodeString(&tgtName, tgtFileNameBuf); // tgtFileNameBuf likes
“??\UNC\server\dir”
InitializeObjectAttributes(&objAttr, &tgtName, OBJ_KERNEL_HANDLE, NULL,
NULL);
status = ZwCreateFile( &hTgtDir,
Data->Iopb->Parameters.Create.SecurityContext->DesiredAccess,
&objAttr, &ioSt,
&Data->Iopb->Parameters.Create.AllocationSize,
Data->Iopb->Parameters.Create.FileAttributes,
Data->Iopb->Parameters.Create.ShareAccess,
(Data->Iopb->Parameters.Create.Options >> 24) & 0xFF,
Data->Iopb->Parameters.Create.Options,
Data->Iopb->Parameters.Create.EaBuffer,
Data->Iopb->Parameters.Create.EaLength );
// Release target name buffer
ExFreePool( tgtFileNameBuf );
// check FltCreateFileEx return status
if (NT_SUCCESS(status))
{
// Get the file object by the handle
status = ObReferenceObjectByHandle( hTgtDir, 0, NULL, KernelMode,
&pFoTgt, NULL);
ZwClose(hTgtDir); // release the handle
if (NT_SUCCESS(status))
{
// Release the current file object and return this new file
object
FltSetCallbackDataDirty( Data );
ObDereferenceObject( Data->Iopb->TargetFileObject );
Data->Iopb->TargetFileObject = pFoTgt;
Data->IoStatus.Status = ioSt.Status;
Data->IoStatus.Information = ioSt.Information;
}
}