
/**
 * @file: object_type_wxp.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 XP.
 */
#ifndef __OBJECT_TYPE_WXP_H_
#define __OBJECT_TYPE_WXP_H_

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

typedef struct _OBJECT_TYPE_WXP {
  ERESOURCE Mutex;
  // 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_WXP TypeInfo; 
  // 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
  ERESOURCE ObjectLocks[4];
} OBJECT_TYPE_WXP, *POBJECT_TYPE_WXP;


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

#define OTWXPTypeList(a)                       &((POBJECT_TYPE_WXP)a)->TypeList
#define OTWXPName(a)                           &((POBJECT_TYPE_WXP)a)->Name
#define OTWXPDefaultObject(a)                  ((POBJECT_TYPE_WXP)a)->DefaultObject
#define OTWXPIndex(a)                          ((POBJECT_TYPE_WXP)a)->Index
#define OTWXPTotalNumberOfObjects(a)           ((POBJECT_TYPE_WXP)a)->TotalNumberOfObjects
#define OTWXPTotalNumberOfHandles(a)           ((POBJECT_TYPE_WXP)a)->TotalNumberOfHandles
#define OTWXPHighWaterNumberOfObjects(a)       ((POBJECT_TYPE_WXP)a)->HighWaterNumberOfObjects
#define OTWXPHighWaterNumberOfHandles(a)       ((POBJECT_TYPE_WXP)a)->HighWaterNumberOfHandles
#define OTWXPTypeInfo(a)                       (POBJECT_TYPE_INITIALIZER_WXP)&((POBJECT_TYPE_WXP)a)->TypeInfo
#define OTWXPKey(a)                            ((POBJECT_TYPE_WXP)a)->Key
#define OTWXPObjectLocks(a)                    &((POBJECT_TYPE_WXP)a)->ObjectLocks
#define OTWXPObjectLockCount                   4

#endif
