
#ifndef __OBINIT_EVENTS_H_
#define __OBINIT_EVENTS_H_

/**
 * @file: obinit_events.h
 *
 * Tento soubor obsahuje definice konstant a datovych typu pro udalosti
 * specificke pro ovladac obinit.sys a rutiny pro vytvareni zaznamu
 * techto udalosti.
 */

#include <ntddk.h>
#include "object_initializer.h"

// Konstanty pro typ specificke udalosti
#define EVENT_TYPE_OPEN        1       // Vytvoreni handle
#define EVENT_TYPE_CLOSE       2       // Zruseni handle
#define EVENT_TYPE_OKAYTOCLOSE 3       // Operace OkayToClose
#define EVENT_TYPE_DELETE      4       // Odstraneni objektu z pameti

// Puvod operace (vyznam je stejny jako u enumu KPROCESSOR_MODE)
#define ACCESS_MODE_UNKNOWN    0       // Neznamy puvod
#define ACCESS_MODE_KERNEL     1       // Ovladac ci jina soucast jadra
#define ACCESS_MODE_USER       2       // Aplikace bezici v uzivatelskem rezimu



// Data udalosti vytvoreni noveho handle
typedef struct _EVENT_OPEN {
  // PID procesu, kteremu patri tabulka handle
  HANDLE ProcessId;
  // Adresa tela ciloveho objrktu
  PVOID Object;
  // Zpusob zniku handle (explicitne, dedeni, duplikace...)
  OPEN_REASON OpenReason;
  // Maska pristupovych prav handle
  ACCESS_MASK GratedAccess;
  // TID provadejiciho operace
  HANDLE CurrentTID;
  // PID procesu, v jehoz kontextu dochazi k provadeni operace
  HANDLE CurrentPID;
  // Puvod udalosti (rezim jadra, uzivatelsky rezim)
  ULONG AccessMode;
  // Navratova hodnota volani originalniho kodu metody OpenProcedure
  NTSTATUS Status;
  // Delka nazvu objektu typu v bajtech
  ULONG TypeNameLength;
  // delka celeho nazvu objektu v bajtech
  ULONG ObjectNameLength;
  // Offset nazvu typu objektu od zacatku dat udalosti
  ULONG TypeNameOffset;
  // Offset celeho jmena objektu od zacatku dat udalosti
  ULONG ObjectNameOffset;
} EVENT_OPEN, *PEVENT_OPEN;


// Data udalosti zruseni existujiciho handle
typedef struct _EVENT_CLOSE {
  // PID procesu, kteremu patri tabulka handle
  HANDLE ProcessId;
  // Adresa tela ciloveho objrktu
  PVOID Object;
  // Maska pristupovych prav handle
  ACCESS_MASK GrantedAccess;
  // TID provadejiciho operace
  HANDLE CurrentTID;
  // PID procesu, v jehoz kontextu dochazi k provadeni operace
  HANDLE CurrentPID;
  // Puvod udalosti (rezim jadra, uzivatelsky rezim)
  ULONG AccessMode;
  // Delka nazvu objektu typu v bajtech
  ULONG TypeNameLength;
  // delka celeho nazvu objektu v bajtech
  ULONG ObjectNameLength;
  // Offset nazvu typu objektu od zacatku dat udalosti
  ULONG TypeNameOffset;
  // Offset celeho jmena objektu od zacatku dat udalosti
  ULONG ObjectNameOffset;
} EVENT_CLOSE, *PEVENT_CLOSE;


// Data udalosti o operaci OkayToClose
typedef struct _EVENT_OKAYTOCLOSE {
  // PID procesu, kteremu patri tabulka handle
  HANDLE ProcessId;
  // Adresa tela ciloveho objrktu
  PVOID Object;
  // Hodnota handle
  HANDLE Handle;
  // TID provadejiciho operace
  HANDLE CurrentTID;
  // PID procesu, v jehoz kontextu dochazi k provadeni operace
  HANDLE CurrentPID;
  // Puvod udalosti (rezim jadra, uzivatelsky rezim)
  ULONG AccessMode;
  // Navratova hodnota volani originalniho kodu metody OkayToClose
  BOOLEAN CloseAllowed;
  // Delka nazvu objektu typu v bajtech
  ULONG TypeNameLength;
  // delka celeho nazvu objektu v bajtech
  ULONG ObjectNameLength;
  // Offset nazvu typu objektu od zacatku dat udalosti
  ULONG TypeNameOffset;
  // Offset celeho jmena objektu od zacatku dat udalosti
  ULONG ObjectNameOffset;
} EVENT_OKAYTOCLOSE, *PEVENT_OKAYTOCLOSE;


// Data udalosti odstraneni objektu z pameti
typedef struct _EVENT_DELETE {
  // Adresa tela ciloveho objrktu
  PVOID Object;
  // TID provadejiciho operace
  HANDLE CurrentTID;
  // PID procesu, v jehoz kontextu dochazi k provadeni operace
  HANDLE CurrentPID;
  // Delka nazvu objektu typu v bajtech
  ULONG TypeNameLength;
  // Offset nazvu typu objektu od zacatku dat udalosti
  ULONG TypeNameOffset;
} EVENT_DELETE, *PEVENT_DELETE;



// Popis vyznamu jednotlivych funkci naleznete v komentarich u jejich
// implementace v souboru obinit_events.c.

PEVENT OpenEventCreate(OPEN_REASON OpenReason, PEPROCESS Process, PVOID Object, ACCESS_MASK GrantedAccess, ULONG AccessMode, NTSTATUS ReturnStatus);
PEVENT CloseEventCreate(PEPROCESS Process, PVOID Object, ULONG AccessMode, ACCESS_MASK GrantedAccess);
PEVENT OkayToCloseEventCreate(PEPROCESS Process, PVOID Object, HANDLE Handle, ULONG AccessMode, BOOLEAN CloseAllowed);
PEVENT DeleteEventCreate(PVOID Object);


#endif
