Virtual ISO: Fix Joliet path table issue that was tripping Windows up
This commit is contained in:
@@ -455,9 +455,10 @@ viso_read(void *p, uint8_t *buffer, uint64_t seek, size_t count)
|
|||||||
/* Close any existing FIFO entry's file. */
|
/* Close any existing FIFO entry's file. */
|
||||||
viso_entry_t *other_entry = viso->file_fifo[viso->file_fifo_pos];
|
viso_entry_t *other_entry = viso->file_fifo[viso->file_fifo_pos];
|
||||||
if (other_entry && other_entry->file) {
|
if (other_entry && other_entry->file) {
|
||||||
cdrom_image_viso_log("VISO: Closing [%s]\n", other_entry->path);
|
cdrom_image_viso_log("VISO: Closing [%s]", other_entry->path);
|
||||||
fclose(other_entry->file);
|
fclose(other_entry->file);
|
||||||
other_entry->file = NULL;
|
other_entry->file = NULL;
|
||||||
|
cdrom_image_viso_log("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Open file. */
|
/* Open file. */
|
||||||
@@ -879,7 +880,7 @@ next_dir:
|
|||||||
if (dir == &viso->root_dir) /* directory ID length */
|
if (dir == &viso->root_dir) /* directory ID length */
|
||||||
data[0] = 1;
|
data[0] = 1;
|
||||||
else if (i & 2)
|
else if (i & 2)
|
||||||
data[0] = dir->name_joliet_len;
|
data[0] = dir->name_joliet_len * sizeof(dir->name_joliet[0]);
|
||||||
else
|
else
|
||||||
data[0] = strlen(dir->name_short);
|
data[0] = strlen(dir->name_short);
|
||||||
|
|
||||||
@@ -890,11 +891,13 @@ next_dir:
|
|||||||
else
|
else
|
||||||
*((uint16_t *) &data[6]) = cpu_to_le16(dir->parent->pt_idx);
|
*((uint16_t *) &data[6]) = cpu_to_le16(dir->parent->pt_idx);
|
||||||
|
|
||||||
if (i & 2) /* directory ID */
|
if (dir == &viso->root_dir) /* directory ID */
|
||||||
|
data[8] = 0;
|
||||||
|
else if (i & 2)
|
||||||
memcpy(&data[8], dir->name_joliet, data[0]);
|
memcpy(&data[8], dir->name_joliet, data[0]);
|
||||||
else
|
else
|
||||||
memcpy(&data[8], dir->name_short, data[0]);
|
memcpy(&data[8], dir->name_short, data[0]);
|
||||||
data[data[0] + 8] = 0; /* padding for odd directory ID lengths */
|
data[8 + data[0]] = 0; /* padding for odd directory ID lengths */
|
||||||
|
|
||||||
/* Write path table entry. */
|
/* Write path table entry. */
|
||||||
fwrite(data, 8 + data[0] + (data[0] & 1), 1, viso->tf.file);
|
fwrite(data, 8 + data[0] + (data[0] & 1), 1, viso->tf.file);
|
||||||
@@ -1048,7 +1051,7 @@ next_dir:
|
|||||||
for (int i = 0; i < (sizeof(entry->dr_offsets) / sizeof(entry->dr_offsets[0])); i++)
|
for (int i = 0; i < (sizeof(entry->dr_offsets) / sizeof(entry->dr_offsets[0])); i++)
|
||||||
viso_pwrite(data, entry->dr_offsets[i] + 2, 8, 1, viso->tf.file);
|
viso_pwrite(data, entry->dr_offsets[i] + 2, 8, 1, viso->tf.file);
|
||||||
|
|
||||||
/* Set this file's starting offset. This overwrites dr_offsets in the union. */
|
/* Save this file's starting offset. This overwrites dr_offsets in the union. */
|
||||||
entry->data_offset = ((uint64_t) viso->all_sectors) * viso->sector_size;
|
entry->data_offset = ((uint64_t) viso->all_sectors) * viso->sector_size;
|
||||||
|
|
||||||
/* Determine how many sectors this file will take. */
|
/* Determine how many sectors this file will take. */
|
||||||
|
|||||||
Reference in New Issue
Block a user