
/**
 * @file: moduleinfo.c
 *
 * Tento modul slouzi pro praci se strukturami MODULE_INFO_ITEM, jejichz
 * ucelem je uchovavat informace o jednotlivych modulech nactenych v
 * adresovem prostoru ciloveho procesu.
 */

#include <stdio.h>
#include <windows.h>
#include "common.h"
#include "moduleinfo.h"


/** Alokuje a inicializuje strukturu MODULE_INFO_ITEM.
 *
 *  @param ModuleBaseAddress Pocatecni adresa modulu v adresovem prostoru.
 *  @param ModuleSize Velikost, kterou modul zabira ve virtualni pameti.
 *  @param ModuleName Retezec obsahujici plne jmeno modulu vcetne cesty.
 *  @param ModuleNameLen Delka retezce ModuleName v bajtech, nezahrnuje nulovy
 *  znak, ktery nemusi byt ani pritomny.
 *
 *  @return Funkce vrati adresu nove struktury MODULE_INFO_ITEM v pripade
 *  uspechu a hodnotu NULL v pripade neuspechu.
 */
PMODULE_INFO_ITEM ModuleInfoItemAlloc(PVOID ModuleBaseAddress, SIZE_T ModuleSize, PWCHAR ModuleName, SIZE_T ModuleNameLen)
{
  SIZE_T RequiredSize = 0;
  PMODULE_INFO_ITEM Ret = NULL;
  DebugMsg(("moduleinfo.c: ModuleInfoItemAlloc(ModuleBaseAddress=0x%p; ModuleSize=%u; ModuleName=\"%S\"; ModuleNameLen=%u)\n", ModuleBaseAddress, ModuleSize, ModuleName, ModuleNameLen));

  RequiredSize = sizeof(MODULE_INFO_ITEM) + ModuleNameLen;
  Ret = (PMODULE_INFO_ITEM)AllocMem(RequiredSize);
  if (Ret != NULL) {
	Ret->Next = NULL;
	Ret->BaseAddress = ModuleBaseAddress;
	Ret->Size = ModuleSize;
	ZeroMemory(&Ret->Name, ModuleNameLen + sizeof(WCHAR));
	CopyMemory(&Ret->Name, ModuleName, ModuleNameLen);
  }

  DebugMsg(("moduleinfo.c: ModuleInfoItemAlloc(-):0x%p\n", Ret));
  return Ret;
}


/** Vlozi strukturu MODULE_INFO_ITEM do spojoveho seznamu struktur
 *  stejneho druhu.
 *
 *  @param Item Adresa struktury MODULE_INFO_ITEM, za kterou si volajici
 *  preje novou polozku vlozit.
 *  @param ItemToInsert Adresa struktury MODULE_INFO_ITEM, kterou si
 *  volajici preje do seznamu vlozit.
 */
VOID ModuleInfoItemInsert(PMODULE_INFO_ITEM Item, PMODULE_INFO_ITEM ItemToInsert)
{
  ItemToInsert->Next = Item->Next;
  Item->Next = ItemToInsert;

  return;
}


/** Uvolni zadanou strukturu MODULE_INFO_ITEM z pameti.
 *
 *  @param Item Adresa struktury, kterou si volajici preje uvolnit.
 */
VOID ModuleInfoItemFree(PMODULE_INFO_ITEM Item)
{
  DebugMsg(("moduleinfo.c: ModuleInfoItemFree(Item=0x%p)\n", Item));

  FreeMem(Item);

  DebugMsg(("moduleinfo.c: ModuleInfoItemFree(-)\n"));
  return;
}


/** Uvolni cely spojovy seznam zacinajici ve strukture zadane parametrem.
 *
 *  @param ListStart Adresa struktury MODULE_INFO_ITEM, ktera reprezentuje
 *  prvni prvek v danem seznamu.
 */
VOID ModuleInfoListFree(PMODULE_INFO_ITEM ListStart)
{
  PMODULE_INFO_ITEM Tmp = NULL;
  DebugMsg(("moduleinfo.c: ModuleInfoListFree(ListStart=0x%p)\n", ListStart));

  while (ListStart != NULL) {
    Tmp = ListStart;
	ListStart = ListStart->Next;
	ModuleInfoItemFree(Tmp);
  }

  DebugMsg(("moduleinfo.c: ModuleInfoListFree(-)\n"));
  return;
}



/** Inicializuje modul pro praci se strukturami MODULE_INFO_ITEM.
 *
 *  Jelikoz tento modul inicializovat nepotrebuje, tato rutina nedela
 *  nic a je pritomna pouze z duvodu zachovani konzistence.
 *
 *  @return Funkce vrati TRUE v pripade uspechu a FALSE v pripade
 *  neuspechu.
 */
BOOL ModuleInfoInit(VOID)
{
  BOOL Ret = FALSE;
  DebugMsg(("moduleinfo.c: ModuleInfoInit()\n"));

  Ret = TRUE;

  DebugMsg(("moduleinfo.c: ModuleInfoInit(-):%u\n", Ret));
  return Ret;
}


/** Uklidi po modulu pro praci se strukturami MODULE_INFO_ITEM.
 *
 *  Jelikoz tento modul po sobe uklizet nepotrebuje, tato rutina nedela
 *  nic a je pritomna pouze z duvodu zachovani konzistence.
 */
VOID ModuleInfoFinit(VOID)
{
  DebugMsg(("moduleinfo.c: ModuleInfoFinit()\n"));

  DebugMsg(("moduleinfo.c: ModuleInfoFinit(-)\n"));
  return;
}
