Warm tip: This article is reproduced from serverfault.com, please click

Access denied on WaitForSingleObject on an event created from managed code

发布于 2017-05-04 19:49:06

How do I create a named event object in C# so that I can wait on it in separate C++ process?

My simplified C# code of process A:

EventWaitHandle evt = new EventWaitHandle(false, EventResetMode.AutoReset, "eventName");
EventWaitHandle.SignalAndWait(evt , <other event>);

And simplified C++ code of process B:

HANDLE hEvt = OpenEvent(
    EVENT_MODIFY_STATE | SYNCHRONIZE,  // access
    FALSE,               // do not inherit handle
    TEXT("eventName")
);

if (hEvt == NULL)
{
    printf("CreateEvent failed (%d)\n", GetLastError());
    //error out
}

DWORD dwWaitResult = WaitForSingleObject(hEvt, INFINITE); 
switch (dwWaitResult)
{
    case WAIT_OBJECT_0:
        //Signalled  - all good
        break;

    // An error occurred
    default:
        printf("Wait error (%d)\n", GetLastError());
        //error out
}

When I run (or debug) this code, the event is created (C#) and opened (C++) just fine. However I get error 5 (Access Denied) during WaitForSingleObject. Adding 'Global\' prefix does not help (nor does adding EventWaitHandleSecurity argument in C# code that allows full control to all build in users).

What I am doing wrong? Is this supposed to work at all?

Edit Fixed the C++ by adding SYNCHRONIZE desired access. Credit for pointing this out goes to Hans Passant - Access denied on WaitForSingleObject on an event created from managed code

Questioner
Jan
Viewed
0
2017-05-23 20:10:39

(Answering myself as there is no other answer to accept, but it is not unanswered question any more).

As pointed out by Hans Passant - Issue was in incomplete desired access flags of OpenEvent call. The code in question is already accordingly fixed and works fine.