Díval jsem se na SetFilePointer přes IDA. V zásadě se dá říci následující:
1) pro nastavení pozice se používá nativní funkce NtSetInformationFile s parametrem FilePositionInformation,
2) pokud dwMoveMethod = FILE_BEGIN, SetFilePointer jen z druhého a třetího parametru utvoří novou hodnotu pozice v "souboru" a volá NtSetInformatioNFile,
3) pokud dwMoveMethod = FILE_CURRENT, SetFilePointer použije NtQueryInformationFile s parametrem FilePositionInformation na zjištění aktuální pozice, sečte ji s hodnotami v druhém a třetím parametru a nastaví novou pozici přes NtSetInformationFile,
4) pokud dwMoveMethod = FILE_END, SetFilePointer nejprve provede NtQueryInformationFile s parametrem FileStandardInformation, čímž mj. zjistí velikost "souboru" (položka EndOfFile vrácené struktury FILE_STANDARD_INFORMATION). K velikosti přičte hodnoty druhého a třetího parametru a opět použije NtSetInformationFile.
Jelikož se nikde nenastavuje chyba na ERROR_INVALID_FUNCTION, zřejmě je vrácena právě oním voláním NtQueryInformationFile s parametrem FileStandardInformation. Což nasvědčuje tomu, že disky nepodporují IRP_MJ_QUERY_INFORMATION s FileStandardInformation, nebo je mezi jejich drivery nějaká mezivrstva, která tak činí.