
#ifndef __IDT_H_
#define __IDT_H_

/**
 * @file: idt.h
 *
 * Toto je hlavickovy soubor k souboru idt.c, ktery implementuje nekolik
 * funkci pro praci s tabulkou vektoru preruseni na aktualnim procesoru.
 */

#include <ntddk.h>

// Struktura informaci vracenych instrukci SIDT o tabulce vektoru preruseni
// aktualniho procesoru.
typedef struct _IDTINFO
{
  // Pocet vektoru v tabulce. Pozor, tento modul tuto hodnotu nepouziva.
  // Interne predpoklada, ze limit kazde tabulky je 255. Nedochazi k overovani
  // zadnych parametru.
  unsigned short IDTLimit;
  // virtualni adresa IDT
  unsigned short LowIDTBase;
  unsigned short HiIDTBase;
} IDTINFO, *PIDTINFO;


// Struktura deskriptoru v tabulce vektoru preruseni
#pragma pack(1)
typedef struct _IDTENTRY
{
  // Dolnich 16 bitu offsetu adresy obsluzne rutiny
  unsigned short LowIDTOffset;
  // Segment selector adresy obsluzne rutiny
  unsigned short selector;
  unsigned char unused_lo;
  // Typ deskriptoru (0xE = InterruptGate).
  unsigned char segment_type:4;
  unsigned char system_segment_flag:1;
  // Ring level, od ktere lze dane preruseni vyvolat pomoci instrukce Int n/INT3/INTO/BOUND
  unsigned char DPL:2;
  // Priznak Present (1 - deskriptor je platny, 0 - deskriptor je neplatny)
  unsigned char P:1;
  // Hornich 16 bitu offsetove casti adresy obsluzne rutiny.
  unsigned short HiIDTOffset;
} IDTENTRY, *PIDTENTRY;
#pragma pack()


// Popis jednotlivych rutin najdete v komentarich u jejich implementace
// v souboru idt.c

PVOID IdtGetIsrAddress(IN ULONG VectorNumber);
VOID IdtModifyIsr(IN ULONG VectorNumber, IN PVOID NewAddress);


#endif
