Я пытаюсь помочь коллеге с кодом в расширении на стороне клиента. После добавления вызова к обратному вызову функция, похоже, завершается нормально, но событие в журнале событий Windows сообщает о нарушении доступа при обработке объекта групповой политики.
После удаления существующего кода, только с добавленным вызовом обратного вызова, он по-прежнему сообщает об этом нарушении доступа.
Не могли бы вы помочь определить, что нам может не хватать?
//
// Entry point for processing group policy objects.
//
// For full details, see http://msdn.microsoft.com/en- us/library/windows/desktop/aa374383(v=vs.85).aspx.
//
extern "C" DWORD CALLBACK ProcessGroupPolicyEx (
__in DWORD dwFlags,
__in HANDLE hToken,
__in HKEY hKeyRoot,
__in PGROUP_POLICY_OBJECT pDeletedGPOList,
__in PGROUP_POLICY_OBJECT pChangedGPOList,
__in ASYNCCOMPLETIONHANDLE pHandle,
__in BOOL *pbAbort,
__in PFNSTATUSMESSAGECALLBACK pStatusCallback,
__in IWbemServices *pWbemServices,
__out HRESULT *pRsopStatus)
{
if(pStatusCallback)
pStatusCallback (FALSE, L"Aaaaargh!");
return (0);
}
Этот код был опробован с использованием статической строки, массива байтов в стеке, массива байтов, которые были добавлены и намеренно утекли - на случай, если метод перешел во владение памяти. Также был CoTaskMemAlloc'd, на всякий случай. Все создают одну и ту же проблему.
(Отредактированная) ошибка в журнале событий:
Windows не может обработать исключение расширения на стороне клиента групповой политики 0xc0000005.
Чтобы сделать вещи интересными, это только на некоторых ОС, полностью пропатченная 32-битная XP является одной из определенных проблем. 2008R2 работает нормально.
Да, он нужен нам для работы на XP 32bit.
Другое странное поведение, которое может иметь здесь значение: если мы вызываем эту функцию несколько раз, она терпит неудачу при третьем вызове. Никаких исключений не генерируется, текст не отображается, никакой наш код после выполнения вызова, никаких дополнительных ошибок в журнале событий. Время здесь не имеет значения: это происходит, если вы звоните 3 раза подряд или 3 раза за 5 минут. Этого не произойдет, если мы заключим вызовы в общий блок try / catch. Никаких исключений не обнаружено - отображается весь текст. Весь код запущен. Однако мы по-прежнему получаем ошибку в журнале событий.