И вообще что делать и кто виноват?
Ага. Ну виноват ты. Частично с тобой вину готов разделить гражданинин Дании, работающий в США, по фамилии Страуструп.
А дело вот в чем. Это же С++ и там применена перегрузка функций, посмотрим на это дело
VOID Initialize(PKEVENT);
VOID Initialize(HANDLE hEvent, ACCESS_MASK access = OBJECT_TYPE_ALL_ACCESS);
VOID Initialize(KUstring& Name, EVENT_TYPE type);
Что мы видим?
Если ты передал ф-ции указатель на VOID* или какой-то другой тип, кроме KEVENT , то будет вызывана ф-ция VOID Initialize(HANDLE hEvent, ACCESS_MASK access = OBJECT_TYPE_ALL_ACCESS); так как HANDLE это указатель на VOID*, а любой тип можно привести к VOID*.
А вот если ты хочешь вызвать VOID Initialize(PKEVENT); то надо передать указатель на тип PKEVENT или явно привести типы Initialize((PKEVENT)pKevent);
То же и с VOID Initialize(KUstring& Name, EVENT_TYPE type), проверь типы, которые ты передаешь ф-ции, может ты со вторым аргументом накосячил- он тоже принимает роль при решении того, какую из перегруженных ф-ций вызвать. Типы аргументов должны точно соответсвовать тем что даны в определении ф-ции.
Посмотри правила выбора перегруженных функций в С++.
P.S. А вобще-то я не работаю с DriverWorks, так что это объяснение- первое что мне пришло в голову. Но оно по-моему верное.