KeSetEvent срабатывает для всех созданных eventов

Тема в разделе "WASM.NT.KERNEL", создана пользователем Weberd, 9 июл 2008.

  1. Weberd

    Weberd New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2007
    Сообщения:
    67
    Объявил я структуру MY_LIST_ENTRY в которую поместил в качестве поля KEVENT, структуры помещаю в список какой-то неважно.

    typedef struct _MY_LIST_ENTRY
    {
    struct _MY_LIST_ENTRY *Next;
    ULONG UserDecision;
    ULONG ID;
    HANDLE CallerPid;
    ULONG Type;
    KEVENT Event;
    } MY_LIST_ENTRY, *PLIST_ALERT;

    Вот код создания event:
    Код (Text):
    1. PMY_LIST_ENTRY newEntry;
    2.  
    3. Выделяю память под структуру:
    4. newEntry = ExAllocatePool(NonPagedPool, sizeof(MY_LIST_ENTRY));
    5. и зануляю ее:
    6. memset(newEntry, 0, sizeof(MY_LIST_ENTRY));
    7. затем инициализрую event:
    8. KeInitializeEvent(&newEntry->Event, NotificationEvent, FALSE);
    9.  
    10. далее сую структуру в список....
    затем в перехваченной Nt функции я делаю
    KeWaitForSingleObject(&listHead->FirstItem->Event, Executive, KernelMode, TRUE, NULL);
    первой структуре из списка из жду ее завершнения.

    Возможно вам покажется, что список у меня странный, но так он должен быть реализован по логике задачи.

    в это время из юер-спэйса приходит сообщение о том, что прерванную функцию нужно продолжить. я естественно делаю KeSetEvent(&ListHead.FirstItem->Event, 0, FALSE); первой структуре, но в сигнальное состояние переводятся ВСЕ events из списка. Такое ощущение, что для всех структур используется один и тот же event.
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    я не понял, как ты в LIST_ENTRY (8 байт) умудрился еще и KEVENT запихать? дай тогда определение "своей" LIST_ENTRY
     
  3. Weberd

    Weberd New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2007
    Сообщения:
    67
    Сорри, LIST_ENTRY - это моя структура на самом деле она не так называется.
    Отредактировал свой первый пост.
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Я так понимаю, что пишется что-то по типу проактивки.
    Тогда я немного недопонимаю почему
    Даже если ты делаешь вставку в начало, все равно это как-то странно..
     
  5. Weberd

    Weberd New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2007
    Сообщения:
    67
    Ну да, что-то типа проактивки.
    Вроде я сделал правильно - останавливаю вызовы API с помощью KeWait... и добавляю их в конец списка.
    А разбираю накопившиеся структуры с начала списка, то есть разбираю самые старые структуры.
     
  6. goga2007

    goga2007 New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2007
    Сообщения:
    184
    use SynchronizationEvent instead.
    NotificationEvent устанавливает событие для всех ожидающих потоков и находится в установленном состоянии до вызовы как-ть потоком KeResetEvent
    SynchronizationEvent - для одного потока из очереди и сразу переводится в несигнальное состояние

    вроди бы так...
     
  7. int2eh

    int2eh Alexander Leevy

    Публикаций:
    0
    Регистрация:
    19 авг 2007
    Сообщения:
    106
    Адрес:
    Москва
    Weberd
    Вроде всё у Вас пучком! Попробуйте еще дописать к _MY_LIST_ENTRY свой конструктор копирования и оператор копирования при использовании в структуре/классе указателей, если они у Вас, конечно, вызываются в коде. У Бьерна Страуструпа в стандарте советую прочитать про это, скажу больше - это самое главное в C/C++!!! Потому, что компилятор сам формирует конструктор копирования и оператор копирования, если не находит его в коде, а если в классе/структуре есть указатели, то тАкие констуктоы/операторы тупо просто копируют содержимое указателей и в итоге у двух и более структур такие указатели "смотрят" на один и тот же участок памяти, а если у этих структур/классов в деструкторе или еще где есть delete [] или т.п. для освобождения памяти... то тогда в итоге и имеем скрытый баг в коде.
     
  8. blast

    blast New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    170
    delete [] == kernel32.dll!HeapFree
    в ядре это точно скрытый баг в коде верно подметил гыы
     
  9. int2eh

    int2eh Alexander Leevy

    Публикаций:
    0
    Регистрация:
    19 авг 2007
    Сообщения:
    106
    Адрес:
    Москва
    Уважаемый, blast!
    оператор delete[] можно переопределить и вызывать что угодно
     
  10. blast

    blast New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    170
    Как по мне тогда уже лучьше вызывать что угодно, чем что-то переопределять, а потом вызывать что угодно :)

    ps сори за оффтоп
     
  11. int2eh

    int2eh Alexander Leevy

    Публикаций:
    0
    Регистрация:
    19 авг 2007
    Сообщения:
    106
    Адрес:
    Москва
    Вы blast суть моего ответа не поняли, вместо delete может быть в коде и ExFreePool и т.п..
    Вы ведь в своем коде strcmp используете? Ну и... далее без коментариев :))))
     
  12. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    У вас разный русский чтоль? )