
/**
 * @file: dllmain.c
 *
 * Hlavni soubor knihovny DLL obalujici funkce pro praci s udalostmi na klic. Tato
 * knihovna exportuje rutiny pro praci s udalostmi na klic zapsane v souboru keyedevent.h.
 */
 
#include <windows.h>
#include "keyedevent.h"
#include "dllmain.h"



// KEXXX funkce jsou pouze "stuby," ktere primo volaji nekterou z rutin pro praci s
// udalosti na klic.
HANDLE WINAPI KECreateKeyedEvent(DWORD DesiredAccess, PCWSTR Name)
{
  return CreateKeyedEvent(DesiredAccess, Name);
}


HANDLE WINAPI KEOpenKeyedEvent(DWORD DesiredAccess, PCWSTR Name)
{
  return OpenKeyedEvent(DesiredAccess, Name);
}


DWORD WINAPI KEReleaseKeyedEvent(HANDLE KeyedEvent, PVOID Key, BOOL Alertable, PLARGE_INTEGER Timeout)
{
  return ReleaseKeyedEvent(KeyedEvent, Key, Alertable, Timeout);
}


DWORD WINAPI KEWaitForKeyedEvent(HANDLE KeyedEvent, PVOID Key, BOOL Alertable, PLARGE_INTEGER Timeout)
{
  return WaitForKeyedEvent(KeyedEvent, Key, Alertable, Timeout);
}



/** Vstupni bod knihovny DLL pro praci s udalostmi na klic.
 *
 * Operacni system tuto rutinu zavola tesne po namapovani a odmapovani knihovny z
 * adresoveho prostoru procesu. Rutina zajisti inicializaci (resp. finalizaci) modulu
 * pro praci s udalostmi na klic.
 *
 * @param hModule Handle namapovane knihovny (virtualni adresa jejiho pocatku).
 * @param dwReason Duvod volani rutiny. Viz dokumentace k DllEntryPoint na MSDN.
 * @param Reserved Touto hodnotou lze odlisit staticke a dynamicke nacitani knihovny do
 * pameti.
 *
 * @return Je-li volana v tesne po namapovani knihovny do pameti, rutina vraci TRUE,
 * pokud se podarilo inicializovat modul pro praci s udalostmi na klic. V opacnem pripade
 * vraci FALSE, cimz zpusobi uvolneni knihovny z pameti. Navratova hodnota v pripade
 * volani tesne pred odmapovanim knihovny z pameti nema zadny vyznam.
 */
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
{
  BOOL Ret = FALSE;

  switch (dwReason) {
    case DLL_PROCESS_ATTACH:
      Ret = DisableThreadLibraryCalls(hModule);
      if (Ret)
        Ret = KeyedEventInit();
      break;

    case DLL_PROCESS_DETACH:
      KeyedEventFinit();
      break;
  }

  return Ret;
}
