Как ожидать IRP в драйвере минифильтра? - PullRequest
1 голос
/ 05 марта 2020

Я пытаюсь отменить IRP, связанный с созданием. Вот мой код, связанный с PreCreate. В настоящее время он блокирует IRP, я хочу отменить IRP, переведя его в состояние ожидания. Я не хотел внедрять безопасные для отмены очереди IRP, потому что у меня очень мало IRP для отмены, скажем один или два, как я могу отменить IRP?, Plz help

мой код

FltLockUserBuffer(Data);

        FltWorkItem = FltAllocateDeferredIoWorkItem();

        if (FltWorkItem != NULL)
        {

            if (NT_SUCCESS(FltQueueDeferredIoWorkItem(FltWorkItem, Data, WorkItemCallback, DelayedWorkQueue, NULL)))
                return FLT_PREOP_PENDING;

        }



//Callback that notify when is file is accessed
VOID WorkItemCallback(IN PFLT_DEFERRED_IO_WORKITEM  FltWorkItem,
    IN PFLT_CALLBACK_DATA  Data,
    IN PVOID  Context)
{
    UNICODE_STRING  UniFilePathName = { 0 };
    UNICODE_STRING  UniParentFileName = { 0 };
    ULONG           replyLength;
    NTSTATUS        status;

    FLT_PREOP_CALLBACK_STATUS       Result = FLT_PREOP_SUCCESS_WITH_CALLBACK;
    DWORD                           SafeToOpen = 1;



    __try
    {

        // Extract file name Information        
        if (!NT_SUCCESS(GetFileName(Data, &UniFilePathName, &UniParentFileName)))
        {
            __leave;
        }


        //communicate with service
        SafeToOpen = SendFileInfo(UniFilePathName);

        if (!SafeToOpen)
        {   

                // ACCESS DENIED
                Data->IoStatus.Status = STATUS_ACCESS_DENIED;               
                Data->IoStatus.Information = 0;             
                Result = FLT_PREOP_COMPLETE;
                __leave;

        }
    }
    __finally
    {


        FltCompletePendedPreOperation(Data, Result, Context);
        FltFreeDeferredIoWorkItem(FltWorkItem);
    }

}
...