typedef struct tagMYCRITSECT { BOOL bIn; HANDLE hNeedToWakeUp[128]; int iThreadsCount; } MYCRITSECT; *LPMYCRITSECT; LPMYCRITSECT CreateCritSect() { return GlobalAlloc(GPTR, sizeof(MYCRITSECT)); } void EnterCritSect(LPMYCRITSECT CritSect) { if(CritSect->bIn) { CritSect->hNeedToWakeUp[CritSect->iThreadsCount ++] = GetCurrentThread(); SuspendThread(GetCurrentThread()); // = Sleep(INFINITE); but not WinCE } else CritSect->bIn = TRUE; } void LeaveCritSect(LPMYCRITSECT CritSect) { if(CritSect->iThreadsCount) ResumeThread(hNeedToWakeUp[CritSect->iThreadsCount --]) else bIn = FALSE; }