
#ifndef __GENERAL_HANDLER_H_
#define __GENERAL_HANDLER_H_

/**
 * @file: general_handler.h
 *
 * Hlavickovy soubor modulu pro monitorovani a zmenu chovani systemovych
 * volani. Tento modul dovoluje libovolnou systemovou sluzbu z tabulky
 * systemovych volani pro hlavni modul jadra nahradit specialni rutinou,
 * ktera:
 * 1) Zjisti hodnoty argumentu a spolecne s cislem systemove sluzby je
 *    je preda uzivatelem definovane rutine, v tomto kontextu zvane
 *    Prehandler. Prehandler muze hodnoty parametru menit.
 * 2a) Pokud Prehandler vrati STATUS_SUCCESS, rutina preda rizeni originalnimu
 *    kodu systemovy sluzby. Tento kod dostane za parametry hodnoty z rutiny
 *    Prehandler.
 * 2b) Pokud Prehandler nevrati STATUS_SUCCESS, originalni kod systemove
 *    sluzby se nevola. Vola se ihned rutina Posthnaler.
 *  3) Rutina zavola Posthandler - funkci, ktera obdrzi hodnoty argumentu
 *    originalni systemove sluzby a jeji navratovy kod NTSTATUS. Navratova
 *    hodnota rutiny Posthandler bude vracena i tomu, kdo systemove volani
 *    zpusobil.
 *
 *  Tato semantika je zapouzdrena do tzv. Objektu Obecne Obsluhy systemove Sluzby.
 *  Vytvorenim takvoeho objektu ihned dochazi k zmene adresy prislusne systemove
 *  sluzby a rutiny Prehandler a Posthandler daneho objektu ihned zacnou prijimat
 *  jednotliva systemova volani.
 */

#include <ntddk.h>

/* Definice prototypu funkce Prehandler.
 *
 * @param Index Cislo systemove sluzby.
 * @param Args Adresa pole argumentu systemove sluzby. Toto pole se nachazi
 * na zasobniku a jeho obsah bude po dokonceni rutiny Posthandler pripadne pouzit
 * jako parametry pri volani originalniho kodu systemove sluzby.
 * @param Count Pocet argumentu systemove sluzby.
 *
 * @return Pokud rutina vrati STATUS_SUCCESS, obecna obsluha systemove
 * sluzby vola originalni kod systemove sluzby. V opacnem pripade dojde
 * ihned k volati rutiny Posthandler.
 */
typedef NTSTATUS (*PRE_HANDLER) (IN ULONG Index, IN PVOID *Args, IN ULONG Count);


/** Prototyp rutiny Posthandler.
 *
 * @param Index Cislo systemove sluzby.
 * @param Args Adresa pole argumentu systemove sluzby.
 * @param Count Pocet argumentu systemove sluzby.
 * @param Status navratova hodnota originalni systemove sluzby. 
 *
 * @return Navratova hodnota teto rutiny se stane navratovou hodnotou
 * systemoveho volani.
 */
typedef NTSTATUS (*POST_HANDLER) (IN ULONG Index, IN PVOID *Args, IN ULONG Count, IN NTSTATUS Status);



// Definice struktury objektu obecne obsluhy systemoveho volani
typedef struct _GENERAL_HANDLER {
  // Adresa instance metarutiny obecne obsluhy systemoveho volani
  PVOID CodeAddress;
  // Adresa rutiny Prehandler
  PRE_HANDLER PreHandler;
  // Adresa originalniho kodu systemove sluzby
  PVOID Original;
  // Adresa rutiny Posthandler
  POST_HANDLER PostHandler;
  // Cislo systemove sluzby
  ULONG ServiceIndex;
  // Pocet bajtu, ktery zaberou argumenty systemove sluzby na zasobniku
  ULONG ArgumentCount;
} GENERAL_HANDLER, *PGENERAL_HANDLER;


// Vyznam jednotlivych rutin naleznete v komentarich u jejich implementace
// v souboru general_handler.c

NTSTATUS GeneralHandlerCreate(OUT PGENERAL_HANDLER *GH, IN ULONG ServiceIndex, IN PRE_HANDLER PreHandler, IN POST_HANDLER PostHandler);
VOID GeneralHandlerDestroy(PGENERAL_HANDLER GH);

NTSTATUS GeneralHandlerInit(VOID);
VOID GeneralHandlerFinit(VOID);

#endif
