
#ifndef __DRIVER_H_
#define __DRIVER_H_

/**
 * @file: driver.c
 *
 * Tento soubor obsahuje definice konstant a datovych typu dulezitych pro
 * ovladac jako celek a pro komunikaci s okolnim svetem.
 */

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


// Tag, kterym bude ovladac oznacovat alokovane bloky pameti
#define POOL_TAG                       (ULONG)'IdsS'

// Nazev zarizeni pro komunikaci s okolim
#define DEVICE_NAME                    L"\\Device\\ssdtinfo"
// Nazev symbolickeho odkazu na zarizeni
#define LINK_NAME                      L"\\DosDevices\\ssdtinfo"


// Struktura vstupniho bufferu pro IOCTL_SSDTINFO_GENERAL
typedef struct _IN_GENERAL 
{
  /** Urcuje, o ktere tabulce systemovych volani si volajici preje
   *  ziskat zakladni informace.
   *  @value 1 Tabulka systemovych volani pouze hlavniho modulu jadra
   *  @value 2 Stinova tabulka systemovych volani
   */
  ULONG32 TableType;
} IN_GENERAL, *PIN_GENERAL;


// Struktura vystupniho bufferu pro IOCTL_SSDTINFO_GENERAL
typedef struct _OUT_GENERAL 
{
  // Virtualni adresa tabulky v pameti jadra
  PVOID TableAddress;
  // Obecne informace o tabulce
  SERVICE_TABLE ServiceTable;
} OUT_GENERAL, *POUT_GENERAL;

// Struktura vstupniho bufferu pro ostatni IOCTL
typedef struct _IN_SPECIFIC
{
  /** Urcuje, o ktere tabulce systemovych volani si volajici preje
   *  ziskat zakladni informace.
   *  @value 1 Tabulka systemovych volani pouze hlavniho modulu jadra
   *  @value 2 Stinova tabulka systemovych volani
   */
  ULONG32 TableType;
  // Index podtabulky (muze nabyvat hodnot 0 az 3, 0 az 1 na 2003 a novejsich
  ULONG32 Subtable;
} IN_SPECIFIC, *PIN_SPECIFIC;

// Struktura vystupniho bufferu pro ostatni IOCTL
typedef struct _OUT_SPECIFIC
{
  ULONG Data[1];
} OUT_SPECIFIC, *POUT_SPECIFIC;


#endif
