3

ミニフィルターの PostCreate 中に、設計上、グローバル プッシュ ロックを使用してスレッドを同期する必要があり、FltQueryInformationFile を呼び出してファイル サイズを照会する必要があります。

でも、

1. FltAcquirePushLockExclusive を呼び出した後、APC 配信が無効になります。

2. APC 配信が無効になっている場合、FltQueryInformationFile は PASSIVE_LEVEL で呼び出す必要があり、APC が有効になっているため、失敗します。

このような場合、どのようにファイル サイズを問い合わせればよいでしょうか。IRP の構築は役に立ちますか?

前もって感謝します。

4

2 に答える 2

3

これを使用してファイルサイズを取得できます

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;
}
于 2015-01-19T08:37:43.790 に答える