如何在禁用APC时查询文件大小?

时间:2013-01-05 21:24:54

标签: kernel drivers wdk minifilter windows-kernel

在我的minifilter的PostCreate中,我必须使用全局推锁来按设计同步线程,我必须调用FltQueryInformationFile来查询文件大小。

然而,

1,在我调用FltAcquirePushLockExclusive后,APC交付被禁用;

2,如果禁用APC传送,则FltQueryInformationFile将失败,因为必须在PASSIVE_LEVEL调用它并启用APC。

在这种情况下,我该如何查询文件大小?建立IRP有帮助吗?

提前致谢。

2 个答案:

答案 0 :(得分:2)

您可以使用它来获取文件大小

NTSTATUS
GetFileSize (
    _In_ PFLT_INSTANCE Instance,
    _In_ PFILE_OBJECT FileObject,
    _Out_ PLONGLONG Size
    )
/*++

Routine Description:

    This routine obtains the size.

Arguments:

    Instance - Opaque filter pointer for the caller. This parameter is required and cannot be NULL.

    FileObject - File object pointer for the file. This parameter is required and cannot be NULL.

    Size - Pointer to a LONGLONG indicating the file size. This is the output.

Return Value:

    Returns statuses forwarded from FltQueryInformationFile.

--*/
{
    NTSTATUS status = STATUS_SUCCESS;
    FILE_STANDARD_INFORMATION standardInfo;

    //
    //  Querying for FileStandardInformation gives you the offset of EOF.
    //

    status = FltQueryInformationFile( Instance,
                                      FileObject,
                                      &standardInfo,
                                      sizeof(FILE_STANDARD_INFORMATION),
                                      FileStandardInformation,
                                      NULL );

    if (NT_SUCCESS( status )) {

        *Size = standardInfo.EndOfFile.QuadPart;
    }

    return status;
}

答案 1 :(得分:0)

这个问题很老了,但是如果其他人偶然发现它(就像我一样),他们可能想知道在这个例子中使用的函数是FsRtlGetFileSize