
/**
 * @file: object_type_w2k3.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 Server 2003.
 */
#ifndef __OBJECT_TYPE_W2K3_H_
#define __OBJECT_TYPE_W2K3_H_

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

typedef struct _OBJECT_TYPE_W2K3 {
  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_W2K3 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_W2K3, *POBJECT_TYPE_W2K3;

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

#define OTW2K3TypeList(a)                       &((POBJECT_TYPE_W2K3)a)->TypeList
#define OTW2K3Name(a)                           &((POBJECT_TYPE_W2K3)a)->Name
#define OTW2K3DefaultObject(a)                  ((POBJECT_TYPE_W2K3)a)->DefaultObject
#define OTW2K3Index(a)                          ((POBJECT_TYPE_W2K3)a)->Index
#define OTW2K3TotalNumberOfObjects(a)           ((POBJECT_TYPE_W2K3)a)->TotalNumberOfObjects
#define OTW2K3TotalNumberOfHandles(a)           ((POBJECT_TYPE_W2K3)a)->TotalNumberOfHandles
#define OTW2K3HighWaterNumberOfObjects(a)       ((POBJECT_TYPE_W2K3)a)->HighWaterNumberOfObjects
#define OTW2K3HighWaterNumberOfHandles(a)       ((POBJECT_TYPE_W2K3)a)->HighWaterNumberOfHandles
#define OTW2K3TypeInfo(a)                       (POBJECT_TYPE_INITIALIZER_W2K3)&((POBJECT_TYPE_W2K3)a)->TypeInfo
#define OTW2K3Key(a)                            ((POBJECT_TYPE_W2K3)a)->Key
#define OTW2K3ObjectLocks(a)                    &((POBJECT_TYPE_W2K3)a)->ObjectLocks
#define OTW2K3ObjectLockCount                   4


#endif
