А>Эти функции нужны для определения других вещей на основе данных полученых из пакета.
В общем, мне неизвестно что там вам надо получить, поэтому ничего советовать не буду.
А>Логирование тоже присутсвует :).
Вот по поводу логирования. Это дело надо однозначно перенести в отдельный поток.
1. Где нибудь в DriverEntry...
//Создаем поток
PsCreateSystemThread(&hLogThread, THREAD_ALL_ACCESS, NULL, NULL, NULL, (PKSTART_ROUTINE)LogThreadFunction, NULL);
//Также инициализируем очередь (стандартная работа с LIST_ENTRY очередями)
//элементами очереди будут структуры типа LOG_RECORD (см. ниже)
InitializeListHead(&LogListHead);
// SpinLock для очереди
KeInitializeSpinLock(&LogListLock);
2. В сетевом фильтре:
PF_FORWARD_ACTION
hook_proc(
unsigned char *PacketHeader,
unsigned char *Packet,
unsigned int PacketLength,
unsigned int RecvInterfaceIndex,
unsigned int SendInterfaceIndex,
ULONG RecvLinkNextHop,
ULONG SendLinkNextHop
)
{
PF_FORWARD_ACTION action;
//...
// здесь добавляем элемент в очередь со всей необходимой информацией для логирования
//...
return action;
}
3. В LogThreadFunction (Ф-ция LogThreadFunction будет выполняться на IRQL = PASSIVE_LEVEL, так что проблем с повышенным IRQL не будет)
Вот, например, самая простая реализация
VOID LogpThreadProcedure( IN PVOID StartContext )
{
PLOG_RECORD pLogRecord = NULL;
///////////////////////////////////////////////////////////////////////////////
//log thread cycle
while(!bLogFlushDiskShutdown) {
//шаримся по списку, пока есть в нем элементы и сбрасываем инфу на диск
while ( (pLogRecord = LogGetFirstRecordList()) )
{
//сбрасываем инфу на диск
LogFlushToDisk(...);
//удаляем элемент из очереди
LogRemoveRecordList(pLogRecord);
}
//здесь говорим потоку спать 5c
SleepLogThread();
}
///////////////////////////////////////////////////////////////////////////////
// - вот тут я не уверен нужна ли здесь эта ф-ция, в примерах MSDN она используется,
//но у меня и без нее все нормально работает
//т.е. вопрос к знатокам: "При выходе из потока нужно ли вызыватьPsTerminateSystemThread?"
//по логике - не нужно, но там кто его знает...
PsTerminateSystemThread( STATUS_SUCCESS );
}
}
структура LOG_RECORD буде иметь вид:
typedef struct _LOG_RECORD {
LIST_ENTRY Entry;
LARGE_INTEGER LogTimeStamp;
//здесь любая инфа на ваш вкус: ip-адреса, порты и т.п.
}LOG_RECORD, *PLOG_RECORD;
Ф-ции по работе с очередью (LogRemoveRecordList, LogGetFirstRecordList) и другие ф-ции (LogFlushToDisk, SleepLogThread) напишите сами.
Ну что ж, let's go!