[Delphi] DeviceIoControl(handle,FSCTL_GET_NTFS_FILE_RECORD

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod Fantom007 13. 11. 2017 10:26

Kód: Vybrat vše
MftRecordInput: NTFS_FILE_RECORD_INPUT_BUFFER;
MftRecordOutput: ^NTFS_FILE_RECORD_OUTPUT_BUFFER;

Size:=sizeof(NTFS_FILE_RECORD_OUTPUT_BUFFER)+NtfsVolData.BytesPerFileRecordSegment-1;
GetMem(MftRecordOutput,Size);
DeviceIoControl(handle,FSCTL_GET_NTFS_FILE_RECORD,@MftRecordInput,sizeof(MftRecordInput),                                     MftRecordOutput,Size,BytesReturned,nil)
vrací chybu 5: Přístup byl odepřen.

Handle vytvářím
Kód: Vybrat vše
handle:=CreateFile(PChar('\\.\'+FileName),GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE,nil,OPEN_EXISTING,0,0)
a pro předchozí DeviceIoControl(handle,FSCTL_GET_NTFS_VOLUME_DATA ...) a GetFileInformationByHandle(handle,bhFileInfo) mi funguje OK (překontrolováno prohlédnutím sektorů na disku programem Active Disk Editor).
Pro úplnost dodávám, že pro FSCTL_GET_NTFS_VOLUME_DATA by měl být handle vytvořen '\\.\'+Filename[1]+':', ale to se mi nevede, naopak pomocí '\\.\'+FileName funguje OK.

Neporadí někdo, jak se chyby 5 zbavit a získat tak číslo záznamu v NTFS pro krátké soubory do 1kB ? (delší nejsou umístěny přímo v MFT záznamu, ale mají cluster assignment a funguje zde FSCTL_GET_RETRIEVAL_POINTERS)
Fantom007
Junior

Odeslat příspěvekod Nargon 13. 11. 2017 11:24

Zkus tu aplikaci spustit jako správce. Možná je opravdu celý problém v tom že uživatel pod kterým to spouštíš nemá dostatečná práva.
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod Fantom007 13. 11. 2017 12:23

Bohužel ani spuštění jako administrátor nepomáhá.
Fantom007
Junior

Odeslat příspěvekod Fantom007 14. 11. 2017 12:04

Omlouvám se, ale Nargon měl pravdu. Handle se musí vytvořit pod administrátorským účtem pomocí '\\.\'+Filename[1]+':' (měl jsem stejné chybové hlášky pro vytvoření handle i pro DeviceIoControl, po rozlišení jsem se dovtípil). Dík.
Fantom007
Junior

Odeslat příspěvekod Nargon 14. 11. 2017 12:30

Už jsem se lek. Protože chyba "5: Přístup byl odepřen" je chyba nedostatečných práv. A vzhledem k tomu že se snažís makat na MFT, kam běžně systém uživatele nepustí tak to asi nic jiného být nemůže. Jediné čeho jsem se lekl, že tam nemá přístup ani administrátor, což by mě úplně nepřekvapilo.
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků