
/**
 * @file object.h
 *
 * Jedna se o hlavickovy soubor k souboru object.c, ktery implementuje funkce frameworku
 * nejvyssi urovne. Tyto funkce jsou doporucene pro pouzivani v ovladacich jadra, protoze
 * se ke strukturam spravce objektu (Object Manager) chovaji stejne jako (nebo temer identicky)
 * jako samo jadro operacniho systemu.
 */
#ifndef __OBJECT_H_
#define __OBJECT_H_

#include <ntddk.h>

// Struktura, ktera uchovava veskere informace zjistitelne z hlavicek objektu
typedef struct _OBJECT_HEADER_INFO
{
  // Offset hlavicky se jmenem
  ULONG NameInfoOffset;
  // Offset hlavicky s databazi handle na objekt
  ULONG HandleInfoOffset;
  // Offset hlavicky s informaci, kolik pametovych kvot kazde handle ubira svemu procesu
  ULONG QuotaInfoOffset;
  // Offset hlavicky s informacemi o procesu, ktery objekt vytvoril
  ULONG CreatorInfoOffset;
  // Offset z hlavicky s informacemi o exkluzivnim procesu
  ULONG ProcessInfoOffset;
  // Clen InfoMask z hlavicky objektu na Windows 7
  ULONG InfoMask;
  // Pocet handle na objekt
  LONG_PTR HandleCount;
  // Pocet referenci na objekt
  LONG_PTR PointerCount;
  // Adresr, ve kterem je objekt obsazen
  PVOID Directory;
  // Jmeno objektu
  UNICODE_STRING Name;
  // Adresa tela objektu exklizivniho procesu
  PEPROCESS ExclusiveProcess;
  // Mnozstvi pameti, ktere kazde handle objektu odebira svemu procesu
  ULONG32 PagedPoolCharge;
  ULONG32 NonPagedPoolCharge;
  ULONG32 SecurityDescriptorCharge;
  // PID procesu, ktery objekt vytvoril
  HANDLE CreatorUniqueProcessId;
  // Adresa tela objektu typu
  POBJECT_TYPE Type;
  // Clen Flags s hlavicky objektu
  ULONG Flags;
  // Adresa popisovace zabezpeceni objektu
  PSECURITY_DESCRIPTOR SecurityDescriptor;
} OBJECT_HEADER_INFO, *POBJECT_HEADER_INFO;

// Struktura pouzivana k uchovavani informaci o jmene a adresari objektu
typedef struct _OBJECT_NAME_INFO
{
  // Jmeno objektu (z hlavicky OBJECT_HEADER_NAME_INFO)
  UNICODE_STRING Name;
  // Adresa tela adresare (z hlavicky OBJECT_HEADER_NAME_INFO)
  PVOID Directory;
} OBJECT_NAME_INFO, *POBJECT_NAME_INFO;

// Vynam jednotlivych rutin je popsat u jejich implementace v souboru object.c.

PVOID OBObjectNameToPointer(PUNICODE_STRING ObjectName);
PVOID OBLocalNameToPointer(PVOID Directory, PUNICODE_STRING Name);
NTSTATUS OBGetObjectName(PVOID Object, PUNICODE_STRING Name);
VOID OBReleaseObjectPointer(PVOID Object);
POBJECT_TYPE OBGetObjectType(PVOID Object);
NTSTATUS OBGetObjectHeaderInfo(PVOID Object, POBJECT_HEADER_INFO ObjectInfo);
BOOLEAN OBIsObjectDirectory(PVOID Object);
NTSTATUS OBGetFullName(PVOID Object, PUNICODE_STRING FullName, PULONG NameLength);
NTSTATUS OBGetNameInfo(PVOID Object, POBJECT_NAME_INFO NameInfo);
VOID OBReleaseNameInfo(POBJECT_NAME_INFO NameInfo);

BOOLEAN OBLockShared(PVOID Object);
BOOLEAN OBLockExclusive(PVOID Object);
BOOLEAN OBUnlock(PVOID Object);


NTSTATUS OBInit(VOID);
VOID OBFinit(VOID);


#endif
