186a661d1e
Credit goes to @myfreeer https://github.com/myfreeer/chrome-pak-customizer
94 lines
3.3 KiB
C
94 lines
3.3 KiB
C
#include "pak_file.h"
|
|
PakFile pakPackFiles(MyPakHeader *myHeader, PakFile *pakResFile,
|
|
PakAlias *pakAlias) {
|
|
uint8_t *buffer = NULL;
|
|
uint32_t size = myHeader->size;
|
|
uint32_t entrySize = (myHeader->resource_count + 1) * PAK_ENTRY_SIZE;
|
|
uint32_t aliasSize = myHeader->alias_count * PAK_ALIAS_SIZE;
|
|
size += entrySize + aliasSize;
|
|
for (uint32_t i = 0; i < myHeader->resource_count; i++) {
|
|
size += (pakResFile + i)->size;
|
|
}
|
|
buffer = calloc(size, sizeof(uint8_t));
|
|
if (buffer == NULL)
|
|
return NULL_File;
|
|
uint32_t offset = pakWriteHeader(myHeader, buffer);
|
|
if (offset == 0) {
|
|
free(buffer);
|
|
return NULL_File;
|
|
}
|
|
|
|
PakEntry *enrtyPtr = (PakEntry *)(buffer + offset);
|
|
uint8_t *filePtr = buffer + offset + entrySize + aliasSize;
|
|
for (uint32_t i = 0; i < myHeader->resource_count; i++) {
|
|
memcpy(filePtr, pakResFile->buffer, pakResFile->size);
|
|
enrtyPtr->resource_id = pakResFile->id;
|
|
enrtyPtr->offset = filePtr - buffer;
|
|
filePtr += pakResFile->size;
|
|
enrtyPtr++;
|
|
pakResFile++;
|
|
}
|
|
|
|
enrtyPtr->resource_id = 0;
|
|
enrtyPtr->offset = (pakResFile - 1)->size + (enrtyPtr - 1)->offset;
|
|
void *aliasPtr = (void *)(enrtyPtr + 1);
|
|
memcpy(aliasPtr, pakAlias, aliasSize);
|
|
PakFile pakFile;
|
|
pakFile.buffer = buffer;
|
|
pakFile.size = size;
|
|
return pakFile;
|
|
}
|
|
|
|
PakFile pakGetFile(uint8_t *pakBuffer, uint16_t id) {
|
|
PakFile pakFile = NULL_File;
|
|
MyPakHeader myHeader;
|
|
if (!pakParseHeader(pakBuffer, &myHeader)) {
|
|
return NULL_File;
|
|
}
|
|
PakEntry *entryPtr = (PakEntry *)(pakBuffer + myHeader.size);
|
|
if (myHeader.version == 5) {
|
|
PakAlias *aliasPtr =
|
|
(PakAlias *)(pakBuffer + myHeader.size +
|
|
(myHeader.resource_count + 1) * PAK_ENTRY_SIZE);
|
|
for (uint16_t i = 0; i < myHeader.alias_count; i++) {
|
|
if (aliasPtr->resource_id == id) {
|
|
entryPtr += aliasPtr->entry_index;
|
|
pakFile.buffer = pakBuffer + entryPtr->offset;
|
|
pakFile.size = (entryPtr + 1)->offset - entryPtr->offset;
|
|
return pakFile;
|
|
}
|
|
}
|
|
}
|
|
for (uint32_t i = 0; i < myHeader.resource_count; i++) {
|
|
if (entryPtr->resource_id == id) {
|
|
pakFile.buffer = pakBuffer + entryPtr->offset;
|
|
pakFile.size = (entryPtr + 1)->offset - entryPtr->offset;
|
|
return pakFile;
|
|
}
|
|
entryPtr++;
|
|
}
|
|
return NULL_File;
|
|
}
|
|
|
|
PakFile *pakGetFiles(uint8_t *buffer) {
|
|
PakFile *pakResFile = NULL;
|
|
MyPakHeader myHeader;
|
|
if (!pakParseHeader(buffer, &myHeader)) {
|
|
return NULL;
|
|
}
|
|
pakResFile = (PakFile *)calloc(myHeader.resource_count, sizeof(PakFile));
|
|
PakFile *returnValue = pakResFile;
|
|
if (pakResFile == NULL) {
|
|
return NULL;
|
|
}
|
|
PakEntry *pakEntryPtr = (PakEntry *)(buffer + myHeader.size);
|
|
for (uint32_t i = 0; i < myHeader.resource_count; i++) {
|
|
uint32_t offset = pakEntryPtr->offset;
|
|
pakResFile->id = pakEntryPtr->resource_id;
|
|
pakResFile->buffer = buffer + offset;
|
|
pakEntryPtr++;
|
|
pakResFile->size = pakEntryPtr->offset - offset;
|
|
pakResFile++;
|
|
}
|
|
return returnValue;
|
|
}
|