Re[3]: Выполнить код в PASSIVE_LEVEL.
От: onyx2 Украина  
Дата: 26.01.07 08:33
Оценка:
А>Эти функции нужны для определения других вещей на основе данных полученых из пакета.

В общем, мне неизвестно что там вам надо получить, поэтому ничего советовать не буду.

А>Логирование тоже присутсвует :).


Вот по поводу логирования. Это дело надо однозначно перенести в отдельный поток.
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!
www.cubik.biz
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.