
#ifndef __REGEVENTS_H_
#define __REGEVENTS_H_

/**
 * @file regevents.h
 *
 * Obsahuje definice typu jednotlivych registrovych udalosti a datovych
 * struktur, kterymi jsou v ramci ovladace registrymon.sys reprezentovany.
 */

#include <ntddk.h>


// Typy registrovych udalosti
#define REG_EVENT_POST_GENERAL                 1
#define REG_EVENT_DELETE_KEY                   2
#define REG_EVENT_DELETE_VALUE                 3
#define REG_EVENT_SET_VALUE                    4
#define REG_EVENT_SET_KEY                      5
#define REG_EVENT_RENAME_KEY                   6
#define REG_EVENT_ENUMERATE_KEY                7
#define REG_EVENT_ENUMERATE_VALUE              8
#define REG_EVENT_QUERY_KEY                    9
#define REG_EVENT_QUERY_VALUE                 10
#define REG_EVENT_QUERY_MULTIPLE_VALUES       11
#define REG_EVENT_FLUSH_KEY                   12
#define REG_EVENT_CLOSE_KEY                   13
#define REG_EVENT_CREATE_KEY                  14
#define REG_EVENT_OPEN_KEY                    15
#define REG_EVENT_CREATE_KEY_EX               16
#define REG_EVENT_OPEN_KEY_EX                 17
#define REG_EVENT_LOAD_HIVE                   18
#define REG_EVENT_UNLOAD_HIVE                 19
#define REG_EVENT_QUERY_SECURITY_KEY          20
#define REG_EVENT_SET_SECURITY_KEY            21
#define REG_EVENT_RESTORE_KEY                 22
#define REG_EVENT_SAVE_KEY                    23
#define REG_EVENT_REPLACE_KEY                 24


// Obecne informace o operaci nad registrem
typedef struct _REG_EVENT_GENERAL_INFO
{
  // PID aktualniho procesu
  ULONG64 PID;
  // TID aktualniho vlakna
  ULONG64 TID;
  // Navratova hodnota
  ULONG64 ResultStatus;
  // Adresa objektu klice, nad kterym je operace provadena
  ULONG64 Object;
} REG_EVENT_GENERAL_INFO, *PREG_EVENT_GENERAL_INFO;

// Definice retezce v ramci struktur registrovych udalosti
typedef struct _REG_DATA_UNICODE_STRING
{
  // Offset pocatku retezce relativni vzhledem k pocatku datove oblasti udalosti
  ULONG32 Offset;
  // Delka retezce v bajtech
  ULONG32 Length;
} REG_DATA_UNICODE_STRING, *PREG_DATA_UNICODE_STRING;

// Udalost smazani klice
typedef struct _REG_EVENT_DELETE_KEY_INFO
{
  // Obecne informace
  REG_EVENT_GENERAL_INFO General;
  // Nazev mazaneho klice
  REG_DATA_UNICODE_STRING KeyName;
} REG_EVENT_DELETE_KEY_INFO, *PREG_EVENT_DELETE_KEY_INFO;

// Udalost smazani hodnoty
typedef struct _REG_EVENT_DELETE_VALUE_INFO
{
  // Obecne informace
  REG_EVENT_GENERAL_INFO General;
  // Nazev klice
  REG_DATA_UNICODE_STRING KeyName;
  // Jmeno hodnoty
  REG_DATA_UNICODE_STRING ValueName;
} REG_EVENT_DELETE_VALUE_INFO, *PREG_EVENT_DELETE_VALUE_INFO;

// Udalost nastaveni hodnoty
typedef struct _REG_EVENT_SET_VALUE_INFO
{
  // Obecne info
  REG_EVENT_GENERAL_INFO General;
  // Nazev klice
  REG_DATA_UNICODE_STRING KeyName;
  // Jmeno hodnoty
  REG_DATA_UNICODE_STRING ValueName;
  // Typ hodnoty
  ULONG64 DataType;
  // Velikost dat
  ULONG64 DataSize;
  // Offset pocatku dat relativni vzhledem k pocatku tohoto zaznamu udalosti
  ULONG64 DataOffset;
} REG_EVENT_SET_VALUE_INFO, *PREG_EVENT_SET_VALUE_INFO;

