Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.02.10;
Скачать: [xml.tar.bz2];

Вниз

Помогите "сами мы тут не местным" :)   Найти похожие ветки 

 
Riply ©   (2008-01-03 12:01) [0]

Здравствуйте !
Есть предположение , что DeviceIoControl, работает так:
const
FILE_DEVICE_FILE_SYSTEM         = $00000009;

function DeviceIoControl(hDevice: THandle; dwIoControlCode: DWORD; lpInBuffer: Pointer;
 nInBufferSize: DWORD; lpOutBuffer: Pointer; nOutBufferSize: DWORD;
 var lpBytesReturned: DWORD; lpOverlapped: POverlapped): BOOL;
begin
//...
if lpOverlapped <> nil then
 begin
  //...
  if (IoControlCode shr 16) = FILE_DEVICE_FILE_SYSTEM
   then Result := NtFsControlFile(...
   else Result := NtDeviceIoControlFile(...
  //...
 end
else
 begin
  //...
  if (IoControlCode shr 16) = FILE_DEVICE_FILE_SYSTEM
   then Result := NtFsControlFile(...
   else Result := NtDeviceIoControlFile(...
  //...
 end
//...
end;


Интересует именно условие выбора (if (IoControlCode shr 16) = FILE_DEVICE_FILE_SYSTEM),
по которому вызывается либо NtFsControlFile, либо NtDeviceIoControlFile.
Правильно ли оно описано в приведенном коде ?
Кто умеет читать CPU - Window, проверте, пожалуйста.


 
Ketmar_   (2008-01-03 12:35) [1]

да чего ты мучаешься? в Реакторе глянь…


 
Riply ©   (2008-01-03 12:47) [2]

> [1] Ketmar_   (03.01.08 12:35)
> да чего ты мучаешься? в Реакторе глянь…

Слишком часто встречаются различия между реальным
кодом и кодом в "реакторе" :(.
Эта частота, даже выходит за рамки приличия :)


 
Ketmar_   (2008-01-03 13:17) [3]

ну, если я выпью столько, чтобы запустить VirtualBox, и никто до этого не ответит — гляну. только надо OllyDbg скачать. кстати, щаз и скачаю.


 
_Mike_   (2008-01-03 13:28) [4]


> Riply ©   (03.01.08 12:01)  

Абсолютно не так.

В первую очередь, DeviceIOControl проверяет что за Handle ей передан. В соответсвии с переданным Handle ищется драйвер устройства, для которого сей Handle открыт. После этого формируется IRP блок запроса, который и помещается в очередь соответствующего драйвера.

Следует так же учесть, что IRP выполняется через APC (асинхронный выхов процедур) (в подавляющем большинстве). Следовательно DeviceIOControl создает объект типа Mutex и ждет на нем заверения APC (если флаг Overlapped не указан), либо инифиализирует Overlapped и возвращает управление.

После того, как драйвер обработал запрос (когда это случится - только одному Биллу известно) он устанавливает событие об окончании APC и ваше приложение получает управление (событие в Overlapped сигналит).

Все это весьма упрощенно, но дает некое продставление.


 
Ketmar_   (2008-01-03 13:41) [5]

а вот щаз я немножко поспорю. таки всё, что ты описал — оно происходит, но уровнем ниже. сама же DeviceIOControl() именно что выбирает диспетчер, который будет дёргать драйвера. вот о принципе такого выбора и спрошено было. я так помню.

если что — прошу учесть текущее число и бодун. %-)


 
guav ©   (2008-01-03 15:19) [6]

Глянул в дизассемблер.
Проверка if (IoControlCode and $FFFF0000 = $00009) действительно есть, выбор между NtDeviceIoControlFile и NtFsControlFile действитеьно есть (причём у каждой две точки вызова), дальше смотреть лень, но похоже идея правильная.


 
guav ©   (2008-01-03 15:21) [7]

7C801636  and         eax,0FFFF0000h // eax := eax and $FFFF0000
7C80163B  cmp         eax,90000h     // if eax = $90000 then
7C801640  setne       al             // al := 0 else al := 1;


 
Riply ©   (2008-01-03 15:57) [8]

> [6] guav ©   (03.01.08 15:19)
> [7] guav ©   (03.01.08 15:21)

Вот и здорово.
Спасибо, Саш, большое :)


 
_Mike_   (2008-01-03 21:38) [9]


> сама же DeviceIOControl() именно что выбирает диспетчер,
>  который будет дёргать драйвера. вот о принципе такого выбора
> и спрошено было. я так помню.

Таки да.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2008.02.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.055 c
2-1200670447
Daskel
2008-01-18 18:34
2008.02.10
Отправка строки по сети


15-1200156462
Dmitry S
2008-01-12 19:47
2008.02.10
вопрос про prototype и js


4-1183212316
AlexanderMS
2007-06-30 18:05
2008.02.10
Установить шрифт окон.


4-1183512056
DagOT-R
2007-07-04 05:20
2008.02.10
Видимые окна


2-1200297813
dumka
2008-01-14 11:03
2008.02.10
Проигрыватель





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский