#pragma once
#include <windows.h>



using namespace std;

class PE_file
{
	IMAGE_DOS_HEADER* dos;
	IMAGE_FILE_HEADER* fhead;
	IMAGE_OPTIONAL_HEADER32* opt_head;
	IMAGE_SECTION_HEADER* sect_head;
	DWORD PE_offset;
	DWORD section_offset;
	int cur_pos;
	DWORD PE_size;
	
public:
	char* buf;
	PE_file();
	PE_file(HMODULE h);
	void AddNewSection(DWORD Vsize,DWORD Rsize,DWORD access,char* name);
	void SavePE(char* name);
	void open(HMODULE h,DWORD size);
	void open(char* name,DWORD extra_size);
	DWORD RVA_to_RAW(DWORD RVA);  // konwersja RVA do RAW
	DWORD RAW_to_RVA(DWORD RAW);  //konwersja z RAW do RVA
	DWORD VA_to_RVA(DWORD VA);		// VA -> RVA
	DWORD RVA_to_VA(DWORD RVA);		// RVA -> VA
	DWORD Get_EP(void);				// Pobiera Entry Point(RVA)
	DWORD Get_IB(void);				// Pobiera ImageBase
	DWORD Get_Section_Count(void);	//Pobiera ilosc sekcji
	IMAGE_DOS_HEADER* GetDosHeader(void);	//Zwraca naglowek DOS
	IMAGE_FILE_HEADER* GetFileHeader(void);	//Zwraca naglowek pliku
	IMAGE_OPTIONAL_HEADER32* GetOptionalHeader(void);	//Zwraca naglowek opcjonalny(no taki opcjonalny to on nie jest)
	IMAGE_SECTION_HEADER* GetSectHeader(DWORD n);		//Zwraca naglowek podanej sekcji
	PE_file(char* name,DWORD extra_size=0);			//Konstruktor		name-nazwa pliku , extra_size - dodatkowy rozmiar na nowe sekcje
	bool init;

};