// Udalost zmeny udaju o klicy
typedef struct _REG_EVENT_SET_KEY_INFO
{
  // Obecne informace
  REG_EVENT_GENERAL_INFO General;
  // Nazev klice
  REG_DATA_UNICODE_STRING KeyName;
  // Typ menenych udaju
  ULONG64 DataType;
  // Velikost novych dat
  ULONG64 DataSize;
  // Offset pocatku dat relativni od zacatku zaznamu udalosti
  ULONG64 DataOffset;
} REG_EVENT_SET_KEY_INFO, *PREG_EVENT_SET_KEY_INFO;

// Udalost prejmenovani klice
typedef struct _REG_EVENT_RENAME_KEY_INFO
{
  // Obecne informace
  REG_EVENT_GENERAL_INFO General;
  // Puvodni nazev klice
  REG_DATA_UNICODE_STRING KeyName;
  // Novy nazev klice
  REG_DATA_UNICODE_STRING NewKeyName;
} REG_EVENT_RENAME_KEY_INFO, *PREG_EVENT_RENAME_KEY_INFO;

// Udalost ziskani jedne polozky pri zjistovani seznamu podklicu
typedef struct _REG_EVENT_ENUMERATE_KEY_INFO
{
  // Obecne informace
  REG_EVENT_GENERAL_INFO General;
  // Jmeno klice
  REG_DATA_UNICODE_STRING KeyName;
  // Index podklice
  ULONG64 SubkeyIndex;
  // Typ dat o podklici
  ULONG64 DataType;
  // Velikost dat
  ULONG64 DataSize;
  // Offset pocatku dat
  ULONG64 DataOffset; 
} REG_EVENT_ENUMERATE_KEY_INFO, *PREG_EVENT_ENUMERATE_KEY_INFO;

// Udalost ziskani jednoho zaznamu pri zjistovani seznamu hodnot daneho
// klice
typedef struct _REG_EVENT_ENUMERATE_VALUE_INFO
{
  // Obecne informace
  REG_EVENT_GENERAL_INFO General;
  // Jmeno klice
  REG_DATA_UNICODE_STRING KeyName;
  // Index hodnoty
  ULONG64 ValueIndex;
  // Typ informaci o hodnote
  ULONG64 DataType;
  // Velikost dat 
  ULONG64 DataSize;
  // Offset dat
  ULONG64 DataOffset;
} REG_EVENT_ENUMERATE_VALUE_INFO, *PREG_EVENT_ENUMERATE_VALUE_INFO;

// Udalost zjisteni informaci o klicy
typedef struct _REG_EVENT_QUERY_KEY_INFO
{
  // Obecne informace
  REG_EVENT_GENERAL_INFO General;
  // Nazev klice
  REG_DATA_UNICODE_STRING KeyName;
  // Typ dat
  ULONG64 DataType;
  // Velikost dat
  ULONG64 DataSize;
  // Offset dat
  ULONG64 DataOffset;
} REG_EVENT_QUERY_KEY_INFO, *PREG_EVENT_QUERY_KEY_INFO;

// Udalost ziskani informaci o hodnote
typedef struct _REG_EVENT_QUERY_VALUE_INFO
{
  // Obecne informace
  REG_EVENT_GENERAL_INFO General;
  // Jmeno klice
  REG_DATA_UNICODE_STRING KeyName;
  // Jmeno hodnoty
  REG_DATA_UNICODE_STRING ValueName;
  // Typ informaci
  ULONG64 DataType;
  // Velikost dat
  ULONG64 DataSize;
  // Offset dat
  ULONG64 DataOffset;
} REG_EVENT_QUERY_VALUE_INFO, *PREG_EVENT_QUERY_VALUE_INFO;

