
/**
 * @file: object_type_w2k.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 2000.
 */
 
#ifndef __OBJECT_TYPE_W2K_H_
#define __OBJECT_TYPE_W2K_H_

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

typedef struct _OBJECT_TYPE_WKk {
  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_W2K TypeInfo;
  // Tag, kterym spravce objektu oznacuje pamet alokovanou pro objekty daneho typu
  ULONG32 Key;
} OBJECT_TYPE_W2K, *POBJECT_TYPE_W2K;


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

#define OTW2KTypeList(a)                       &((POBJECT_TYPE_W2K)a)->TypeList
#define OTW2KName(a)                           &((POBJECT_TYPE_W2K)a)->Name
#define OTW2KDefaultObject(a)                  ((POBJECT_TYPE_W2K)a)->DefaultObject
#define OTW2KIndex(a)                          ((POBJECT_TYPE_W2K)a)->Index
#define OTW2KTotalNumberOfObjects(a)           ((POBJECT_TYPE_W2K)a)->TotalNumberOfObjects
#define OTW2KTotalNumberOfHandles(a)           ((POBJECT_TYPE_W2K)a)->TotalNumberOfHandles
#define OTW2KHighWaterNumberOfObjects(a)       ((POBJECT_TYPE_W2K)a)->HighWaterNumberOfObjects
#define OTW2KHighWaterNumberOfHandles(a)       ((POBJECT_TYPE_W2K)a)->HighWaterNumberOfHandles
#define OTW2KTypeInfo(a)                       (POBJECT_TYPE_INITIALIZER_W2K)&((POBJECT_TYPE_W2K)a)->TypeInfo
#define OTW2KKey(a)                            ((POBJECT_TYPE_W2K)a)->Key


#endif
