//
// IEAKENG.CPP
//

#include "precomp.h"


// prototype declarations


// global variables
HINSTANCE g_hInst;
HINSTANCE g_hDLLInst;
DWORD g_dwPlatformId = PLATFORM_WIN32;
BOOL g_fRunningOnNT;

BOOL WINAPI DllMain(HINSTANCE hDLLInst, DWORD dwReason, LPVOID)
{
    switch (dwReason)
    {
    case DLL_PROCESS_ATTACH:
    {
        OSVERSIONINFOA osviA;

        // The DLL is being loaded for the first time by a given process.
        // Perform per-process initialization here.  If the initialization
        // is successful, return TRUE; if unsuccessful, return FALSE.

        // Initialize the global variable holding the hinstance.
        g_hDLLInst = hDLLInst;

        g_hInst = LoadLibrary(TEXT("ieakui.dll"));
        if (g_hInst == NULL)
        {
            TCHAR   szTitle[MAX_PATH],
                    szMsg[MAX_PATH];

            LoadString(g_hDLLInst, IDS_ENGINE_TITLE, szTitle, ARRAYSIZE(szTitle));
            LoadString(g_hDLLInst, IDS_IEAKUI_LOADERROR, szMsg, ARRAYSIZE(szMsg));
            MessageBox(NULL, szMsg, szTitle, MB_OK | MB_SETFOREGROUND);
            return FALSE;
        }

        osviA.dwOSVersionInfoSize = sizeof(osviA);
        GetVersionExA(&osviA);
        if (VER_PLATFORM_WIN32_NT == osviA.dwPlatformId)
            g_fRunningOnNT = TRUE;

        DisableThreadLibraryCalls(g_hInst);

        break;
    }

    case DLL_PROCESS_DETACH:
        // The DLL is being unloaded by a given process.  Do any
        // per-process clean up here, such as undoing what was done in
        // DLL_PROCESS_ATTACH.  The return value is ignored.

        if(g_hInst)
            FreeLibrary(g_hInst);

        break;

    case DLL_THREAD_ATTACH:
        // A thread is being created in a process that has already loaded
        // this DLL.  Perform any per-thread initialization here.  The
        // return value is ignored.

        // Initialize the global variable holding the hinstance.
        // NOTE: this is probably taken care of already by DLL_PROCESS_ATTACH.
        g_hDLLInst = hDLLInst;

        break;

    case DLL_THREAD_DETACH:
        // A thread is exiting cleanly in a process that has already
        // loaded this DLL.  Perform any per-thread clean up here.  The
        // return value is ignored.

        break;
    }

    return TRUE;
}