Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
3-1176717144
NOD
2007-04-16 13:52
2007.07.15
Не могу разобраться с адо


9-1156602072
Heroes
2006-08-26 18:21
2007.07.15
Помогите пожалуйста очень надо!


2-1182228281
Officeman
2007-06-19 08:44
2007.07.15
иконка для нового типа файлов


2-1182500260
ИльяС
2007-06-22 12:17
2007.07.15
чтение из файла


2-1182024536
ММК
2007-06-17 00:08
2007.07.15
USB-флешка