CreateFile katalogida NTFS da ReadFile da bajarilmaydi

Go'yoki NTFS jildida kataloglarni ochish va o'qish mumkin. Biroq, bu kodni sinash uchun ishlamagan, shuning uchun google-ni sinab ko'rdim, u meni topdi. Bu menga tegishli bo'lgan. "> bu .

Sizning asosiy kuzatishingiz FILE_FLAG_BACKUP_SEMANTICS dan foydalanishingiz kerak. Ya'ni, bu kesish, men asosan olish:

HANDLE hFile = CreateFile(L"C:\\temp", GENERIC_READ, FILE_SHARE_READ,
    0, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0);

DWORD dwFileSize = GetFileSize(hFile, 0);
char* buf = new char[dwFileSize];

DWORD dwBytesRead = 0;
BOOL b = ReadFile(hFile, buf, dwFileSize, &dwBytesRead, 0);

To'g'ri oldinga siljiydi. Afsuski, bu ishlamayapti.

CreateFile va GetFileSize har ikkalasi ham ishlaydi (dastak emas, INVALID_HANDLE_VALUE, nol va noaniq fayl hajmi), lekin ReadFile FALSE funksiyasini qaytaradi, dwBytesRead nol va GetLastError 1 qiymatini qaytaradi ("noto'g'ri funksiya"). Huh.

Men bu savolni yozyapman, "Similar Questions" so'zi menga bu ko'rsatdi. AdjustTokenPrivileges dan foydalanish haqida bu ish juda ko'p ma'noga ega. Biroq, bu yordam bermadi. Ushbu misolga ReadFile (va c: \ temp-dan foydalanib) qo'shilishi xuddi shunday xulqni beradi. CreateFile docs faylini yanada yaqinroq o'qish shuni ko'rsatadiki, hatto SE_BACKUP_NAME imtiyozi bo'lmagan holda, administrator privilegiyalari tufayli faylni ochishim kerak.

Men bir nechta almashtirishni sinab ko'rdim:

  • Katalog nomini ( c: \ temp , c: \ temp \ , \\. \ c: \ temp , \\? \ C: \ temp \ va boshqalar).
  • Turli katalog
  • Turli haydovchilar
  • Turli xil ulush imkoniyatlari (0, FILE_SHARE_READ, FILE_SHARE_READ | FILE_SHARE_WRITE)
  • Turli ruxsatnomalar ( GENERIC_READ , FILE_LIST_DIRECTORY , FILE_LIST_DIRECTORY + FILE_READ_EA + FILE_READ_ATTRIBUTES , FILE_LIST_DIRECTORY + FILE_READ_EA + FILE_READ_ATTRIBUTES + FILE_TRAVERSE < kodi>)
  • FILE_FLAG_BACKUP_SEMANTICS dan boshqa hech qanday bayroqni topa olmayapman (men buni talab qilmoqdaman), lekin FILE_FLAG_NO_BUFFERING va 4096 baytli hoshiyali buferni sinab ko'rdim. Yo'q.

Men (hozirda) 152 permutatsiya ishlayapman va ReadFiles hech ishlamayapti. Nima yo'qotmayapman?

Mening asl varsayımım bu erda noto'g'ri bormi? Bir katalogdan "o'qish" mumkin emasmi? Yoki hali hanuzgacha yo'qotishim kerakmi?

Yana nimani eslatib o'tishim kerak?

  • Men administrator sifatida ishlayapman va tovushda CreateFile qila olaman.
  • Unicode uchun yaratilgan dastur 64bit.
  • Windows 7 x64
  • NTFS 3.1 hajmi
  • Tashqi ko'rinishdagi bulutli (Hey, siz nima muhimligini bilishingiz mumkin ...)
