
/**
 * @file: object_type_vista.h
 *
 * Tento soubor je soucasti frameworku pro prochazeni internich datovych struktur
 * spravce objektu jadra Windows. Obsahuje definici struktury OBJECT_TYPE spolu s
 * nekkolika makry pro WIndows Vista.
 */
#ifndef __OBJECT_TYPE_VISTA_H_
#define __OBJECT_TYPE_VISTA_H_

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

typedef struct _OBJECT_TYPE_VISTA {
  // Hlava spojoveho seznamu propojujiciho za urcitych podminek vsechny objekty daneho typu
  LIST_ENTRY TypeList;
  // Jmeno 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
  UCHAR Index;                                                      
  // 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;                                         
  // Struktura Object Initializer
  OBJECT_TYPE_INITIALIZER_VISTA TypeInfo;
  ERESOURCE Mutex;
  PVOID TypeLock;
  // Tag, kterym spravce objektu oznacuje pamet alokovanou pro objekty daneho typu
  ULONG32  Key;
  // Toto pole zamku je urceno pro synchronizaci pristupu na jednotlive objekty daneho typu
  PVOID ObjectLocks[32];
  // Seznam callbacku zavesenych na objektech tohoto typu (OB filtering model)
  LIST_ENTRY CallbackList;   
} OBJECT_TYPE_VISTA, *POBJECT_TYPE_VISTA;

// Tato makra slouzi pro snazsi "vytahovani" dulezitych udaju ze struktury OBJECT_TYPE

#define OTVistaTypeList(a)                     &((POBJECT_TYPE_VISTA)a)->TypeList
#define OTVistaName(a)                         &((POBJECT_TYPE_VISTA)a)->Name
#define OTVistaDefaultObject(a)                ((POBJECT_TYPE_VISTA)a)->DefaultObject
#define OTVistaIndex(a)                        ((POBJECT_TYPE_VISTA)a)->Index
#define OTVistaTotalNumberOfObjects(a)         ((POBJECT_TYPE_VISTA)a)->TotalNumberOfObjects
#define OTVistaTotalNumberOfHandles(a)         ((POBJECT_TYPE_VISTA)a)->TotalNumberOfHandles
#define OTVistaHighWaterNumberOfObjects(a)     ((POBJECT_TYPE_VISTA)a)->HighWaterNumberOfObjects
#define OTVistaHighWaterNumberOfHandles(a)     ((POBJECT_TYPE_VISTA)a)->HighWaterNumberOfHandles
#define OTVistaTypeInfo(a)                     (POBJECT_TYPE_INITIALIZER_VISTA)&((POBJECT_TYPE_VISTA)a)->TypeInfo
#define OTVistaKey(a)                          ((POBJECT_TYPE_VISTA)a)->Key
#define OTVistaCallbackList(a)                 &(POBJECT_TYPE_VISTA)a)->CallbackList
#define OTVistaObjectLocks(a)                  &((POBJECT_TYPE_VISTA)a)->ObjectLocks
#define OTVistaObjectLockCount                 32

#endif
