// MyDLL.cpp : Defines the entry point for the DLL application. // #include "stdafx.h" #include "MyDLL.h" #ifdef _MANAGED #pragma managed(push, off) #endif BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } #ifdef _MANAGED #pragma managed(pop) #endif // This is an example of an exported function. MYDLL_API int fnMyDLL(void) { return 42; } MYDLL_API void ArchiverInitialize(void) { //Set up the main header for writing mainHeader.Signature[0] = 'P'; mainHeader.Signature[1] = 'A'; mainHeader.Signature[2] = 'C'; mainHeader.Signature[3] = 'K'; mainHeader.offset = 12; mainHeader.length = 0; fileCount = 0; } MYDLL_API void ArchiverOpen(char *archiveName, bool existance) { //Check to see if this is a new PAK file if(existance == false) { ArchiverInitialize(); outfile.open(archiveName, ios_base::binary | ios_base::in | ios_base::out | ios_base::trunc); //Write the main header info if(outfile.is_open()) { outfile.clear(); outfile.write((char *)&mainHeader.Signature, sizeof(char[4])); outfile.write((char *)&mainHeader.offset, sizeof(int)); outfile.write((char *)&mainHeader.length, sizeof(int)); } } else { //outfile.close(); outfile.open(archiveName, ios_base::binary | ios_base::in | ios_base::out); if(outfile.is_open()) { outfile.clear(); char tempname[4]; outfile.read((char *)&tempname, 4); outfile.read((char *)&mainHeader.offset, sizeof(int)); outfile.read((char *)&mainHeader.length, sizeof(int)); //changed stuff here fileCount = mainHeader.length / 264; } } } MYDLL_API void ArchiverClose(void) { outfile.close(); } MYDLL_API int ArchiverAddFile(char *fileName) { int filesize = 0; int numDirs = 0; FileHeader TempFileHeader; FileHeader *StoredHeaders; char *filedatabuffer = new char[BufferSize]; // 1.) Read Main Header MainHeader TempHeader = mainHeader; char *CombinedName = new char[(strlen(WorkingDir) + 1) + (strlen(fileName) + 1)]; sprintf_s(CombinedName, (strlen(WorkingDir) + 1) + (strlen(fileName) + 1), "%s\\%s", WorkingDir, fileName); infileFileToRead.open(CombinedName, ios_base::binary | ios_base::in); //Check to see if any other files and directorys are in the pak file if(TempHeader.length != 0) { //TODO: If there is already somthing in there outfile.seekp(TempHeader.offset); numDirs = TempHeader.length / sizeof(FileHeader); //Store the directorys StoredHeaders = new FileHeader[numDirs]; for(int i = 0; i < numDirs; ++i) { outfile.read((char *)&StoredHeaders[i].fileName, sizeof(char[256])); outfile.read((char *)&StoredHeaders[i].fileOffset, sizeof(int)); outfile.read((char *)&StoredHeaders[i].fileSize, sizeof(int)); } } outfile.seekp(TempHeader.offset); int FileCount = 0; //Write out the data for the while(infileFileToRead.good()) { infileFileToRead.read(filedatabuffer, BufferSize); outfile.write(filedatabuffer, infileFileToRead.gcount()); FileCount += infileFileToRead.gcount(); } filesize = FileCount; //Write the old Directory data for(int i = 0; i < numDirs; ++i) { outfile.write((char *)&StoredHeaders[i].fileName, sizeof(char[256])); outfile.write((char *)&StoredHeaders[i].fileOffset, sizeof(int)); outfile.write((char *)&StoredHeaders[i].fileSize, sizeof(int)); } //Write the new file header memset(TempFileHeader.fileName, 0, 256); strcpy_s(TempFileHeader.fileName, strlen(fileName) + 1, fileName); TempFileHeader.fileOffset = TempHeader.offset; TempFileHeader.fileSize = filesize; outfile.write((char *)&TempFileHeader.fileName, sizeof(char[256])); outfile.write((char *)&TempFileHeader.fileOffset, sizeof(int)); outfile.write((char *)&TempFileHeader.fileSize, sizeof(int)); mainHeader.offset += TempFileHeader.fileSize; mainHeader.length += sizeof(FileHeader); outfile.seekp(4); outfile.write((char *)&mainHeader.offset, sizeof(int)); outfile.write((char *)&mainHeader.length, sizeof(int)); //Clean-up delete [] filedatabuffer; infileFileToRead.clear(); infileFileToRead.close(); fileCount++; return filesize; } void HelpCut(char *stringtocut) { //Parse the string to be cut untill it equals the writning dir if(strcmp(stringtocut, WritingDir) != 0) { string MyString = stringtocut; int x = (int)MyString.find_last_of('\\'); string Mcut = MyString.substr(0, x); HelpCut((char *)Mcut.c_str()); } CreateDirectory(stringtocut, 0); } MYDLL_API void ArchiverExtractFile(char *fileName) { //Create a name that takes the file we are extracting and combines it with the writing dir char *CombinedName = new char[(strlen(WritingDir) + 1) + (strlen(fileName) + 1)]; sprintf_s(CombinedName, (strlen(WritingDir) + 1) + (strlen(fileName) + 1), "%s\\%s", WritingDir, fileName); string MyString; //Cut it so we can create the sub directorys MyString = CombinedName; int x = (int)MyString.find_last_of('\\'); string cut = MyString.substr(0, x); HelpCut((char *)cut.c_str()); FileWriter.open(CombinedName, ios_base::binary | ios_base::out | ios_base::trunc); //Seek to the offset outfile.seekg(mainHeader.offset); //For each file in this PAK file for(int i = 0; i < fileCount; ++i) { //Read in the data FileHeader TempHeader; outfile.read((char *)&TempHeader.fileName, sizeof(char[256])); outfile.read((char *)&TempHeader.fileOffset, sizeof(int)); outfile.read((char *)&TempHeader.fileSize, sizeof(int)); //Read in the data and write it to a temp buffer if(strcmp(TempHeader.fileName, fileName) == 0) { char *filedatabuffer = new char[TempHeader.fileSize]; memset(filedatabuffer, 0, TempHeader.fileSize); outfile.seekg(TempHeader.fileOffset); outfile.read(filedatabuffer, TempHeader.fileSize); FileWriter.write(filedatabuffer, TempHeader.fileSize); break; } } FileWriter.close(); } MYDLL_API int ArchiverFileCount(void) { return fileCount; } MYDLL_API char** ArchiverListFiles(void) { //Get the main file header. MainHeader TempHeader = mainHeader; int oldpos = 0; //Set the write pos oldpos = outfile.tellp(); outfile.clear(); outfile.seekp(TempHeader.offset); //Create an array of names char **MainArray = new char*[fileCount]; char Name[256]; int tempLen = 0; for(int i = 0; i < fileCount; ++i) { //Read in the name of the file and two unneeded items outfile.read((char *)&Name, sizeof(char[256])); outfile.read((char *)&tempLen, sizeof(int)); outfile.read((char *)&tempLen, sizeof(int)); MainArray[i] = new char[256]; memset(MainArray[i], 0, 256); strcpy_s(MainArray[i], strlen(Name) + 1, Name); } outfile.seekp(oldpos); return MainArray; } MYDLL_API void ArchiverSetWorkingDir(char *dir) { WorkingDir = new char[strlen(dir) + 1]; strcpy_s(WorkingDir, strlen(dir) + 1, dir); } MYDLL_API void ArchiverSetWritingDir(char *dir) { WritingDir = new char[strlen(dir) + 1]; strcpy_s(WritingDir, strlen(dir) + 1, dir); }