0
@JonathanPotter Bu gaplashishni boshdan kechiradimi? Yoki sizda manba bormi?
qo'shib qo'ydi muallif David Wohlferd, manba
Ushbu savolning maqsadi katalogda "ReadFile" ni bajarish edi. Javob aniq ko'rinadi: siz qilolmaysiz. Katalog uchun xom $ INDEX_ALLOCATION ma'lumotlarini o'qish istasangiz, buni boshqa yo'l bilan (men yozishni boshlaganim) qilishingiz kerak. @JonathanPotter Fikringizni sharh sifatida yozmoqchi bo'lsangiz, buni qabul qilaman.
qo'shib qo'ydi muallif David Wohlferd, manba
Ushbu savolning maqsadi katalogda "ReadFile" ni bajarish edi. Javob aniq ko'rinadi: siz qilolmaysiz. Katalog uchun xom $ INDEX_ALLOCATION ma'lumotlarini o'qish istasangiz, buni boshqa yo'l bilan (men yozishni boshlaganim) qilishingiz kerak. @JonathanPotter Fikringizni sharh sifatida yozmoqchi bo'lsangiz, buni qabul qilaman.
qo'shib qo'ydi muallif David Wohlferd, manba
Ushbu savolning maqsadi katalogda "ReadFile" ni bajarish edi. Javob aniq ko'rinadi: siz qilolmaysiz. Katalog uchun xom $ INDEX_ALLOCATION ma'lumotlarini o'qish istasangiz, buni boshqa yo'l bilan (men yozishni boshlaganim) qilishingiz kerak. @JonathanPotter Fikringizni sharh sifatida yozmoqchi bo'lsangiz, buni qabul qilaman.
qo'shib qo'ydi muallif David Wohlferd, manba
@Anders bu noreferrer"> bu ga asoslangan holda men $ INDEX_ALLOCATION ::.
qo'shib qo'ydi muallif David Wohlferd, manba
@Anders bu noreferrer"> bu ga asoslangan holda men $ INDEX_ALLOCATION ::.
qo'shib qo'ydi muallif David Wohlferd, manba
@JonathanPotter Bu gaplashishni boshdan kechiradimi? Yoki sizda manba bormi?
qo'shib qo'ydi muallif David Wohlferd, manba
Huh. Bu juda aniq ko'rinadi.
qo'shib qo'ydi muallif David Wohlferd, manba
Huh. Bu juda aniq ko'rinadi.
qo'shib qo'ydi muallif David Wohlferd, manba
Agar bo'lsa, nima qilgan bo'lsangiz, GetFileInformationByHandleEx buni amalga oshirishi mumkin.
qo'shib qo'ydi muallif Harry Johnston, manba
Agar bo'lsa, nima qilgan bo'lsangiz, GetFileInformationByHandleEx buni amalga oshirishi mumkin.
qo'shib qo'ydi muallif Harry Johnston, manba
BackupRead bir katalogdan o'qish uchun da'vo qiladi, ammo u o'qigan ma'lumotlardan $ INDEX_ALLOCATION o'z ichiga olganligini bilmayman.
qo'shib qo'ydi muallif Harry Johnston, manba
BackupRead bir katalogdan o'qish uchun da'vo qiladi, ammo u o'qigan ma'lumotlardan $ INDEX_ALLOCATION o'z ichiga olganligini bilmayman.
qo'shib qo'ydi muallif Harry Johnston, manba
BackupRead bir katalogdan o'qish uchun da'vo qiladi, ammo u o'qigan ma'lumotlardan $ INDEX_ALLOCATION o'z ichiga olganligini bilmayman.
qo'shib qo'ydi muallif Harry Johnston, manba
Siz ba'zi narsalarni bajarish uchun katalogga dastlabki papkani ochishingiz mumkin, biroq ularni ReadFile deb atash mumkin.
qo'shib qo'ydi muallif Jonathan Potter, manba
msdn.microsoft.com/tr -us/kutubxona/windows/desktop/& hellip; katalog vazifasini o'tishi mumkin bo'lgan funktsiyalar ro'yxati mavjud.
qo'shib qo'ydi muallif Jonathan Potter, manba
Bir katalogdan nima kutmoqdasiz? Fayllar ro'yxati?
qo'shib qo'ydi muallif Anders, manba
Bir katalogdan nima kutmoqdasiz? Fayllar ro'yxati?
qo'shib qo'ydi muallif Anders, manba
fayl tizimi drayverlari (ntfs da) har doim xato kodini IRP_MJ_READ katalog faylini so'roviga qaytaradi. odatda STATUS_INVALID_DEVICE_REQUEST yoki STATUS_INVALID_PARAMETER
qo'shib qo'ydi muallif RbMm, manba
fayl tizimi drayverlari (ntfs da) har doim xato kodini IRP_MJ_READ katalog faylini so'roviga qaytaradi. odatda STATUS_INVALID_DEVICE_REQUEST yoki STATUS_INVALID_PARAMETER
qo'shib qo'ydi muallif RbMm, manba
fayl tizimi drayverlari (ntfs da) har doim xato kodini IRP_MJ_READ katalog faylini so'roviga qaytaradi. odatda STATUS_INVALID_DEVICE_REQUEST yoki STATUS_INVALID_PARAMETER
qo'shib qo'ydi muallif RbMm, manba

