파일 시스템 인식 정보 가져오기

파일 시스템 인식은 아직 정의되지 않은 유효한 파일 시스템/볼륨 레이아웃이 포함된 스토리지 미디어를 인식하는 기능이지만, 미디어는 Windows에서 내부적으로 정의된 인식 구조의 존재를 통해 자신을 식별할 수 있습니다.

기존 파일 시스템이 새 디스크 레이아웃을 인식하지 않기 때문에 “RAW” 파일 시스템은 볼륨을 탑재하고 직접적인 블록 수준 액세스를 제공합니다. NtosKrnl에 통합된 “RAW” 파일 시스템은 다음 예제와 같이 파일 시스템 인식 구조를 읽고 파일 시스템 제어 요청 FSCTL_QUERY_FILE_SYSTEM_RECOGNITION을 통해 이러한 구조에 대한 액세스 권한을 애플리케이션에 제공할 수 있습니다.

STDMETHODIMP CheckFileSystem(
    PCWSTR pcwszDrive
    ) 
{
    HRESULT hr = S_OK;
    HANDLE  hDisk = INVALID_HANDLE_VALUE;
    BOOL    fResult = FALSE;    
    ULONG   BytesReturned = 0;    
    FILE_SYSTEM_RECOGNITION_INFORMATION     FsRi = {0};
    
    //
    // Open the target, for example "\\.\C:"
    //
    wprintf( L"CreateFile on %s...", pcwszDrive );
    hDisk = CreateFile( pcwszDrive, 
                        FILE_READ_ATTRIBUTES|SYNCHRONIZE|FILE_TRAVERSE,                        
                        FILE_SHARE_READ|FILE_SHARE_WRITE,
                        NULL, OPEN_EXISTING, 0, NULL );    
    if( hDisk == INVALID_HANDLE_VALUE ) 
    {
        hr = HRESULT_FROM_WIN32( GetLastError() );
        wprintf( L"CreateFile failed on %s, GLE = 0x%x\n", pcwszDrive, GetLastError() );
        goto exit;
    }
    wprintf( L"succeeded.\n\n" );

    wprintf( L"\nPress Any Key to send down the FSCTL\n" );
    _getwch();

    //
    // Send down the FSCTL
    //
    wprintf( L"Calling DeviceIoControl( FSCTL_QUERY_FILE_SYSTEM_RECOGNITION ) " );
    
    fResult = DeviceIoControl( hDisk, 
                               FSCTL_QUERY_FILE_SYSTEM_RECOGNITION, 
                               NULL, 
                               0, 
                               &FsRi, 
                               sizeof(FsRi), 
                               &BytesReturned, 
                               NULL );
    if( !fResult ) 
    {
        hr = HRESULT_FROM_WIN32( GetLastError() );
        wprintf( L"failed GLE = 0x%x\n", GetLastError() );
        goto exit;
    }
    wprintf( L"succeeded.\n\n" );

    wprintf( L"FSCTL_QUERY_FILE_SYSTEM_RECOGNITION returned success.\n" );

    wprintf( L"FSCTL_QUERY_FILE_SYSTEM_RECOGNITION retrieved \"%S\".\n",
              FsRi.FileSystem );

exit:

    if( hDisk != INVALID_HANDLE_VALUE ) 
    {
        CloseHandle( hDisk );
        hDisk = INVALID_HANDLE_VALUE;
    }

    return hr;
}

파일 시스템 인식

FILE_SYSTEM_RECOGNITION_STRUCTURE

FSCTL_QUERY_FILE_SYSTEM_RECOGNITION