From 37b36ef33202cae3afbdd864b2cf29f7e6fe4d3c Mon Sep 17 00:00:00 2001 From: rakslice Date: Mon, 21 Sep 2020 20:33:26 -0700 Subject: [PATCH] actually use dynamically detected cdroms; if read via cdenable doesn't work use the logical drive handle instead --- BasiliskII/src/Windows/sys_windows.cpp | 47 +++++++++++++++++++------- BasiliskII/src/cdrom.cpp | 17 +++++----- 2 files changed, 42 insertions(+), 22 deletions(-) diff --git a/BasiliskII/src/Windows/sys_windows.cpp b/BasiliskII/src/Windows/sys_windows.cpp index 8e876307..264ee366 100755 --- a/BasiliskII/src/Windows/sys_windows.cpp +++ b/BasiliskII/src/Windows/sys_windows.cpp @@ -84,7 +84,7 @@ static char *sector_buffer = NULL; // Prototypes static bool is_cdrom_readable(file_handle *fh); - +static DWORD file_offset_read(HANDLE fh, loff_t offset, int count, char *buf); /* * Initialization @@ -266,12 +266,42 @@ void SysAddSerialPrefs(void) * Can't give too much however, would be annoying, this is difficult.. */ -static inline int cd_read_with_retry(file_handle *fh, ULONG LBA, int count, char *buf ) +static inline int cd_read_with_retry(file_handle *fh, ULONG offset, int count, char *buf ) { if (!fh || !fh->fh) return 0; - return CdenableSysReadCdBytes(fh->fh, LBA, count, buf); + DWORD bytes_read = CdenableSysReadCdBytes(fh->fh, offset, count, buf); + + if (bytes_read == 0) { + // fall back to logical volume handle read in the case where there's no cdenable + bytes_read = file_offset_read(fh->fh, offset, count, buf); + } + + return bytes_read; +} + +/* + * Generic offset read function for a file or a device that behaves like one + */ + +static DWORD file_offset_read(HANDLE fh, loff_t offset, int count, char *buf) +{ + // Seek to position + LONG lo = (LONG)offset; + LONG hi = (LONG)(offset >> 32); + DWORD r = SetFilePointer(fh, lo, &hi, FILE_BEGIN); + if (r == INVALID_SET_FILE_POINTER && GetLastError() != NO_ERROR) { + return 0; + } + + DWORD bytes_read; + + // Read data + if (ReadFile(fh, buf, count, &bytes_read, NULL) == 0) + bytes_read = 0; + + return bytes_read; } static int cd_read(file_handle *fh, cachetype *cptr, ULONG LBA, int count, char *buf) @@ -581,16 +611,7 @@ size_t Sys_read(void *arg, void *buffer, loff_t offset, size_t length) DWORD bytes_read = 0; if (fh->is_file) { - // Seek to position - LONG lo = (LONG)offset; - LONG hi = (LONG)(offset >> 32); - DWORD r = SetFilePointer(fh->fh, lo, &hi, FILE_BEGIN); - if (r == INVALID_SET_FILE_POINTER && GetLastError() != NO_ERROR) - return 0; - - // Read data - if (ReadFile(fh->fh, buffer, length, &bytes_read, NULL) == 0) - bytes_read = 0; + bytes_read = file_offset_read(fh->fh, offset, length, (char *)buffer); } else if (fh->is_cdrom) { int bytes_left, try_bytes, got_bytes; diff --git a/BasiliskII/src/cdrom.cpp b/BasiliskII/src/cdrom.cpp index ee8d2350..ce2a398a 100644 --- a/BasiliskII/src/cdrom.cpp +++ b/BasiliskII/src/cdrom.cpp @@ -303,15 +303,14 @@ void CDROMInit(void) if (PrefsFindString("cdrom", 0) == NULL) { SysAddCDROMPrefs(); } - else { - // Add drives specified in preferences - int index = 0; - const char *str; - while ((str = PrefsFindString("cdrom", index++)) != NULL) { - void *fh = Sys_open(str, true); - if (fh) - drives.push_back(cdrom_drive_info(fh)); - } + + // Add drives specified in preferences + int index = 0; + const char *str; + while ((str = PrefsFindString("cdrom", index++)) != NULL) { + void *fh = Sys_open(str, true); + if (fh) + drives.push_back(cdrom_drive_info(fh)); } if (!drives.empty()) { // set to first drive by default