6 javoblar

Jonathan Potter to'g'ri javob berganiga o'xshaydi. So'ralganiga qaramay, u o'z sharhlarini javob sifatida qoldirishni istamadi. Shuning uchun men savolni yopish uchun uning javoblari asosida yaratmoqchiman.

Muxtasar qilib aytganda: "Siz ba'zi narsalarni bajarish uchun katalogga dastani ochishingiz mumkin, lekin ularda ReadFile-ni chaqirish ulardan emas."

Qanday narsalar? Bu narsalar . Ushbu ro'yxatga quyidagilar kiradi:

  • BackupRead
  • BackupSeek
  • BackupWrite
  • GetFileInformationByHandle
  • GetFileSize
  • GetFileTime
  • GetFileType
  • ReadDirectoryChangesW
  • SetFileTime

Xulosa qilib: Siz «ochish» va ular haqida ba'zi ma'lumotlarni "o'qish" mumkin bo'lsa, aslida ReadFile dan foydalana olmaysiz. Agar siz DirName :: INDEX_ALLOCATION ma'lumotini o'qishni istasangiz, boshqa usuldan foydalaning.

0
qo'shib qo'ydi

Jonathan Potter to'g'ri javob berganiga o'xshaydi. So'ralganiga qaramay, u o'z sharhlarini javob sifatida qoldirishni istamadi. Shuning uchun men savolni yopish uchun uning javoblari asosida yaratmoqchiman.

Muxtasar qilib aytganda: "Siz ba'zi narsalarni bajarish uchun katalogga dastani ochishingiz mumkin, lekin ularda ReadFile-ni chaqirish ulardan emas."

Qanday narsalar? Bu narsalar . Ushbu ro'yxatga quyidagilar kiradi:

  • BackupRead
  • BackupSeek
  • BackupWrite
  • GetFileInformationByHandle
  • GetFileSize
  • GetFileTime
  • GetFileType
  • ReadDirectoryChangesW
  • SetFileTime

Xulosa qilib: Siz «ochish» va ular haqida ba'zi ma'lumotlarni "o'qish" mumkin bo'lsa, aslida ReadFile dan foydalana olmaysiz. Agar siz DirName :: INDEX_ALLOCATION ma'lumotini o'qishni istasangiz, boshqa usuldan foydalaning.

0
qo'shib qo'ydi

Jonathan Potter to'g'ri javob berganiga o'xshaydi. So'ralganiga qaramay, u o'z sharhlarini javob sifatida qoldirishni istamadi. Shuning uchun men savolni yopish uchun uning javoblari asosida yaratmoqchiman.