// Udalost ziskani informaci o vice hodnotach najednou
typedef struct _REG_EVENT_QUERY_MULTIPLE_VALUES_INFO
{
  // Obecne info
  REG_EVENT_GENERAL_INFO General;
  // Nazev klice
  REG_DATA_UNICODE_STRING KeyName;
  // Offset seznamu hodnot relativni k pocatku teto struktury
  ULONG32 ValuesOffset;
  // Pocet hodnot
  ULONG32 ValuesCount;
  // Offset dat
  ULONG32 DataOffset;
  // Velikost dat
  ULONG32 DataSize;
} REG_EVENT_QUERY_MULTIPLE_VALUES_INFO, *PREG_EVENT_QUERY_MULTIPLE_VALUES_INFO;

// Udalost zapisu klice do souboru registru
typedef struct _REG_EVENT_FLUSH_KEY_INFO
{
  // Obecne informace
  REG_EVENT_GENERAL_INFO General;
  // Jmeno klice
  REG_DATA_UNICODE_STRING KeyName;
} REG_EVENT_FLUSH_KEY_INFO, *PREG_EVENT_FLUSH_KEY_INFO;

// Udalost zruseni handle ke klici
typedef struct _REG_EVENT_CLOSE_KEY_INFO
{
  // Obecne informace
  REG_EVENT_GENERAL_INFO General;
  // Nazev klice
  REG_DATA_UNICODE_STRING KeyName;
} REG_EVENT_CLOSE_KEY_INFO, *PREG_EVENT_CLOSE_KEY_INFO;

// Udalost vytvoreni klice
typedef struct _REG_EVENT_CREATE_KEY_INFO
{
  // Obecne info
  REG_EVENT_GENERAL_INFO General;
  // Nazev noveho klice
  REG_DATA_UNICODE_STRING KeyName;
} REG_EVENT_CREATE_KEY_INFO, *PREG_EVENT_CREATE_KEY_INFO;

// Udalost ziskani handle k existujicimu klici
typedef struct _REG_EVENT_OPEN_KEY_INFO
{
  // Obecne info
  REG_EVENT_GENERAL_INFO General;
  // Jmeno klice
  REG_DATA_UNICODE_STRING KeyName;
} REG_EVENT_OPEN_KEY_INFO, *PREG_EVENT_OPEN_KEY_INFO;

// Udalost vytvoreni noveho klice (II. varianta)
typedef struct _REG_EVENT_CREATE_KEY_EX_INFO
{
  // Obecne info
  REG_EVENT_GENERAL_INFO General;
  // Nazev vytvareneho podklice (relativni ke korenovemu klici)
  REG_DATA_UNICODE_STRING NewSubkeyName;
  // Nazev korenoveho klice 
  REG_DATA_UNICODE_STRING RootName;
  // Pozadovany pristup
  ULONG64 DesiredAccess;
  // Ziskany pristup
  ULONG64 GrantedAccess;
  // Dalsi nataveni pri tvorbe
  ULONG64 CreateOptions;
} REG_EVENT_CREATE_KEY_EX_INFO, *PREG_EVENT_CREATE_KEY_EX_INFO;

// Udalost ziskani handle k existujicimu klici (II. varianta)
typedef struct _REG_EVENT_OPEN_KEY_EX_INFO
{
  // Obecne informace
  REG_EVENT_GENERAL_INFO General;
  // Nazev podklice, relativni ke korenovemu klici
  REG_DATA_UNICODE_STRING SubkeyName;
  // Nazev korenoveho klice
  REG_DATA_UNICODE_STRING RootKeyName;
  // Pozadovana pristupova opravneni
  ULONG64 DesiredAccess;
  // Ziskana pristupova opravneni
  ULONG64 GrantedAccess;
} REG_EVENT_OPEN_KEY_EX_INFO, *PREG_EVENT_OPEN_KEY_EX_INFO;

