// SwiftShader Software Renderer
//
// Copyright(c) 2005-2011 TransGaming Inc.
//
// All rights reserved. No part of this software may be copied, distributed, transmitted,
// transcribed, stored in a retrieval system, translated into any human or computer
// language by any means, or disclosed to third parties without the explicit written
// agreement of TransGaming Inc. Without such an agreement, no rights or licenses, express
// or implied, including but not limited to any patent rights, are granted to you.
//

#include "Dll.hpp"

#include <time.h>

#ifndef IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE
#define IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 0x0040
#endif

#ifndef IMAGE_DLLCHARACTERISTICS_NX_COMPAT 
#define IMAGE_DLLCHARACTERISTICS_NX_COMPAT 0x0100
#endif
 
namespace sw
{
	#ifdef _M_AMD64
		const bool AMD64 = true;
	#else
		const bool AMD64 = false;
	#endif

	DLL::DLL(const char *name, const void *constants, int constSize) : constants(constants), constSize(constSize)
	{
		dllName = new char[strlen(name) + 1];
		strcpy(dllName, name);

		codeSize = 0;
	}

	DLL::~DLL()
	{
		delete[] dllName;

		for(FunctionList::iterator i = functionList.begin(); i != functionList.end(); i++)
		{
			delete i->second;
		}
	}

	void DLL::addFunction(const void *function, const void *entry, int size)
	{
		functionOrder.push_back(function);
		functionList[function] = new Function(codeSize, function, entry, size);

		codeSize += size;
	}

	void DLL::addRelocation(const void *function, const void *address, bool ripRelative)
	{
		globalRelocations[function].push_back(Relocation((unsigned int)((unsigned char*)address - (unsigned char*)function), ripRelative));
	}