Muxtasar qilib aytganda: "Siz ba'zi narsalarni bajarish uchun katalogga dastani ochishingiz mumkin, lekin ularda ReadFile-ni chaqirish ulardan emas."

Qanday narsalar? Bu narsalar . Ushbu ro'yxatga quyidagilar kiradi:

  • BackupRead
  • BackupSeek
  • BackupWrite
  • GetFileInformationByHandle
  • GetFileSize
  • GetFileTime
  • GetFileType
  • ReadDirectoryChangesW
  • SetFileTime

Xulosa qilib: Siz «ochish» va ular haqida ba'zi ma'lumotlarni "o'qish" mumkin bo'lsa, aslida ReadFile dan foydalana olmaysiz. Agar siz DirName :: INDEX_ALLOCATION ma'lumotini o'qishni istasangiz, boshqa usuldan foydalaning.

0
qo'shib qo'ydi

Agar oqimni ochmoqchi bo'lsangiz, oqim nomini va/yoki turini yo'lning bir qismi sifatida kiritishingiz kerak:

  • c:\foo:bar A.K.A. c:\foo:bar:$DATA
  • c:\foo::$INDEX_ALLOCATION

Translatsiya ko'rsatilmagan bo'lsa, $ DATA oqimi ishlatiladi. $ DATA fayllarni "oddiy ma'lumotlar" saqlaydi.

Agar katalogdagi fayllar ro'yxatini istasangiz, u holda GetFileInformationByHandleEx (FileIdBothDirectoryInfo) (eski tizimlarda NtQueryDirectoryFile ) dan foydalanishingiz mumkin.

0
qo'shib qo'ydi
"cmd.exe-ni disk raskadrovka qila olasiz va nima qilganini bilib olishingiz mumkin. Ha, bu ishlaydi, ammo u muvaffaqiyatga erishish uchun ReadFile-ni bajarishi kerak emas. Ehtimol, Garri so'zlagan GetFileInformationByHandleExni bajaradi. Hujjatlarga kelsak, MS dan hech narsa yo'q. Lekin bu yerda va u erda bu haqda gapirish.
qo'shib qo'ydi muallif David Wohlferd, manba
Men sizni INDEX_ALLOCATION deb hisoblaysiz. Ammo ReadFile har ikkalasida ham muvaffaqiyatsiz bo'lgani uchun muhim emas. Shunday qilib, hujjatlarni so «DirName», «DirName :: $ INDEX_ALLOCATION» va «DirName: $ I30: $ INDEX_ALLOCATION» deb atashganda, buni e'tiborsiz qoldiring. , bu erda javob Jonathan nima deydi: ReadFile faqat kataloglar uchun no-go
qo'shib qo'ydi muallif David Wohlferd, manba
dir C: \ Windows: $ I30: $ INDEX_ALLOCATION men uchun ishlaydi, siz cmd.exe-ni disk raskadrovka qila olasiz va nima qilganini ko'rishingiz mumkin. ReadFile-dan foydalana olmaysiz, ehtimol, mumkin, hatto ikkilik format, ehtimol, hujjatsiz bo'lishi mumkin.
qo'shib qo'ydi muallif Anders, manba

Agar oqimni ochmoqchi bo'lsangiz, oqim nomini va/yoki turini yo'lning bir qismi sifatida kiritishingiz kerak:

  • c:\foo:bar A.K.A. c:\foo:bar:$DATA
  • c:\foo::$INDEX_ALLOCATION

Translatsiya ko'rsatilmagan bo'lsa, $ DATA oqimi ishlatiladi. $ DATA fayllarni "oddiy ma'lumotlar" saqlaydi.

Agar katalogdagi fayllar ro'yxatini istasangiz, u holda GetFileInformationByHandleEx (FileIdBothDirectoryInfo) (eski tizimlarda NtQueryDirectoryFile ) dan foydalanishingiz mumkin.

