
#ifndef __MAIN_H_
#define __MAIN_H_

/**
 * @file main.h
 *
 * Tento soubor obsahuje nekolik definic pro program Dllhide tykajicich se struktur
 * Bloku prostredi procesu (PEB) a zaznamu obsahujicich informace o jednotlivych
 * nactenych knihovnach v adresovem prostoru procesu.
 */


#include <windows.h>


// Struktura obsahujici hlavy spojovych seznamu sturktur LDR_DATA_TABLE_ENTRY
typedef struct _PEB_LDR_DATA {
  BYTE Reserved1[8];
  PVOID Reserved2[3];
  // Hlava spojoveho seznamu modulu nactenych v cilovem procesu
  LIST_ENTRY InMemoryOrderModuleList;
} PEB_LDR_DATA, *PPEB_LDR_DATA;



// Struktura LDR_DTA_TABLE_ENTRY. Obsahuje informace o jednom modulu
typedef struct _LDR_DATA_TABLE_ENTRY {
  // Polozky uchytavajici zaznam ve vsech trech seznamech zacinajicich ve strukture
  // PEB_LDR_DATA. Pokud dany modul v nekterem ze seznamu neni, hodnota polozky je
  // (NULL, NULL), nebo to tak aspon bylo pozorovano.
  LIST_ENTRY InLoadOrderLinks;
  LIST_ENTRY InMemoryOrderLinks;
  LIST_ENTRY InInitializationOrderLinks;
  // Virtualni adresa pocatku modulu
  PVOID DllBase;
  // Vstupni bod do souboru modulu
  PVOID EntryPoint;
  // Velikost souboru modulu
  SIZE_T ImageSize;
  // Plne jmeno souboru modulu
  UNICODE_STRING FullDllName;
  BYTE Reserved4[8];
  PVOID Reserved5[3];
  union {
    ULONG CheckSum;
    PVOID Reserved6;
  };

  ULONG TimeDateStamp;
} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;



// Definice struktury PEB pro 64bit OS
typedef struct _PEB {
  UCHAR InheritedAddressSpace;
  UCHAR ReadImageFileExecOptions;
  UCHAR BeingDebugged;
  UCHAR Spare;
  PVOID Reserved2[2];
  PPEB_LDR_DATA Ldr;
  PVOID ProcessParameters;
  BYTE Reserved3[520];
  PVOID PostProcessInitRoutine;
  BYTE Reserved4[136];
  ULONG SessionId;
} PEB, *PPEB;

#endif
