int plf_open_file(const char* filename) { int fileIdx; s_plf_file_entry* fileEntry; if (filename == 0) return PLF_E_PARAM; /* Reserve a new file */ fileIdx = plf_int_new_file(); if (fileIdx < 0) return fileIdx; fileEntry = &plf_files[fileIdx]; /* Open the given filename */ fileEntry->fildes = open(filename, O_RDONLY | O_BINARY); if (fileEntry->fildes < 0) { plf_close(fileIdx); return PLF_E_IO; } fileEntry->flags |= PLF_FILE_FLAG_READ; return plf_int_open_file(fileIdx); }
static int plf_int_open_file(int fileIdx) { int retval; s_plf_file_entry* fileEntry; int bytes_read; PLF_VERIFY_IDX(fileIdx); fileEntry = &plf_files[fileIdx]; bytes_read = plf_int_read(fileIdx, (void*) (&fileEntry->hdr), 0, sizeof(s_plf_file)); if (bytes_read != sizeof(s_plf_file)) { plf_close(fileIdx); return PLF_E_IO; } /* Fill unused bytes */ if (fileEntry->hdr.dwHdrSize < sizeof(s_plf_file)) { u8* p_start = ((u8*) (&fileEntry->hdr)) + fileEntry->hdr.dwHdrSize; u32 fill_size = sizeof(s_plf_file) - fileEntry->hdr.dwHdrSize; memset(p_start, 0, fill_size); } retval = plf_int_read_entries(fileIdx); if (retval < 0) return retval; return fileIdx; }
int plf_create_file(const char* filename) { int fileIdx; s_plf_file_entry* fileEntry; /* Reserve a new file */ fileIdx = plf_int_new_file(); if (fileIdx < 0) return fileIdx; fileEntry = &plf_files[fileIdx]; /* Open the given filename */ fileEntry->fildes = open(filename, O_RDWR | O_CREAT | O_BINARY, 0644 ); if (fileEntry->fildes < 0) { plf_close(fileIdx); return PLF_E_IO; } fileEntry->hdr.dwHdrSize = sizeof(s_plf_file); fileEntry->hdr.dwSectHdrSize = sizeof(s_plf_section); fileEntry->hdr.dwHdrVersion = 0x0A; fileEntry->current_size = plf_int_write(fileIdx, &(fileEntry->hdr), 0, sizeof(s_plf_file)); fileEntry->flags |= PLF_FILE_FLAG_WRITE; return fileIdx; }
void FileInfo(const char* filename) { int verify_result; int installerIdx, i, num_entries; int fileIdx, fileIdxInstaller; s_plf_file *fileHdrInstaller; s_plf_section* installerSection = 0; void* buffer; fileIdx = plf_open_file(filename); DumpPLF(fileIdx); if (fileIdx < 0) { printf("!!! plf_open_file(%s) failed: %d\n", filename, fileIdx); return; } /* Verify the file */ verify_result = plf_verify(fileIdx); if (verify_result < 0) { printf("!!! plf_verify(%s) failed: %d\n", filename, verify_result); } /* Find the installer section */ num_entries = plf_get_num_sections(fileIdx); for(i = 0; i < num_entries; ++i) { installerSection = plf_get_section_header(fileIdx, i); if (installerSection != 0 && installerSection->dwSectionType == 0x0c) break; } if (i >= num_entries || installerSection == 0) { printf("!!! unable to find installer section in %s\n", filename); goto FileInfo_exit_1; } /* Found the installer */ installerIdx = i; /* Now open the installer from RAM */ buffer = malloc(installerSection->dwSectionSize); if (!buffer) { printf("!!! unable to alloc %d bytes\n", installerSection->dwSectionSize); goto FileInfo_exit_1; } plf_get_payload_raw(fileIdx, installerIdx, buffer, 0, installerSection->dwSectionSize); fileIdxInstaller = plf_open_ram(buffer, installerSection->dwSectionSize); if (fileIdxInstaller < 0) { printf("!!! plf_open_ram for installer failed: %d\n", fileIdxInstaller); goto FileInfo_exit_2; } fileHdrInstaller = plf_get_file_header(fileIdxInstaller); printf("*** Installer found! Version: %d.%d.%d ***\n", fileHdrInstaller->dwVersionMajor, fileHdrInstaller->dwVersionMinor, fileHdrInstaller->dwVersionBugfix); FileInfo_exit_2: free(buffer); FileInfo_exit_1: plf_close(fileIdx); }