// Udalsot nacteni nove hive do registru
typedef struct _REG_EVENT_LOAD_HIVE_INFO
{
  // Obecne info
  REG_EVENT_GENERAL_INFO General;
  // Nazev vstupniho klice hive, relativni ke korenovemu klici
  REG_DATA_UNICODE_STRING KeyName;
  // Nazev korenoveho klice
  REG_DATA_UNICODE_STRING RootkeyName;
  // Nazev souboru hive
  REG_DATA_UNICODE_STRING FileName;
} REG_EVENT_LOAD_HIVE_INFO, *PREG_EVENT_LOAD_HIVE_INFO;

// Udalost uvolneni hive z registru
typedef struct _REG_EVENT_UNLOAD_HIVE_INFO
{
  // Obecne informace
  REG_EVENT_GENERAL_INFO General;
  // Nazev vstupniho klice hive
  REG_DATA_UNICODE_STRING KeyName;
} REG_EVENT_UNLOAD_HIVE_INFO, *PREG_EVENT_UNLOAD_HIVE_INFO;

// Udalsot ziskani informaci o zabezpeceni klice
typedef struct _REG_EVENT_QUERY_KEY_SECURITY_INFO
{
  // Obecne informace
  REG_EVENT_GENERAL_INFO General;
  // Nazev klice
  REG_DATA_UNICODE_STRING KeyName;
  // Presny typ operace
  ULONG64 OperationType;
  // Velikost SD
  ULONG32 SecurityDescriptorLength;
  // Offset pocatku SD
  ULONG32 SecurityDescriptorOffset;
} REG_EVENT_QUERY_KEY_SECURITY_INFO, *PREG_EVENT_QUERY_KEY_SECURITY_INFO;

// Udalost zmeny zabezpeceni klice
typedef struct _REG_EVENT_SET_KEY_SECURITY_INFO
{
  // Obecne informace
  REG_EVENT_GENERAL_INFO General;
  // Nazev klice
  REG_DATA_UNICODE_STRING KeyName;
  // Presny typ operace
  ULONG64 OperationType;
  // Velikost dat noveho SD
  ULONG32 SecurityDescriptorLength;
  // Offset dat noveho SD
  ULONG32 SecurityDescriptorOffset;
} REG_EVENT_SET_KEY_SECURITY_INFO, *PREG_EVENT_SET_KEY_SECURITY_INFO;

// Udalost obnoveni klice a jeho podstromu
typedef struct _REG_EVENT_RESTORE_KEY_INFO
{
  // Obecne informace
  REG_EVENT_GENERAL_INFO General;
  // nazev klice
  REG_DATA_UNICODE_STRING KeyName;
  // Handle souboru s jeho podstromem
  ULONG64 FileHandle;
  // Dalsi priznaky operace
  ULONG64 Flags;
} REG_EVENT_RESTORE_KEY_INFO, *PREG_EVENT_RESTORE_KEY_INFO;

// Udalost ulozeni klice do souboru
typedef struct _REG_EVENT_SAVE_KEY_INFO
{
  // Obecne informace
  REG_EVENT_GENERAL_INFO General;
  // Nazev klice
  REG_DATA_UNICODE_STRING KeyName;
  // Handle souboru
  ULONG64 FileHandle;
} REG_EVENT_SAVE_KEY_INFO, *PREG_EVENT_SAVE_KEY_INFO;

// Udalost prepisu klice
typedef struct _REG_EVENT_REPLACE_KEY_INFO
{
  // Obecne informace
  REG_EVENT_GENERAL_INFO General;
  // Nazev klice
  REG_DATA_UNICODE_STRING KeyName;
  // Nazev souboru s novymi daty
  REG_DATA_UNICODE_STRING FileName;
  // Nazev souboru, kam se zapisou aktualni data klice
  REG_DATA_UNICODE_STRING BackupFileName;
} REG_EVENT_REPLACE_KEY_INFO, *PREG_EVENT_REPLACE_KEY_INFO;



