Форум: "Прочее";
Текущий архив: 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.038 c