Объявил я структуру 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): PMY_LIST_ENTRY newEntry; Выделяю память под структуру: newEntry = ExAllocatePool(NonPagedPool, sizeof(MY_LIST_ENTRY)); и зануляю ее: memset(newEntry, 0, sizeof(MY_LIST_ENTRY)); затем инициализрую event: KeInitializeEvent(&newEntry->Event, NotificationEvent, FALSE); далее сую структуру в список.... затем в перехваченной Nt функции я делаю KeWaitForSingleObject(&listHead->FirstItem->Event, Executive, KernelMode, TRUE, NULL); первой структуре из списка из жду ее завершнения. Возможно вам покажется, что список у меня странный, но так он должен быть реализован по логике задачи. в это время из юер-спэйса приходит сообщение о том, что прерванную функцию нужно продолжить. я естественно делаю KeSetEvent(&ListHead.FirstItem->Event, 0, FALSE); первой структуре, но в сигнальное состояние переводятся ВСЕ events из списка. Такое ощущение, что для всех структур используется один и тот же event.
я не понял, как ты в LIST_ENTRY (8 байт) умудрился еще и KEVENT запихать? дай тогда определение "своей" LIST_ENTRY
Сорри, LIST_ENTRY - это моя структура на самом деле она не так называется. Отредактировал свой первый пост.
Я так понимаю, что пишется что-то по типу проактивки. Тогда я немного недопонимаю почему Даже если ты делаешь вставку в начало, все равно это как-то странно..
Ну да, что-то типа проактивки. Вроде я сделал правильно - останавливаю вызовы API с помощью KeWait... и добавляю их в конец списка. А разбираю накопившиеся структуры с начала списка, то есть разбираю самые старые структуры.
use SynchronizationEvent instead. NotificationEvent устанавливает событие для всех ожидающих потоков и находится в установленном состоянии до вызовы как-ть потоком KeResetEvent SynchronizationEvent - для одного потока из очереди и сразу переводится в несигнальное состояние вроди бы так...
Weberd Вроде всё у Вас пучком! Попробуйте еще дописать к _MY_LIST_ENTRY свой конструктор копирования и оператор копирования при использовании в структуре/классе указателей, если они у Вас, конечно, вызываются в коде. У Бьерна Страуструпа в стандарте советую прочитать про это, скажу больше - это самое главное в C/C++!!! Потому, что компилятор сам формирует конструктор копирования и оператор копирования, если не находит его в коде, а если в классе/структуре есть указатели, то тАкие констуктоы/операторы тупо просто копируют содержимое указателей и в итоге у двух и более структур такие указатели "смотрят" на один и тот же участок памяти, а если у этих структур/классов в деструкторе или еще где есть delete [] или т.п. для освобождения памяти... то тогда в итоге и имеем скрытый баг в коде.
Как по мне тогда уже лучьше вызывать что угодно, чем что-то переопределять, а потом вызывать что угодно ps сори за оффтоп
Вы blast суть моего ответа не поняли, вместо delete может быть в коде и ExFreePool и т.п.. Вы ведь в своем коде strcmp используете? Ну и... далее без коментариев )))