#pragma once

class CCriticalSection
{
    public:
        CCriticalSection(CRITICAL_SECTION *pcs)
        : _pcs(pcs)
        {
//            ASSERT(pcs);
        }

        HRESULT Lock()
        {
            HRESULT                          hr = S_OK;
            
            __try {
                ::EnterCriticalSection(_pcs);
            }
            __except (EXCEPTION_EXECUTE_HANDLER) {
                hr = E_OUTOFMEMORY;
            }

            return hr;
        }

        HRESULT Unlock()
        {
            ::LeaveCriticalSection(_pcs);

            return S_OK;
        }

    private:
        CRITICAL_SECTION                    *_pcs;
};