
#ifndef __EVENTS_H_
#define __EVENTS_H_

/** @file events.h
 *
 * Hlavickovy soubor k souboru udalost.c, ktery implementuje podpurne
 * rutiny pro praci se zaznamy udalosti.
 */

#include <ntddk.h>


// Struktura s obecnymi informacemi o udalosti
typedef struct _EVENT
{
  LIST_ENTRY ListEntry;   // zaclenuje udalost do spojoveho seznamu
  ULONG32 Type;           // typ udalosti (viz makra vyse)
  ULONG32 Size;           // velikost zaznamu udalosti v bytech
  LARGE_INTEGER Time;     // cas vytvoreni udalosti
} EVENT, *PEVENT;


// Struktura s obecnymi informacemi o udalosti predavana do 
// uzivatelskeho rezimu
typedef struct _UM_EVENT
{
  ULONG32 Type;           // typ udalosti
  ULONG32 Size;           // velikost zaznamu udalosti v bytech
  LARGE_INTEGER Time;     // cas vzniku udalosti
} UM_EVENT, *PUM_EVENT;

#define EVENT_DATA_SIZE(a) \
  (((PEVENT)a)->Size - sizeof(EVENT))

#define UM_EVENT_DATA_SIZE(a) \
  (((PUM_EVENT)a)->Size - sizeof(UM_EVENT))

#define EVENT_TO_DATA(a) \
  ((PCHAR)a + sizeof(EVENT))

#define UM_EVENT_TO_DATA(a) \
  ((PCHAR)a + sizeof(UM_EVENT))


// Semantika rutin je vysvetlena u jejich implementace

PEVENT EventAlloc(IN ULONG Type, IN ULONG Size);
VOID EventFree(PEVENT Event);

VOID EventAddToList(PEVENT Event);
VOID EventAddToListLock(PEVENT Event);
VOID EventInsertFirst(PEVENT Event);
VOID EventInsertFirstLock(PEVENT Event);
PEVENT EventGetFirst(VOID);
PEVENT EventGetFirstLock(VOID);
VOID EventListLock(PKLOCK_QUEUE_HANDLE QHandle);
VOID EventListUnlock(PKLOCK_QUEUE_HANDLE QHandle);

NTSTATUS EventsInit(VOID);
VOID EventsFinit(VOID);


#endif
