![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DeviceIoControl и повторное открытие диска.
Riply © (2007-06-18 07:58:00)Здравствуйте !
Предположим, мы решили поработать с неким файлом (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 в данном случае или нет ?
Riply (2007-06-21 07:01:00) [1]>[8] Игорь Шевченко © (20.06.07 09:42)
>Существует. NtFsControlFile называется.
Спасибо.
>Но каким боком она тебе может пригодиться - не пойму.
И правильно, что не понимаете.
На проверку, она (функция) оказалась совсем не тем, о чем я мечтала :)
Игорь Шевченко (2007-06-20 09:42:00) [2]
> P.S. Ведь, наверное, существует какая-то Nt-функция,
> через которую работает DeviceIoControl в данном случае или
> нет ?
Существует. NtFsControlFile называется. Но каким боком она тебе может пригодиться - не пойму.
Riply (2007-06-19 21:41:00) [3]> [6] Игорь Шевченко © (19.06.07 11:29)
>Примерно так и работает, только Handle, полученный для диска к твоему
>процессу никакого отношения не имеет, следовательно, для того,
>чтобы в своем процессе получить досутп к диску, его надо открывать.
Вот я и подумала, что можно действовать так:
1. Сами открываем диск
2. Вызываем эту функцию, которая "Используя Handle этого диска,
получает нужную информацию для hTestedFile".
3. Продолжаем работу с диском
4. Закрываем его.
Получается, что мы сумели обойтись одним открыванием :)
Поэтому и спросила, что это за хитрая функция и можно ли простому смертному ею воспользоваться ?
Игорь Шевченко (2007-06-19 11:29:00) [4]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-18 21:40:00) [5]> [4] Игорь Шевченко © (18.06.07 15:17)
>Не понимаю.
Sorry. Я, к сожалению, часто невнятно излагаю свои мысли.
Попробую еще раз:
Как мне казалось, DeviceIoControl(hTestedFile, FSCTL_GET_RETRIEVAL_POINTERS,..,
"внутри себя", при данном запросе, работает так:
1. Открывает диск, соответсвующий hTestedFile
2. Используя Handle этого диска(открытого как файл), получает нужную информацию для hTestedFile
3. Закрывает диск.
Вот меня и заинтересовала эта функция,
которая "Используя Handle этого диска, получает нужную информацию для hTestedFile"
Игорь Шевченко (2007-06-18 15:17:00) [6]Riply © (18.06.07 13:58) [3]
Не понимаю. Объект "Файл на диске" с его дескриптором, как ты понимаешь, несколько отличается от объекта "Диск как файл" с его собственным дескриптором.
Поэтому открывать надо оба, если нужен доступ к обоим объектам.
Riply (2007-06-18 13:58:00) [7]>[2] Игорь Шевченко © (18.06.07 11:22)
>Не открывал.
Это успокаивает. Спасибо :)
>Открытие какого-либо файла есть занесение его дескриптора
>в таблицу дескрипторов твоего процесса.
>Что там открыто другими процессами, в том числе и системными, для тебя индифферентно.
Мне не совсем понятно:
(Не смогла подобрать реальный пример, так что выдумываем :)
Допустим есть некая функция: GetFileInfoFromName
которая в своей работе использует GetFileInfoFromHandle.
Если у нас уже есть Handle файла, то неужели нам "индифферентно"
при помощи какой из них получать нужную информацию, т.к. GetFileInfoFromName
не "заносит его дескриптор в таблицу дескрипторов нашего процесса"?
Игорь Шевченко (2007-06-18 11:22:00) [8]
> Мне кажется, что при первом запросе (FSCTL_GET_RETRIEVAL_POINTERS),
>
> DeviceIoControl уже открывал его (этот диск).
Не открывал. Открытие какого-либо файла есть занесение его дескриптора в таблицу дескрипторов твоегопроцесса. Что там открыто другими процессами, в том числе и системными,для тебя индифферентно.
Dimaxx (2007-06-18 10:26:00) [9]В первом вызове DeviceIoControl ты получал информацию о файле, а не о диске. Диск ОСью и так открыт. А то, что ты его открываешь вторично, думаю, не страшно - ты работаешь с ним сам.
А вообще работал как-то таким методом с диском. Его приходилось открывать только на время операций, а потом закрывать. Если этого не делать - лезут ошибки последующего доступа, да и отладка сильно затруднена. Я уже щас не помню подробностей - в сети видел исходник работы с диском через DeviceIoControl - там и чтение каталогов, чтение/запись цепочек и т.п.