Exemple #1
0
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);
}
Exemple #2
0
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;
}
Exemple #3
0
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;
}
Exemple #4
0
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);

}