Added support for concurrent sharing of raw disk images/drives between simulators

This commit is contained in:
Mark Pizzolato 2011-10-20 11:30:44 -07:00
parent 51525f7a3f
commit 7075a3ec5c

View file

@ -1335,7 +1335,7 @@ if (strchr (openmode, 'r'))
DesiredAccess |= GENERIC_READ; DesiredAccess |= GENERIC_READ;
if (strchr (openmode, 'w') || strchr (openmode, '+')) if (strchr (openmode, 'w') || strchr (openmode, '+'))
DesiredAccess |= GENERIC_WRITE; DesiredAccess |= GENERIC_WRITE;
Handle = CreateFileA (rawdevicename, DesiredAccess, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS, NULL); Handle = CreateFileA (rawdevicename, DesiredAccess, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_RANDOM_ACCESS|FILE_FLAG_WRITE_THROUGH, NULL);
if (Handle == INVALID_HANDLE_VALUE) { if (Handle == INVALID_HANDLE_VALUE) {
_set_errno_from_status (GetLastError ()); _set_errno_from_status (GetLastError ());
return NULL; return NULL;
@ -1421,17 +1421,21 @@ static t_stat sim_os_disk_unload_raw (FILE *Disk)
{ {
#ifdef IOCTL_STORAGE_EJECT_MEDIA #ifdef IOCTL_STORAGE_EJECT_MEDIA
DWORD BytesReturned; DWORD BytesReturned;
uint32 Removable = FALSE;
if (!DeviceIoControl((HANDLE)Disk, /* handle to disk */ sim_os_disk_info_raw (Disk, NULL, &Removable);
IOCTL_STORAGE_EJECT_MEDIA, /* dwIoControlCode */ if (Removable) {
NULL, /* lpInBuffer */ if (!DeviceIoControl((HANDLE)Disk, /* handle to disk */
0, /* nInBufferSize */ IOCTL_STORAGE_EJECT_MEDIA, /* dwIoControlCode */
NULL, /* lpOutBuffer */ NULL, /* lpInBuffer */
0, /* nOutBufferSize */ 0, /* nInBufferSize */
(LPDWORD) &BytesReturned, /* number of bytes returned */ NULL, /* lpOutBuffer */
(LPOVERLAPPED) NULL)) { /* OVERLAPPED structure */ 0, /* nOutBufferSize */
_set_errno_from_status (GetLastError ()); (LPDWORD) &BytesReturned, /* number of bytes returned */
return SCPE_IOERR; (LPOVERLAPPED) NULL)) { /* OVERLAPPED structure */
_set_errno_from_status (GetLastError ());
return SCPE_IOERR;
}
} }
return SCPE_OK; return SCPE_OK;
#else #else
@ -1443,17 +1447,21 @@ static t_bool sim_os_disk_isavailable_raw (FILE *Disk)
{ {
#ifdef IOCTL_STORAGE_EJECT_MEDIA #ifdef IOCTL_STORAGE_EJECT_MEDIA
DWORD BytesReturned; DWORD BytesReturned;
uint32 Removable = FALSE;
if (!DeviceIoControl((HANDLE)Disk, /* handle to disk */ sim_os_disk_info_raw (Disk, NULL, &Removable);
IOCTL_STORAGE_CHECK_VERIFY, /* dwIoControlCode */ if (Removable) {
NULL, /* lpInBuffer */ if (!DeviceIoControl((HANDLE)Disk, /* handle to disk */
0, /* nInBufferSize */ IOCTL_STORAGE_CHECK_VERIFY, /* dwIoControlCode */
NULL, /* lpOutBuffer */ NULL, /* lpInBuffer */
0, /* nOutBufferSize */ 0, /* nInBufferSize */
(LPDWORD) &BytesReturned, /* number of bytes returned */ NULL, /* lpOutBuffer */
(LPOVERLAPPED) NULL)) { /* OVERLAPPED structure */ 0, /* nOutBufferSize */
_set_errno_from_status (GetLastError ()); (LPDWORD) &BytesReturned, /* number of bytes returned */
return FALSE; (LPOVERLAPPED) NULL)) { /* OVERLAPPED structure */
_set_errno_from_status (GetLastError ());
return FALSE;
}
} }
#endif #endif
return TRUE; return TRUE;