Hodně fragmentovaný soubor a FSCTL_GET_RETRIEVAL_POINTERS

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

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

Odeslat příspěvekod Fantom007 5. 12. 2017 15:04

Pokud má soubor více než 31 fragmentů, vrací funkce DeviceIoControl(handle,FSCTL_GET_RETRIEVAL_POINTERS ...) chybový kód ERROR_MORE_DATA (mohu vypsat jen těchto prvních 31 fragmentů). Pokud použiju DeviceIoControl(hDrive,FSCTL_GET_NTFS_FILE_RECORD ...), vidím v atributu DATA všechny fragmenty v částech DataRun. S hodnotou ClusterCount není problém. Hodnotu FirstCluster získám tak, že k předchozí hodnotě FirstCluster přičtu hodnotu FirstCluster načtenou z aktuální DataRun. Funguje to, ovšem jen do určité meze (nad ní jsou u mne hodnoty v rozsahu 0x4CA4126 až 53CA47E). Pokud od této hodnoty za limitem odečtu přesně 0x1000000 (např. 0x4CA4126-0x1000000=0x3CA4126), vše přesně sedí a mohu pokračovat dále. Divné, ale funguje mi to. Až na jednu výjimku - 0x4459D96 - zde musím odečíst 0x10000, abych dostal 0x4449D96. Záhada.
Já si mohu diskový oddíl defragmentovat, ale chtěl bych být schopen tento problém vyřešit kvůli jiným diskům, které defragmentované být nemusí (píšu program vypisující soubory, které leží na vadných sektorech disku). Problém je to dost speciální, ale např. defragmentační programy si s ním musí určitě poradit. Problém není v mém programu, ale obecně, v programu Active@DiskEditor to vidím stejně divně. Takový špek asi nikdo znát nebude, ale co kdyby náhodou?
Fantom007
Junior

Odeslat příspěvekod Nargon 6. 12. 2017 15:02

Původně jsem chtěl napsat jedno přísloví z červeného trpaslíka: "Jedno staré kočičí přísloví říká: co to sakra meleš ty vořechu?"
Ale co se tak dívám na microsoftí web: https://msdn.microsoft.com/en-us/library/windows/desktop/aa364572(v=vs.85).aspx a na chybu "ERROR_MORE_DATA" tak by mělo stačit jen funkci zavolat s větším bufferem, kam se vejdou i ty další data. Nebo to jsi už zkoušel?
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 7. 12. 2017 07:43

Jak prosté, milý Watsone! Skutečně pouhé zvětšení jediného čísla (velikosti bufferu) můj problém vyřešilo. Že mě to nenapadlo? A já bláhový si myslel, že se jedná o systémové omezení FSCTL_GET_RETRIEVAL_POINTERS, podobně jako u malých souborů umístěných residentně přímo v MFT. Děláš mi radost chlapče, jen neusnout na vavřínech (pouhý eufemismus, nic jiného to neznamená). Tisíceré díky. Zjišťuji svoji multikulturní zaostalost ohledně Červeného trpaslíka a zvažuji doplnění této mezery ve vzdělání (moc hezká hláška, musím si ji zapamatovat).

Jsem rád, že se nemusím patlat ve výše uvedených záhadách fragmentovaných souborů pomocí metody FSCTL_GET_NTFS_FILE_RECORD. Už to nepotřebuji, ale pokud by někdo čistě ze studijních důvodů znal odpověď, nechť se nebojí ji napsat.
Fantom007
Junior


Kdo je online

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