2013-01-05 23 views
2

在我的微過濾器的PostCreate期間,我必須使用全局推鎖來按設計同步線程,並且我必須調用FltQueryInformationFile來查詢文件大小。如何在APC被禁用時查詢文件大小?

然而,

1之後,我稱爲FltAcquirePushLockExclusive中,APC輸送被禁止;

2,如果禁用APC交付,則FltQueryInformationFile將失敗,因爲必須在PASSIVE_LEVEL上調用它並啓用APC。

在這種情況下,我該如何查詢文件大小?建立IRP有幫助嗎?

在此先感謝。

+1

更容易在鎖定之前調用FltQueryInformationFile,但我不是什麼用戶約束。 – Rohan

+0

建立你自己的IRP很難得到正確的結果並且不會被推薦。我會同意@Rohan的意見,Flt的職能也將幫助你在老Zw之前處理再入侵問題。 – Ironside

回答

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; 
} 
0

這個問題是很老,但如果對它別人絆(像我一樣),他們可能想知道的功能,在這種情況下使用是FsRtlGetFileSize