Kernel32 - Process Semaphores

Source

C
BOOL Semaphore_Create(nt_semaphore_t* ptSem, long lInitial, long lMax) {
    ptSem->hHandle = _CreateSemaphoreW(NULL, lInitial, lMax, NULL);
    return ptSem->hHandle != NULL;
}

BOOL Semaphore_Wait(nt_semaphore_t* ptSem, DWORD dwMs) {
    if (!ptSem || !ptSem->hHandle) return FALSE;
    LARGE_INTEGER liTimeout;
    liTimeout.QuadPart = -(long long)dwMs * 10000LL;
    PLARGE_INTEGER pliTimeout = (dwMs == 0xFFFFFFFF) ? NULL : &liTimeout;
    NTSTATUS status = _NtWaitForSingleObject(ptSem->hHandle, FALSE, pliTimeout);
    return NT_SUCCESS(status);
}

BOOL Semaphore_Signal(nt_semaphore_t* ptSem, long lCount) {
    return _ReleaseSemaphore(ptSem->hHandle, lCount, NULL);
}

void Semaphore_Destroy(nt_semaphore_t* ptSem) {
    if (ptSem->hHandle) _CloseHandle(ptSem->hHandle);
}