Skip to content

Commit

Permalink
Merge pull request #56 from rakslice/win_cdrom
Browse files Browse the repository at this point in the history
Fix for autodetected physical cdroms in Windows
  • Loading branch information
kanjitalk755 authored Sep 22, 2020
2 parents 4e98699 + 37b36ef commit 9708089
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 22 deletions.
47 changes: 34 additions & 13 deletions BasiliskII/src/Windows/sys_windows.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand Down
17 changes: 8 additions & 9 deletions BasiliskII/src/cdrom.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 9708089

Please sign in to comment.