
/**
 * @file: object_type.h
 *
 * Tento soubor je soucasti frameworku pro praci s internimi strukturami spravce objektu
 * jadra WIndows. Tento soubor je hlavickovym souborem k souboru object_type.c, ktery
 * implementuje rutiny pro praci s objekty typu, ktere Windows reprezentuji strukturami
 * OBJECT_TYPE.
 */
 
#ifndef __OBJECT_TYPE_H_
#define __OBJECT_TYPE_H_

#include <ntddk.h>

// Vlozime definice struktury OBJECT_TYPE pro ruzne verze Windows
#include "object_initializer.h"
#include "object_type_w2k.h"
#include "object_type_w2k3.h"
#include "object_type_wxp.h"
#include "object_type_vista.h"
#include "object_type_w7.h"

// Do teto struktury rutina OTGetStatistics uklada statistiky o objektech daneho typu
typedef struct _OBJECT_TYPE_STATISTICS
{
  // Aktualni pocet objektu daneho typu
  ULONG32 TotalNumberOfObjects;
  // aktualni pocet handle daneho typu
  ULONG32 TotalNumberOfHandles;
  // Nejvyssi zaznamenany pocet objektu daneho typu v aktualnim behu pocitace
  ULONG32 HighWaterNumberOfObjects;
  // Nejvyssi zaznamenany pocet handle na objekty daneho typu v aktualnim behu pocitace
  ULONG32 HighWaterNumberOfHandles;
} OBJECT_TYPE_STATISTICS, *POBJECT_TYPE_STATISTICS;

// Do teto struktury uklada rutina OTGetInfo vsechny dulezite informace ze struktur
// OBJECT_TYPE a OBJECT_TYPE_INITIALIZER
typedef struct _OBJECT_TYPE_INFO 
{
  // Hlava spojoveho seznamu propojujiciho za urcitych podminek vsechny objekty daneho typu
  LIST_ENTRY TypeList;
  // Jmeno (hluboka kopie) objektu typu
  UNICODE_STRING Name;
  // Uziva se pro cekani. Adresa objektu dispatcher nebo jeho offset vzhledem k zacatku tela
  PVOID DefaultObject;
  // Index daneho objektu typu. Tento index lze pouzit napr. do pole ObpTypeIndexTable
  ULONG32 Index;
  // Tag, kterym spravce objektu oznacuje pamet alokovanou pro objekty daneho typu
  ULONG32 Key;
  // Statistiky poctu objektu daneho typu a jejich handle
  OBJECT_TYPE_STATISTICS Statistics;
  // Priznaky ve strukture Object Initializer
  OBJECT_INITIALIZER_FLAGS InitializerFlags;
  // Adresy (virtualnich) metod ve strukture Object Initializer
  OBJECT_INITIALIZER_METHODS InitializerMethods;
  // Dalsi udaje ulozene ve strukture Object Initializer
  OBJECT_INITIALIZER_OTHER_INFO InitializerOtherInfo;
} OBJECT_TYPE_INFO, *POBJECT_TYPE_INFO;


// Vyznam jednotlivych funkci je popsat u jejich implementace v souboru object_type.c
PLIST_ENTRY OTGetTypeList(POBJECT_TYPE ObjectType);
PUNICODE_STRING OTGetName(POBJECT_TYPE ObjectType);
PVOID OTGetDefaultObject(POBJECT_TYPE ObjectType);
ULONG OTGetIndex(POBJECT_TYPE ObjectType);
NTSTATUS OTGetStatistics(POBJECT_TYPE ObjectType, POBJECT_TYPE_STATISTICS Statistics);
PVOID OTGetTypeInfo(POBJECT_TYPE ObjectType);
ULONG OTGetKey(POBJECT_TYPE ObjectType);
NTSTATUS OTGetSpecificInfo(POBJECT_TYPE Object, POBJECT_TYPE_INFO Info);

NTSTATUS OTModuleInit(VOID);
VOID OTModuleFinit(VOID);

#endif
