progwrp/synch.c
2025-12-13 23:37:26 +01:00

48 lines
1.4 KiB
C

#include "progwrp.h"
#include "export.h"
#include "implementations.h"
HANDLE WINAPI Implementation_CreateWaitableTimerExW(
LPSECURITY_ATTRIBUTES lpTimerAttributes,
LPCWSTR lpTimerName,
DWORD dwFlags,
DWORD dwDesiredAccess
)
{
if(dwFlags & ~(CREATE_WAITABLE_TIMER_MANUAL_RESET & 0x2)) // CREATE_WAITABLE_TIMER_HIGH_RESOLUTION
{
SetLastError(ERROR_INVALID_PARAMETER);
return NULL;
}
if(dwFlags & CREATE_WAITABLE_TIMER_MANUAL_RESET)
return CreateWaitableTimerW(lpTimerAttributes, TRUE, lpTimerName);
else
return CreateWaitableTimerW(lpTimerAttributes, FALSE, lpTimerName);
}
PVOID NTAPI RtlGetCallersAddress(PVOID* Ptr0, PVOID* Ptr1);
BOOL WINAPI Implementation_InitializeCriticalSectionEx(
LPCRITICAL_SECTION lpCriticalSection,
DWORD dwSpinCount,
DWORD Flags
)
{
DWORD Test = ERROR_INVALID_PARAMETER;
ULONG_PTR Caller, PcVal, DllBase;
RtlGetCallersAddress(&Caller, &PcVal);
RtlPcToFileHeader(PcVal, &DllBase);
TLSInit_DllMain_ProcessAttach_Internal(DllBase);
if(Flags & ~(CRITICAL_SECTION_NO_DEBUG_INFO))
{
SetLastError(Test);
return FALSE;
}
InitializeCriticalSectionAndSpinCount(lpCriticalSection, dwSpinCount);
// TODO, investigate whether A) the critical section always allocates the memory for the debug info section and B) whether the older
// iterations of the critical section API will function without it being there.
return TRUE;
}