5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync/** @file
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * IPRT - ISO 9660 file system handling.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync/*
c7814cf6e1240a519cbec0441e033d0e2470ed00vboxsync * Copyright (C) 2010-2012 Oracle Corporation
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync *
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * available from http://www.virtualbox.org. This file is free software;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * you can redistribute it and/or modify it under the terms of the GNU
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * General Public License (GPL) as published by the Free Software
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync *
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * The contents of this file may alternatively be used under the terms
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * of the Common Development and Distribution License Version 1.0
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * VirtualBox OSE distribution, in which case the provisions of the
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * CDDL are applicable instead of those of the GPL.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync *
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * You may elect to license modified versions of this file under the
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * terms and conditions of either the GPL or the CDDL or both.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#ifndef ___iprt_isofs_h
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#define ___iprt_isofs_h
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
4a4a02cc2a09b5e3c55908c6995182c6b038e398vboxsync#include <iprt/types.h>
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#include <iprt/list.h>
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncRT_C_DECLS_BEGIN
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync/** @defgroup grp_rt_isofs RTIsoFs - ISO 9660 Filesystem
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * @ingroup grp_rt
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * @{
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#define RTISOFS_MAX_SYSTEM_ID 32
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#define RTISOFS_MAX_VOLUME_ID 32
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#define RTISOFS_MAX_PUBLISHER_ID 128
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#define RTISOFS_MAX_VOLUME_ID 32
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#define RTISOFS_MAX_VOLUMESET_ID 128
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#define RTISOFS_MAX_PREPARER_ID 128
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#define RTISOFS_MAX_APPLICATION_ID 128
185aed3c4ef2ff30c7152e65fe49d6025b368190vboxsync#define RTISOFS_MAX_STRING_LEN 255
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync/** Standard ID of volume descriptors. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#define RTISOFS_STANDARD_ID "CD001"
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync/** Default sector size. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#define RTISOFS_SECTOR_SIZE 2048
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#pragma pack(1)
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsynctypedef struct RTISOFSDATESHORT
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync{
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint8_t year;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint8_t month;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint8_t day;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint8_t hour;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint8_t minute;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint8_t second;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync int8_t gmt_offset;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync} RTISOFSDATESHORT, *PRTISOFSDATESHORT;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsynctypedef struct RTISOFSDATELONG
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync{
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync char year[4];
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync char month[2];
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync char day[2];
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync char hour[2];
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync char minute[2];
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync char second[2];
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync char hseconds[2];
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync int8_t gmt_offset;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync} RTISOFSDATELONG, *PRTISOFSDATELONG;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync/* Directory Record. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsynctypedef struct RTISOFSDIRRECORD
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync{
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync uint8_t record_length;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync uint8_t extented_attr_length;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync uint32_t extent_location;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint32_t extent_location_big;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync uint32_t extent_data_length; /* Number of bytes (file) / len (directory). */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint32_t extent_data_length_big;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync RTISOFSDATESHORT date;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync uint8_t flags;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync uint8_t interleave_unit_size;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint8_t interleave_gap_size;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync uint16_t volume_sequence_number;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint16_t volume_sequence_number_big;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync uint8_t name_len;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* Starting here there will be the actual directory entry name
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * and a padding of 1 byte if name_len is odd. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync} RTISOFSDIRRECORD, *PRTISOFSDIRRECORD;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync/* Primary Volume Descriptor. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsynctypedef struct RTISOFSPRIVOLDESC
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync{
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync uint8_t type;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync char name_id[6];
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync uint8_t version;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync char system_id[RTISOFS_MAX_SYSTEM_ID];
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync char volume_id[RTISOFS_MAX_VOLUME_ID];
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync uint8_t unused2[8];
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync uint32_t volume_space_size; /* Number of sectors, Little Endian. */
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync uint32_t volume_space_size_big; /* Number of sectors Big Endian. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint8_t unused3[32];
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync uint16_t volume_set_size;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint16_t volume_set_size_big;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint16_t volume_sequence_number;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint16_t volume_sequence_number_big;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint16_t logical_block_size; /* 2048. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint16_t logical_block_size_big;
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync uint32_t path_table_size; /* Size in bytes. */
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync uint32_t path_table_size_big; /* Size in bytes. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint32_t path_table_start_first;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint32_t path_table_start_second;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint32_t path_table_start_first_big;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint32_t path_table_start_second_big;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync RTISOFSDIRRECORD root_directory_record;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint8_t directory_padding;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync char volume_set_id[RTISOFS_MAX_VOLUMESET_ID];
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync char publisher_id[RTISOFS_MAX_PUBLISHER_ID];
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync char preparer_id[RTISOFS_MAX_PREPARER_ID];
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync char application_id[RTISOFS_MAX_APPLICATION_ID];
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync char copyright_file_id[37];
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync char abstract_file_id[37];
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync char bibliographic_file_id[37];
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync RTISOFSDATELONG creation_date;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync RTISOFSDATELONG modification_date;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync RTISOFSDATELONG expiration_date;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync RTISOFSDATELONG effective_date;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint8_t file_structure_version;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint8_t unused4[1];
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync char application_data[512];
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint8_t unused5[653];
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync} RTISOFSPRIVOLDESC, *PRTISOFSPRIVOLDESC;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsynctypedef struct RTISOFSPATHTABLEHEADER
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync{
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint8_t length;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint8_t extended_attr_sectors;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /** Sector of starting directory table. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint32_t sector_dir_table;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /** Index of parent directory (1 for the root). */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint16_t parent_index;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync /* Starting here there will be the name of the directory,
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync * specified by length above. */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync} RTISOFSPATHTABLEHEADER, *PRTISOFSPATHTABLEHEADER;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsynctypedef struct RTISOFSPATHTABLEENTRY
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync{
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync char *path;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync char *path_full;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync RTISOFSPATHTABLEHEADER header;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync RTLISTNODE Node;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync} RTISOFSPATHTABLEENTRY, *PRTISOFSPATHTABLEENTRY;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsynctypedef struct RTISOFSFILE
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync{
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync RTFILE file;
e961f5bfe1727c6816d3dad3805ebe21b6ba1c64vboxsync RTLISTANCHOR listPaths;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync RTISOFSPRIVOLDESC pvd;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync} RTISOFSFILE, *PRTISOFSFILE;
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#pragma pack()
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#ifdef IN_RING3
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync/**
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync * Opens an ISO file.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync *
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync * The following limitations apply:
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync * - Fixed sector size (2048 bytes).
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync * - No extensions (Joliet, RockRidge etc.) support (yet).
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync * - Only primary volume descriptor (PVD) handled.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync *
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync * @return IPRT status code.
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync * @param pFile Pointer to ISO handle.
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync * @param pszFileName Path to ISO file to open.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncRTR3DECL(int) RTIsoFsOpen(PRTISOFSFILE pFile, const char *pszFileName);
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync/**
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync * Closes an ISO file.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync *
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync * @param pFile Pointer to open ISO file returned by RTIsoFsOpen().
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncRTR3DECL(void) RTIsoFsClose(PRTISOFSFILE pFile);
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync/**
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync * Retrieves the offset + length (both in bytes) of a given file
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync * stored in the ISO.
ecd3f4c6194d87e9a53684b17e02ca96c7a7d1a7vboxsync * @note According to the standard, a file cannot be larger than 2^32-1 bytes.
ecd3f4c6194d87e9a53684b17e02ca96c7a7d1a7vboxsync * Therefore using size_t / uint32_t is not a problem.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync *
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync * @return IPRT status code.
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync * @param pFile Pointer to open ISO file returned by RTIsoFsOpen().
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync * @param pszPath Path of file within the ISO to retrieve information for.
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync * @param pcbOffset Pointer to store the file's absolute offset within the ISO.
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync * @param pcbLength Pointer to store the file's size.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncRTR3DECL(int) RTIsoFsGetFileInfo(PRTISOFSFILE pFile, const char *pszPath,
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync uint32_t *pcbOffset, size_t *pcbLength);
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync/**
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync * Extracts a file from an ISO to the given destination.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync *
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync * @return IPRT status code.
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync * @param pFile Pointer to open ISO file returned by RTIsoFsOpen().
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync * @param pszPath Path of file within the ISO to extract.
87f68d052aecda193e89e8f41ec147606c7f4e0bvboxsync * @param pszDest Where to store the extracted file.
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncRTR3DECL(int) RTIsoFsExtractFile(PRTISOFSFILE pFile, const char *pszSource,
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync const char *pszDest);
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync#endif /* IN_RING3 */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync/** @} */
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsyncRT_C_DECLS_END
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync
4a4a02cc2a09b5e3c55908c6995182c6b038e398vboxsync#endif
5c2e23084fe3d3163d8f441b99cfd9d2f76b6b2avboxsync