
/**
 * @file: object_type_w7.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 7.
 */
 
#ifndef __OBJECT_TYPE_W7_H_
#define __OBJECT_TYPE_W7_H_

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

typedef struct _OBJECT_TYPE_W7 {
  // 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_W7 TypeInfo; 
  PVOID TypeLock; 
  // Tag, kterym spravce objektu oznacuje pamet alokovanou pro objekty daneho typu
  ULONG32 Key;     
  // Seznam callbacku zavesenych na objektech tohoto typu (OB filtering model)
  LIST_ENTRY CallbackList;
} OBJECT_TYPE_W7, *POBJECT_TYPE_W7;

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

#define OTW7TypeList(a)                     &((POBJECT_TYPE_W7)a)->TypeList
#define OTW7Name(a)                         &((POBJECT_TYPE_W7)a)->Name
#define OTW7DefaultObject(a)                ((POBJECT_TYPE_W7)a)->DefaultObject
#define OTW7Index(a)                        ((POBJECT_TYPE_W7)a)->Index
#define OTW7TotalNumberOfObjects(a)         ((POBJECT_TYPE_W7)a)->TotalNumberOfObjects
#define OTW7TotalNumberOfHandles(a)         ((POBJECT_TYPE_W7)a)->TotalNumberOfHandles
#define OTW7HighWaterNumberOfObjects(a)     ((POBJECT_TYPE_W7)a)->HighWaterNumberOfObjects
#define OTW7HighWaterNumberOfHandles(a)     ((POBJECT_TYPE_W7)a)->HighWaterNumberOfHandles
#define OTW7TypeInfo(a)                     (POBJECT_TYPE_INITIALIZER_W7)&((POBJECT_TYPE_W7)a)->TypeInfo
#define OTW7Key(a)                          ((POBJECT_TYPE_W7)a)->Key
#define OTW7CallbackList(a)                 &(POBJECT_TYPE_W7)a)->CallbackList


#endif
