2013-01-05 5 views
2

minifilter의 PostCreate가 진행되는 동안 전역 푸시 잠금을 사용하여 디자인별로 스레드를 동기화해야하며 FltQueryInformationFile을 호출하여 파일 크기를 쿼리해야합니다. 그러나APC가 비활성화 된 경우 파일 크기를 쿼리하는 방법은 무엇입니까?

,

1, 나는 APC 전달을 사용하지 FltAcquirePushLockExclusive를 호출 한 후,

2, APC 전달이 비활성화 된 경우 FlasQueryInformationFile은 PASSIVE_LEVEL에서 호출되어야하고 APC가 활성화되기 때문에 실패합니다.

그런 경우 어떻게 파일 크기를 쿼리해야합니까? IRP를 구축하는 데 도움이됩니까?

미리 감사드립니다.

+1

잠금을 취하기 전에'FltQueryInformationFile'을 호출하는 것이 쉬워 질 것입니다. 사용자 제약 조건은 무엇인지 모르겠습니다. – Rohan

+0

자신 만의 건물을 짓는 것은 매우 어렵고 권장 할만한 것이 아닙니다. @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