NTSTATUS ParseGeneralPostEvent(REG_NOTIFY_CLASS OpType, PREG_POST_OPERATION_INFORMATION PostInfo);
NTSTATUS ParseSetValueKeyEvent(IN PREG_SET_VALUE_KEY_INFORMATION Info);
NTSTATUS ParseDeleteValueKeyEvent(IN PREG_DELETE_VALUE_KEY_INFORMATION Info);
NTSTATUS ParseDeleteKeyEvent(IN PREG_DELETE_KEY_INFORMATION Info);
NTSTATUS ParseSetInformationKeyEvent(IN PREG_SET_INFORMATION_KEY_INFORMATION Info);
NTSTATUS ParseRenameKeyEvent(IN PREG_RENAME_KEY_INFORMATION Info);
NTSTATUS ParseEnumerateKeyEvent(IN PREG_ENUMERATE_KEY_INFORMATION Info);
NTSTATUS ParseEnumerateValueKeyEvent(IN PREG_ENUMERATE_VALUE_KEY_INFORMATION Info);
NTSTATUS ParseQueryKeyEvent(IN PREG_QUERY_KEY_INFORMATION Info);
NTSTATUS ParseQueryValueKeyEvent(IN PREG_QUERY_VALUE_KEY_INFORMATION Info);
NTSTATUS ParseQueryMultipleValueKeyEvent(IN PREG_QUERY_MULTIPLE_VALUE_KEY_INFORMATION Info);
NTSTATUS ParseKeyHandleCloseEvent(IN PREG_KEY_HANDLE_CLOSE_INFORMATION Info);
NTSTATUS ParseFlushKeyEvent(IN PREG_FLUSH_KEY_INFORMATION Info);
NTSTATUS ParseCreateKeyEvent(IN PREG_PRE_CREATE_KEY_INFORMATION Info);
NTSTATUS ParseOpenKeyEvent(IN PREG_PRE_OPEN_KEY_INFORMATION Info);
NTSTATUS ParseOpenKeyExEvent(IN PREG_OPEN_KEY_INFORMATION Info);
NTSTATUS ParseCreateKeyExEvent(IN PREG_CREATE_KEY_INFORMATION Info);
NTSTATUS ParseLoadKeyEvent(IN PREG_LOAD_KEY_INFORMATION Info);
NTSTATUS ParseUnLoadKeyEvent(IN PREG_UNLOAD_KEY_INFORMATION Info);
NTSTATUS ParseQueryKeySecurityEvent(IN PREG_QUERY_KEY_SECURITY_INFORMATION Info);
NTSTATUS ParseSetKeySecurityEvent(IN PREG_SET_KEY_SECURITY_INFORMATION Info);
NTSTATUS ParseRestoreKeyEvent(IN PREG_RESTORE_KEY_INFORMATION Info);
NTSTATUS ParseSaveKeyEvent(IN PREG_SAVE_KEY_INFORMATION Info);
NTSTATUS ParseReplaceKeyEvent(IN PREG_REPLACE_KEY_INFORMATION Info);
NTSTATUS ParsePostCreateKeyEvent(PREG_POST_CREATE_KEY_INFORMATION Info);
NTSTATUS ParsePostOpenKeyEvent(PREG_POST_OPEN_KEY_INFORMATION Info);
NTSTATUS ParsePostOpenKeyExEvent(PREG_POST_OPERATION_INFORMATION  Info);
NTSTATUS ParsePostCreateKeyExEvent(PREG_POST_OPERATION_INFORMATION  Info);
NTSTATUS ParsePostRestoreKeyEvent(PREG_RESTORE_KEY_INFORMATION Info);
NTSTATUS ParsePostSaveKeyEvent(PREG_SAVE_KEY_INFORMATION Info);
NTSTATUS ParsePostReplaceKeyEvent(PREG_REPLACE_KEY_INFORMATION Info);

NTSTATUS RegEventsInit(VOID);
VOID RegEventsFinit(VOID);


#endif
