Текущий архив: 2007.07.15;
Скачать: CL | DM;
Вниз
DeviceIoControl и повторное открытие диска. Найти похожие ветки
← →
Riply © (2007-06-18 07:58) [0]Здравствуйте !
Предположим, мы решили поработать с неким файлом (hTestedFile: THandle) через MFT.
Запрашиваем его pPointersBuf: PRETRIEVAL_POINTERS_BUFFER
DeviceIoControl(hTestedFile, FSCTL_GET_RETRIEVAL_POINTERS,.., pPointsBuf,...
Теперь, для дальнейшей работы(например, чтения кластеров), нам надо открыть сам диск:
hDrive := CreateFile(PChar(DriveName),...
Мне кажется, что при первом запросе (FSCTL_GET_RETRIEVAL_POINTERS),
DeviceIoControl уже открывал его (этот диск).
Получается, что мы дважды его открываем, что совсем не есть кузяво :)
Как можно обойтись одним открытием ?
Например, открыть диск и, имея на руках его Handle, запросить FSCTL_GET_RETRIEVAL_POINTERS ?
P.S. Ведь, наверное, существует какая-то Nt-функция,
через которую работает DeviceIoControl в данном случае или нет ?
← →
Dimaxx © (2007-06-18 10:26) [1]В первом вызове DeviceIoControl ты получал информацию о файле, а не о диске. Диск ОСью и так открыт. А то, что ты его открываешь вторично, думаю, не страшно - ты работаешь с ним сам.
А вообще работал как-то таким методом с диском. Его приходилось открывать только на время операций, а потом закрывать. Если этого не делать - лезут ошибки последующего доступа, да и отладка сильно затруднена. Я уже щас не помню подробностей - в сети видел исходник работы с диском через DeviceIoControl - там и чтение каталогов, чтение/запись цепочек и т.п.
← →
Игорь Шевченко © (2007-06-18 11:22) [2]
> Мне кажется, что при первом запросе (FSCTL_GET_RETRIEVAL_POINTERS),
>
> DeviceIoControl уже открывал его (этот диск).
Не открывал. Открытие какого-либо файла есть занесение его дескриптора в таблицу дескрипторов твоего процесса. Что там открыто другими процессами, в том числе и системными,для тебя индифферентно.
← →
Riply © (2007-06-18 13:58) [3]>[2] Игорь Шевченко © (18.06.07 11:22)
>Не открывал.
Это успокаивает. Спасибо :)
>Открытие какого-либо файла есть занесение его дескриптора
>в таблицу дескрипторов твоего процесса.
>Что там открыто другими процессами, в том числе и системными, для тебя индифферентно.
Мне не совсем понятно:
(Не смогла подобрать реальный пример, так что выдумываем :)
Допустим есть некая функция: GetFileInfoFromName
которая в своей работе использует GetFileInfoFromHandle.
Если у нас уже есть Handle файла, то неужели нам "индифферентно"
при помощи какой из них получать нужную информацию, т.к. GetFileInfoFromName
не "заносит его дескриптор в таблицу дескрипторов нашего процесса"?
← →
Игорь Шевченко © (2007-06-18 15:17) [4]Riply © (18.06.07 13:58) [3]
Не понимаю. Объект "Файл на диске" с его дескриптором, как ты понимаешь, несколько отличается от объекта "Диск как файл" с его собственным дескриптором.
Поэтому открывать надо оба, если нужен доступ к обоим объектам.
← →
Riply © (2007-06-18 21:40) [5]> [4] Игорь Шевченко © (18.06.07 15:17)
>Не понимаю.
Sorry. Я, к сожалению, часто невнятно излагаю свои мысли.
Попробую еще раз:
Как мне казалось, DeviceIoControl(hTestedFile, FSCTL_GET_RETRIEVAL_POINTERS,..,
"внутри себя", при данном запросе, работает так:
1. Открывает диск, соответсвующий hTestedFile
2. Используя Handle этого диска(открытого как файл), получает нужную информацию для hTestedFile
3. Закрывает диск.
Вот меня и заинтересовала эта функция,
которая "Используя Handle этого диска, получает нужную информацию для hTestedFile"
← →
Игорь Шевченко © (2007-06-19 11:29) [6]Riply © (18.06.07 21:40) [5]
> Как мне казалось, DeviceIoControl(hTestedFile, FSCTL_GET_RETRIEVAL_POINTERS,
> ..,
> "внутри себя", при данном запросе, работает так:
> 1. Открывает диск, соответсвующий hTestedFile
> 2. Используя Handle этого диска(открытого как файл), получает
> нужную информацию для hTestedFile
> 3. Закрывает диск.
> Вот меня и заинтересовала эта функция,
> которая "Используя Handle этого диска, получает нужную информацию
> для hTestedFile"
Примерно так и работает, только Handle, полученный для диска к твоему процессу никакого отношения не имеет, следовательно, для того, чтобы в своем процессе получить досутп к диску, его надо открывать. Система внутре себя открывает массу различных файлов - и что с того ? Для тебя они не видны, следовательно, бесполезны.
Читайте Неббета - оно рулез.
← →
Riply © (2007-06-19 21:41) [7]> [6] Игорь Шевченко © (19.06.07 11:29)
>Примерно так и работает, только Handle, полученный для диска к твоему
>процессу никакого отношения не имеет, следовательно, для того,
>чтобы в своем процессе получить досутп к диску, его надо открывать.
Вот я и подумала, что можно действовать так:
1. Сами открываем диск
2. Вызываем эту функцию, которая "Используя Handle этого диска,
получает нужную информацию для hTestedFile".
3. Продолжаем работу с диском
4. Закрываем его.
Получается, что мы сумели обойтись одним открыванием :)
Поэтому и спросила, что это за хитрая функция и можно ли простому смертному ею воспользоваться ?
← →
Игорь Шевченко © (2007-06-20 09:42) [8]
> P.S. Ведь, наверное, существует какая-то Nt-функция,
> через которую работает DeviceIoControl в данном случае или
> нет ?
Существует. NtFsControlFile называется. Но каким боком она тебе может пригодиться - не пойму.
← →
Riply © (2007-06-21 07:01) [9]>[8] Игорь Шевченко © (20.06.07 09:42)
>Существует. NtFsControlFile называется.
Спасибо.
>Но каким боком она тебе может пригодиться - не пойму.
И правильно, что не понимаете.
На проверку, она (функция) оказалась совсем не тем, о чем я мечтала :)
Страницы: 1 вся ветка
Текущий архив: 2007.07.15;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.018 c