	void DLL::emit()
	{
		if(codeSize == 0)
		{
			return;
		}

		for(GlobalRelocations::iterator i = globalRelocations.begin(); i != globalRelocations.end(); i++)
		{
			const unsigned char *function = (const unsigned char*)i->first;
			const std::vector<Relocation> &functionRelocations = i->second;
			unsigned int location = functionList[function]->location;
			
			for(unsigned int j = 0; j < functionRelocations.size(); j++)
			{
				unsigned int address = location + functionRelocations[j].offset;
				unsigned int page = address / 0x1000;
				unsigned short reloc = address - page * 0x1000;

				unsigned int relocType = AMD64 ? IMAGE_REL_BASED_DIR64 : IMAGE_REL_BASED_HIGHLOW;
				pageRelocations[page].push_back((relocType << 12) | reloc);
			}
		}

		if(pageRelocations.empty())
		{
			pageRelocations[0];   // Initialize an emtpy list
		}

		int relocSize = 0;

		for(PageRelocations::iterator i = pageRelocations.begin(); i != pageRelocations.end(); i++)
		{
			if(i->second.size() % 2)   // Pad to align to DWORD
			{
				i->second.push_back(0);
			}

			relocSize += (int)sizeof(IMAGE_BASE_RELOCATION) + (int)i->second.size() * (int)sizeof(unsigned short);
		}

		unsigned long timeDateStamp = (unsigned long)time(0);

		memset(&DOSheader, 0, sizeof(DOSheader));
		DOSheader.e_magic = IMAGE_DOS_SIGNATURE;   // "MZ"
		DOSheader.e_lfanew = sizeof(DOSheader);

		int base = 0x10000000;
		int codePage = pageAlign(sizeof(DOSheader) + AMD64 ? sizeof(COFFheader64) : sizeof(COFFheader32));
		int exportsPage = codePage + pageAlign(codeSize);
		int exportsSize = (int)(sizeof(IMAGE_EXPORT_DIRECTORY) + functionList.size() * sizeof(void*) + (strlen(dllName) + 1));
		int relocPage = exportsPage + pageAlign(exportsSize);
		int constPage = relocPage + pageAlign(relocSize);

		if(!AMD64)
		{
			memset(&COFFheader32, 0, sizeof(COFFheader32));
			COFFheader32.Signature = IMAGE_NT_SIGNATURE;   // "PE"
			COFFheader32.FileHeader.Machine = IMAGE_FILE_MACHINE_I386;
			COFFheader32.FileHeader.NumberOfSections = 4;
			COFFheader32.FileHeader.TimeDateStamp = timeDateStamp;
			COFFheader32.FileHeader.PointerToSymbolTable = 0;   // Deprecated COFF symbol table
			COFFheader32.FileHeader.NumberOfSymbols = 0;
			COFFheader32.FileHeader.SizeOfOptionalHeader = sizeof(IMAGE_OPTIONAL_HEADER32);
			COFFheader32.FileHeader.Characteristics =	IMAGE_FILE_EXECUTABLE_IMAGE |
														IMAGE_FILE_32BIT_MACHINE |
														IMAGE_FILE_DLL;

			COFFheader32.OptionalHeader.Magic = IMAGE_NT_OPTIONAL_HDR32_MAGIC;
			COFFheader32.OptionalHeader.MajorLinkerVersion = 8;
			COFFheader32.OptionalHeader.MinorLinkerVersion = 0;
			COFFheader32.OptionalHeader.SizeOfCode = fileAlign(codeSize);
			COFFheader32.OptionalHeader.SizeOfInitializedData = fileAlign(exportsSize) + fileAlign(relocSize) + fileAlign(constSize);
			COFFheader32.OptionalHeader.SizeOfUninitializedData = 0;
			COFFheader32.OptionalHeader.AddressOfEntryPoint = 0;
			COFFheader32.OptionalHeader.BaseOfCode = codePage;
			COFFheader32.OptionalHeader.BaseOfData = exportsPage;

			COFFheader32.OptionalHeader.ImageBase = base;
			COFFheader32.OptionalHeader.SectionAlignment = 0x1000;
			COFFheader32.OptionalHeader.FileAlignment = 0x200;
			COFFheader32.OptionalHeader.MajorOperatingSystemVersion = 4;
			COFFheader32.OptionalHeader.MinorOperatingSystemVersion = 0;
			COFFheader32.OptionalHeader.MajorImageVersion = 0;
			COFFheader32.OptionalHeader.MinorImageVersion = 0;
			COFFheader32.OptionalHeader.MajorSubsystemVersion = 4;
			COFFheader32.OptionalHeader.MinorSubsystemVersion = 0;
			COFFheader32.OptionalHeader.Win32VersionValue = 0;
			COFFheader32.OptionalHeader.SizeOfImage = constPage + pageAlign(constSize);
			COFFheader32.OptionalHeader.SizeOfHeaders = fileAlign(sizeof(DOSheader) + sizeof(COFFheader32));
			COFFheader32.OptionalHeader.CheckSum = 0;
			COFFheader32.OptionalHeader.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_GUI;
			COFFheader32.OptionalHeader.DllCharacteristics =	IMAGE_DLLCHARACTERISTICS_NO_SEH |
															IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE |   // Base address randomization
															IMAGE_DLLCHARACTERISTICS_NX_COMPAT;       // Data Execution Prevention compatible
			COFFheader32.OptionalHeader.SizeOfStackReserve = 1024 * 1024;
			COFFheader32.OptionalHeader.SizeOfStackCommit = 4 * 1024;
			COFFheader32.OptionalHeader.SizeOfHeapReserve = 1024 * 1024;
			COFFheader32.OptionalHeader.SizeOfHeapCommit = 4 * 1024;
			COFFheader32.OptionalHeader.LoaderFlags = 0;
			COFFheader32.OptionalHeader.NumberOfRvaAndSizes = IMAGE_NUMBEROF_DIRECTORY_ENTRIES;

			COFFheader32.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress = exportsPage;
			COFFheader32.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size = exportsSize;

			COFFheader32.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress = relocPage;
			COFFheader32.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size = relocSize;
		}
		else
		{
			memset(&COFFheader64, 0, sizeof(COFFheader64));
			COFFheader64.Signature = IMAGE_NT_SIGNATURE;   // "PE"
			COFFheader64.FileHeader.Machine = IMAGE_FILE_MACHINE_AMD64;
			COFFheader64.FileHeader.NumberOfSections = 4;
			COFFheader64.FileHeader.TimeDateStamp = timeDateStamp;
			COFFheader64.FileHeader.PointerToSymbolTable = 0;   // Deprecated COFF symbol table
			COFFheader64.FileHeader.NumberOfSymbols = 0;
			COFFheader64.FileHeader.SizeOfOptionalHeader = sizeof(IMAGE_OPTIONAL_HEADER64);
			COFFheader64.FileHeader.Characteristics =	IMAGE_FILE_EXECUTABLE_IMAGE |
														IMAGE_FILE_LARGE_ADDRESS_AWARE |
														IMAGE_FILE_DLL;

			COFFheader64.OptionalHeader.Magic = IMAGE_NT_OPTIONAL_HDR64_MAGIC;
			COFFheader64.OptionalHeader.MajorLinkerVersion = 8;
			COFFheader64.OptionalHeader.MinorLinkerVersion = 0;
			COFFheader64.OptionalHeader.SizeOfCode = fileAlign(codeSize);
			COFFheader64.OptionalHeader.SizeOfInitializedData = fileAlign(exportsSize) + fileAlign(relocSize) + fileAlign(constSize);
			COFFheader64.OptionalHeader.SizeOfUninitializedData = 0;
			COFFheader64.OptionalHeader.AddressOfEntryPoint = 0;
			COFFheader64.OptionalHeader.BaseOfCode = codePage;

			COFFheader64.OptionalHeader.ImageBase = base;
			COFFheader64.OptionalHeader.SectionAlignment = 0x1000;
			COFFheader64.OptionalHeader.FileAlignment = 0x200;
			COFFheader64.OptionalHeader.MajorOperatingSystemVersion = 4;
			COFFheader64.OptionalHeader.MinorOperatingSystemVersion = 0;
			COFFheader64.OptionalHeader.MajorImageVersion = 0;
			COFFheader64.OptionalHeader.MinorImageVersion = 0;
			COFFheader64.OptionalHeader.MajorSubsystemVersion = 4;
			COFFheader64.OptionalHeader.MinorSubsystemVersion = 0;
			COFFheader64.OptionalHeader.Win32VersionValue = 0;
			COFFheader64.OptionalHeader.SizeOfImage = constPage + pageAlign(constSize);
			COFFheader64.OptionalHeader.SizeOfHeaders = fileAlign(sizeof(DOSheader) + sizeof(COFFheader64));
			COFFheader64.OptionalHeader.CheckSum = 0;
			COFFheader64.OptionalHeader.Subsystem = IMAGE_SUBSYSTEM_WINDOWS_GUI;
			COFFheader64.OptionalHeader.DllCharacteristics =	IMAGE_DLLCHARACTERISTICS_NO_SEH |
															IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE |   // Base address randomization
															IMAGE_DLLCHARACTERISTICS_NX_COMPAT;       // Data Execution Prevention compatible
			COFFheader64.OptionalHeader.SizeOfStackReserve = 1024 * 1024;
			COFFheader64.OptionalHeader.SizeOfStackCommit = 4 * 1024;
			COFFheader64.OptionalHeader.SizeOfHeapReserve = 1024 * 1024;
			COFFheader64.OptionalHeader.SizeOfHeapCommit = 4 * 1024;
			COFFheader64.OptionalHeader.LoaderFlags = 0;
			COFFheader64.OptionalHeader.NumberOfRvaAndSizes = IMAGE_NUMBEROF_DIRECTORY_ENTRIES;

			COFFheader64.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress = exportsPage;
			COFFheader64.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size = exportsSize;

			COFFheader64.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress = relocPage;
			COFFheader64.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size = relocSize;
		}

		memset(&textSection, 0, sizeof(textSection));
		strcpy((char*)&textSection.Name, ".text");
		textSection.Misc.VirtualSize = pageAlign(codeSize);
		textSection.VirtualAddress = codePage;
		textSection.SizeOfRawData = fileAlign(codeSize);
		textSection.PointerToRawData = fileAlign(sizeof(DOSheader) + AMD64 ? sizeof(COFFheader64) : sizeof(COFFheader32));
		textSection.PointerToRelocations = 0;
		textSection.PointerToLinenumbers = 0;
		textSection.NumberOfRelocations = 0;
		textSection.NumberOfLinenumbers = 0;
		textSection.Characteristics = IMAGE_SCN_CNT_CODE |
		                              IMAGE_SCN_MEM_EXECUTE |
		                              IMAGE_SCN_MEM_READ;

		memset(&exportsSection, 0, sizeof(exportsSection));
		strcpy((char*)&exportsSection.Name, ".edata");
		exportsSection.Misc.VirtualSize = pageAlign(exportsSize);
		exportsSection.VirtualAddress = exportsPage;
		exportsSection.SizeOfRawData = fileAlign(exportsSize);
		exportsSection.PointerToRawData = textSection.PointerToRawData + fileAlign(codeSize);
		exportsSection.PointerToRelocations = 0;
		exportsSection.PointerToLinenumbers = 0;
		exportsSection.NumberOfRelocations = 0;
		exportsSection.NumberOfLinenumbers = 0;
		exportsSection.Characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA |
		                                 IMAGE_SCN_MEM_READ;

		memset(&relocSection, 0, sizeof(relocSection));
		strcpy((char*)&relocSection.Name, ".reloc");
		relocSection.Misc.VirtualSize = pageAlign(relocSize);
		relocSection.VirtualAddress = relocPage;
		relocSection.SizeOfRawData = fileAlign(relocSize);
		relocSection.PointerToRawData = exportsSection.PointerToRawData + fileAlign(exportsSize);
		relocSection.PointerToRelocations = 0;
		relocSection.PointerToLinenumbers = 0;
		relocSection.NumberOfRelocations = 0;
		relocSection.NumberOfLinenumbers = 0;
		relocSection.Characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA |
		                               IMAGE_SCN_MEM_DISCARDABLE |
		                               IMAGE_SCN_MEM_READ;

		memset(&constSection, 0, sizeof(constSection));
		strcpy((char*)&constSection.Name, ".rdata");
		constSection.Misc.VirtualSize = pageAlign(constSize);
		constSection.VirtualAddress = constPage;
		constSection.SizeOfRawData = fileAlign(constSize);
		constSection.PointerToRawData = relocSection.PointerToRawData + fileAlign(relocSize);
		constSection.PointerToRelocations = 0;
		constSection.PointerToLinenumbers = 0;
		constSection.NumberOfRelocations = 0;
		constSection.NumberOfLinenumbers = 0;
		constSection.Characteristics = IMAGE_SCN_CNT_INITIALIZED_DATA |
		                               IMAGE_SCN_MEM_READ;

		memset(&exportDirectory, 0, sizeof(exportDirectory));
		exportDirectory.Characteristics = 0;
		exportDirectory.TimeDateStamp = timeDateStamp;
		exportDirectory.MajorVersion = 0;
		exportDirectory.MinorVersion = 0;
		exportDirectory.Name = (unsigned long)(exportsPage + sizeof(IMAGE_EXPORT_DIRECTORY) + functionList.size() * sizeof(void*));
		exportDirectory.Base = 1;
		exportDirectory.NumberOfFunctions = (unsigned long)functionList.size();
		exportDirectory.NumberOfNames = 0;
		exportDirectory.AddressOfFunctions = exportsPage + sizeof(IMAGE_EXPORT_DIRECTORY);
		exportDirectory.AddressOfNames = 0;
		exportDirectory.AddressOfNameOrdinals = 0;

		FILE *file = fopen(dllName, "wb");

		if(file)
		{
			fwrite(&DOSheader, 1, sizeof(DOSheader), file);
			
			if(AMD64)
			{
				fwrite(&COFFheader64, 1, sizeof(COFFheader64), file);
			}
			else
			{
				fwrite(&COFFheader32, 1, sizeof(COFFheader32), file);
			}

			fwrite(&textSection, 1, sizeof(textSection), file);
			fwrite(&exportsSection, 1, sizeof(textSection), file);
			fwrite(&relocSection, 1, sizeof(relocSection), file);
			fwrite(&constSection, 1, sizeof(constSection), file);
			
			for(FunctionList::iterator i = functionList.begin(); i != functionList.end(); i++)
			{
				const void *function = i->first;
				unsigned int location = i->second->location;
				const std::vector<Relocation> &functionRelocations = globalRelocations[function];

				for(unsigned int j = 0; j < functionRelocations.size(); j++)
				{
					unsigned int *address = (unsigned int*)((unsigned char*)i->second->buffer + functionRelocations[j].offset);

					if(functionRelocations[j].ripRelative)
					{
						*address = base + codePage + location + (*address - (unsigned int)(size_t)function);
					}
					else
					{
						*address = base + constPage + (*address - (unsigned int)(size_t)constants);
					}
				}

				fseek(file, textSection.PointerToRawData + location, SEEK_SET);
				fwrite(i->second->buffer, 1, i->second->size, file);
			}

			fseek(file, exportsSection.PointerToRawData, SEEK_SET);
			fwrite(&exportDirectory, 1, sizeof(exportDirectory), file);

			for(unsigned int i = 0; i < functionOrder.size(); i++)
			{
				const void *buffer = functionOrder[i];
				Function *function = functionList[buffer];

				unsigned int functionAddress = codePage + function->location;
				unsigned int functionEntry = functionAddress + (int)((size_t)function->entry - (size_t)buffer);
				fwrite(&functionEntry, 1, sizeof(functionEntry), file);
			}

			fwrite(dllName, 1, strlen(dllName) + 1, file);

			fseek(file, relocSection.PointerToRawData, SEEK_SET);
			
			for(PageRelocations::iterator i = pageRelocations.begin(); i != pageRelocations.end(); i++)
			{
				IMAGE_BASE_RELOCATION relocationBlock;

				relocationBlock.VirtualAddress = codePage + i->first * 0x1000;
				relocationBlock.SizeOfBlock = (unsigned long)(sizeof(IMAGE_BASE_RELOCATION) + i->second.size() * sizeof(unsigned short));

				fwrite(&relocationBlock, 1, sizeof(IMAGE_BASE_RELOCATION), file);

				if(i->second.size() > 0)
				{
					fwrite(&i->second[0], 1, i->second.size() * sizeof(unsigned short), file);
				}
			}

			fseek(file, constSection.PointerToRawData, SEEK_SET);
			fwrite(constants, 1, constSize, file);

			char *padding = new char[fileAlign(constSize) - constSize];
			fwrite(padding, 1, fileAlign(constSize) - constSize, file);
			delete[] padding;

			fclose(file);
		}
	}
}
