· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Про функции HAL

Посл.отвђт Сообщенiе


Дата: Окт 28, 2003 13:37:05

Есть например функция HalDisableSystemInterrupt, а какие параметры ей передавать ? на MSDN про эту функцию ничего не нашел. Где взять описание этих HAL функций (язык по барабану :)


Дата: Окт 28, 2003 15:35:51

[ s_work: ...на MSDN про эту функцию ничего не нашел. ]

Подобные функции логичнее смотреть в DDK, но конкретно этой нет.


[ s_work: Где взять описание этих HAL функций... ]

Если в DDK нет, искать в сети. Если в сети нет то смотреть в дизасм.
ntoskrnl.exe вызывает её так:
:0042CF47    push [ebp+var_4]
:0042CF4A    push [esi+KINTERRUPT.Vector]
:0042CF4D    call ds:__imp__HalDisableSystemInterrupt@8
. . .
:0042CF56 _KeDisconnectInterrupt@4 endp


Насколько я успел понять, esi указывает на структуру KINTERRUPT.
Определение вытянуто из дебужных символов.
struct _KINTERRUPT {
  /*<thisrel this+0x0>*/ /*|0x2|*/ short Type;
  /*<thisrel this+0x2>*/ /*|0x2|*/ short Size;
  /*<thisrel this+0x4>*/ /*|0x8|*/ struct _LIST_ENTRY InterruptListEntry;
  /*<thisrel this+0xc>*/ /*|0x4|*/ unsigned char  (ServiceRoutine*)(struct _KINTERRUPT*, void*);
  /*<thisrel this+0x10>*/ /*|0x4|*/ void* ServiceContext;
  /*<thisrel this+0x14>*/ /*|0x4|*/ unsigned long SpinLock;
  /*<thisrel this+0x18>*/ /*|0x4|*/ unsigned long Spare1;
  /*<thisrel this+0x1c>*/ /*|0x4|*/ unsigned long* ActualLock;
  /*<thisrel this+0x20>*/ /*|0x4|*/ void  (DispatchAddress*)();
  /*<thisrel this+0x24>*/ /*|0x4|*/ unsigned long Vector;
  /*<thisrel this+0x28>*/ /*|0x1|*/ unsigned char Irql;
  /*<thisrel this+0x29>*/ /*|0x1|*/ unsigned char SynchronizeIrql;
  /*<thisrel this+0x2a>*/ /*|0x1|*/ unsigned char FloatingSave;
  /*<thisrel this+0x2b>*/ /*|0x1|*/ unsigned char Connected;
  /*<thisrel this+0x2c>*/ /*|0x1|*/ char Number;
  /*<thisrel this+0x2d>*/ /*|0x1|*/ unsigned char ShareVector;
  /*<thisrel this+0x30>*/ /*|0x4|*/ int Mode;
  /*<thisrel this+0x34>*/ /*|0x4|*/ unsigned long Spare2;
  /*<thisrel this+0x38>*/ /*|0x4|*/ unsigned long Spare3;
  /*<thisrel this+0x3c>*/ /*|0x1a8|*/ unsigned long DispatchCode[106];
};
// <size 0x1e4>


Так что первыйпараметр это номер вектора прерывания, а второй не используется в HalDisableSystemInterrupt, по крайней мере под 2000. Сама _HalDisableSystemInterrupt@8 очень простая. Ищи в сети описание портов контороллера прерываний.
0FFDFF030h, которое ты найдешь в теле HalDisableSystemInterrupt это KPCR.IDR. Сама структура KPCR описана в ддк.
Это все, что могу на данный момент.

ЗЫ: Интересно, а зачем может потребоваться вызвать функцию, про которую ничего не известно? :-)


Дата: Окт 28, 2003 16:06:57

Ха... так и думал, что Four-F ответит, спасибо за подсказку. Не мелкая структура :) Поищем в DDK...
>ЗЫ: Интересно, а зачем может потребоваться вызвать
>функцию, про которую ничего не известно? :-)
Интересно копать, да и так есть одна мысль сниффер написасть без WinPCAP, читать прямо из порта, поэтому и нужны функции HAL. Если у Вас есть опыт в подобных делах, то поделитесь ответом, на правильный путь я встал или как ?


Дата: Окт 28, 2003 17:12:53

[ s_work: Не мелкая структура :) Поищем в DDK... ]

Там её нет. Я вытащил её из ntoskrnlsym.pdb с помощью pdbdump - есть такой хороший тул.
Лежит тут http://pdbdump.sourceforge.net/


[ s_work: ...поделитесь ответом, на правильный путь я встал или как ? ]

Трудно сказать, т.к. не понятно сниффер чего требуется написать и что такое WinPCAP.
Но в общем случае лучше искать пути сделать что-то на более высоком уровне, т.к. все недра недокументированы, а на раскопки может уйти огромное количество времени + аппаратные отличия, которые HAL как раз и призван устранять.

Самым высоким уровнем, с которого начинается документирование, здесь являются IoConnectInterrupt/IoDisconnectInterrupt - описаны в ддк. Глубже (уже недокументированы) KeConnectInterrupt/KeDisconnectInterrupt, еще глубже HalEnableSystemInterrupt/HalDisableSystemInterrupt, еще глубже порты.


Дата: Окт 28, 2003 17:55:22

[не понятно сниффер чего требуется написать и что такое WinPCAP. ] Собираюсь написать сниффер для снятия информации с сетевой карты, а WinPCAP - бесплатная библиотека как раз для таких целей с исходниками, но это не интересно.
Теория моя такова: перехватить прерывание от сетевой карты и читать прямиком из её порта.
Если не ошибаюсь Вы, батенька сами в статье писали, что можно обращаться из режима ядра к железкам на прямую или через HAL.
Теория бредовая, но проверить стоит :)


Дата: Окт 28, 2003 19:18:39

Насчет прямого обращения или через HAL к железкам из режима ядра все верно, но вопрос надо ли это тут.

Спускаться до портов имеет смысл, если по другому никак. У каждого девайса есть дровина, которая с ним работает. Дровина, в свою очередь, должна взаимодействовать с системой. Причем документированными способами. Не проще ли посмотреть как она это делает. По-моему ты просто хочешь написАть обыкновенный драйвер-фильтр. См. в ддк раздел "Filter Drivers" и в исходниках должен быть пример. В конце концов, можно разобрать библиотеку эту WinPCAP. Да и в сети куча инфы должна быть. Я бы пошёл этим путем. Ну а покопаться во внутренностях всегда интересно, вот только времени на это немеряно надо.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.054