0
qo'shib qo'ydi
"cmd.exe-ni disk raskadrovka qila olasiz va nima qilganini bilib olishingiz mumkin. Ha, bu ishlaydi, ammo u muvaffaqiyatga erishish uchun ReadFile-ni bajarishi kerak emas. Ehtimol, Garri so'zlagan GetFileInformationByHandleExni bajaradi. Hujjatlarga kelsak, MS dan hech narsa yo'q. Lekin bu yerda va u erda bu haqda gapirish.
qo'shib qo'ydi muallif David Wohlferd, manba
Men sizni INDEX_ALLOCATION deb hisoblaysiz. Ammo ReadFile har ikkalasida ham muvaffaqiyatsiz bo'lgani uchun muhim emas. Shunday qilib, hujjatlarni so «DirName», «DirName :: $ INDEX_ALLOCATION» va «DirName: $ I30: $ INDEX_ALLOCATION» deb atashganda, buni e'tiborsiz qoldiring. , bu erda javob Jonathan nima deydi: ReadFile faqat kataloglar uchun no-go
qo'shib qo'ydi muallif David Wohlferd, manba
dir C: \ Windows: $ I30: $ INDEX_ALLOCATION men uchun ishlaydi, siz cmd.exe-ni disk raskadrovka qila olasiz va nima qilganini ko'rishingiz mumkin. ReadFile-dan foydalana olmaysiz, ehtimol, mumkin, hatto ikkilik format, ehtimol, hujjatsiz bo'lishi mumkin.
qo'shib qo'ydi muallif Anders, manba

Agar oqimni ochmoqchi bo'lsangiz, oqim nomini va/yoki turini yo'lning bir qismi sifatida kiritishingiz kerak:

  • c:\foo:bar A.K.A. c:\foo:bar:$DATA
  • c:\foo::$INDEX_ALLOCATION

Translatsiya ko'rsatilmagan bo'lsa, $ DATA oqimi ishlatiladi. $ DATA fayllarni "oddiy ma'lumotlar" saqlaydi.

Agar katalogdagi fayllar ro'yxatini istasangiz, u holda GetFileInformationByHandleEx (FileIdBothDirectoryInfo) (eski tizimlarda NtQueryDirectoryFile ) dan foydalanishingiz mumkin.

0
qo'shib qo'ydi
"cmd.exe-ni disk raskadrovka qila olasiz va nima qilganini bilib olishingiz mumkin. Ha, bu ishlaydi, ammo u muvaffaqiyatga erishish uchun ReadFile-ni bajarishi kerak emas. Ehtimol, Garri so'zlagan GetFileInformationByHandleExni bajaradi. Hujjatlarga kelsak, MS dan hech narsa yo'q. Lekin bu yerda va u erda bu haqda gapirish.
qo'shib qo'ydi muallif David Wohlferd, manba
Men sizni INDEX_ALLOCATION deb hisoblaysiz. Ammo ReadFile har ikkalasida ham muvaffaqiyatsiz bo'lgani uchun muhim emas. Shunday qilib, hujjatlarni so «DirName», «DirName :: $ INDEX_ALLOCATION» va «DirName: $ I30: $ INDEX_ALLOCATION» deb atashganda, buni e'tiborsiz qoldiring. , bu erda javob Jonathan nima deydi: ReadFile faqat kataloglar uchun no-go
qo'shib qo'ydi muallif David Wohlferd, manba
dir C: \ Windows: $ I30: $ INDEX_ALLOCATION men uchun ishlaydi, siz cmd.exe-ni disk raskadrovka qila olasiz va nima qilganini ko'rishingiz mumkin. ReadFile-dan foydalana olmaysiz, ehtimol, mumkin, hatto ikkilik format, ehtimol, hujjatsiz bo'lishi mumkin.
qo'shib qo'ydi muallif Anders, manba