Changeset 64278 in vbox
- Timestamp:
- Oct 14, 2016 12:17:45 PM (8 years ago)
- svn:sync-xref-src-repo-rev:
- 111291
- Location:
- trunk/src/VBox/Devices/Storage
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Storage/DrvHostBase-darwin.cpp
r64258 r64278 209 209 210 210 211 DECLHIDDEN(int) drvHostBaseDoLockOs(PDRVHOSTBASE pThis, bool fLock) 212 { 213 uint8_t abCmd[16] = 214 { 215 SCSI_PREVENT_ALLOW_MEDIUM_REMOVAL, 0, 0, 0, fLock, 0, 216 0,0,0,0,0,0,0,0,0,0 217 }; 218 return drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, NULL, 0, 0); 219 } 220 221 222 DECLHIDDEN(int) drvHostBaseEjectOs(PDRVHOSTBASE pThis) 223 { 224 uint8_t abCmd[16] = 225 { 226 SCSI_START_STOP_UNIT, 0, 0, 0, 2 /*eject+stop*/, 0, 227 0,0,0,0,0,0,0,0,0,0 228 }; 229 return drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, NULL, 0, 0); 230 } 231 232 233 DECLHIDDEN(int) drvHostBaseQueryMediaStatusOs(PDRVHOSTBASE pThis, bool *pfMediaChanged, bool *pfMediaPresent) 234 { 235 AssertReturn(pThis->ppScsiTaskDI, VERR_INTERNAL_ERROR); 236 237 /* 238 * Issue a TEST UNIT READY request. 239 */ 240 *pfMediaChanged = false; 241 *pfMediaPresent = false; 242 uint8_t abCmd[16] = { SCSI_TEST_UNIT_READY, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; 243 uint8_t abSense[32]; 244 int rc = drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, abSense, sizeof(abSense), 0); 245 if (RT_SUCCESS(rc)) 246 *pfMediaPresent = true; 247 else if ( rc == VERR_UNRESOLVED_ERROR 248 && abSense[2] == 6 /* unit attention */ 249 && ( (abSense[12] == 0x29 && abSense[13] < 5 /* reset */) 250 || (abSense[12] == 0x2a && abSense[13] == 0 /* parameters changed */) //??? 251 || (abSense[12] == 0x3f && abSense[13] == 0 /* target operating conditions have changed */) //??? 252 || (abSense[12] == 0x3f && abSense[13] == 2 /* changed operating definition */) //??? 253 || (abSense[12] == 0x3f && abSense[13] == 3 /* inquiry parameters changed */) 254 || (abSense[12] == 0x3f && abSense[13] == 5 /* device identifier changed */) 255 ) 256 ) 257 { 258 *pfMediaPresent = false; 259 *pfMediaChanged = true; 260 rc = VINF_SUCCESS; 261 /** @todo check this media change stuff on Darwin. */ 262 } 263 264 return rc; 265 } 266 267 211 268 DECLHIDDEN(int) drvHostBasePollerWakeupOs(PDRVHOSTBASE pThis) 212 269 { -
trunk/src/VBox/Devices/Storage/DrvHostBase-freebsd.cpp
r64252 r64278 209 209 210 210 211 DECLHIDDEN(int) drvHostBaseDoLockOs(PDRVHOSTBASE pThis, bool fLock) 212 { 213 uint8_t abCmd[16] = 214 { 215 SCSI_PREVENT_ALLOW_MEDIUM_REMOVAL, 0, 0, 0, fLock, 0, 216 0,0,0,0,0,0,0,0,0,0 217 }; 218 return drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, NULL, 0, 0); 219 } 220 221 222 DECLHIDDEN(int) drvHostBaseEjectOs(PDRVHOSTBASE pThis) 223 { 224 uint8_t abCmd[16] = 225 { 226 SCSI_START_STOP_UNIT, 0, 0, 0, 2 /*eject+stop*/, 0, 227 0,0,0,0,0,0,0,0,0,0 228 }; 229 return drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, NULL, 0, 0); 230 } 231 232 233 DECLHIDDEN(int) drvHostBaseQueryMediaStatusOs(PDRVHOSTBASE pThis, bool *pfMediaChanged, bool *pfMediaPresent) 234 { 235 /* 236 * Issue a TEST UNIT READY request. 237 */ 238 *pfMediaChanged = false; 239 *pfMediaPresent = false; 240 uint8_t abCmd[16] = { SCSI_TEST_UNIT_READY, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; 241 uint8_t abSense[32]; 242 int rc = drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, abSense, sizeof(abSense), 0); 243 if (RT_SUCCESS(rc)) 244 *pfMediaPresent = true; 245 else if ( rc == VERR_UNRESOLVED_ERROR 246 && abSense[2] == 6 /* unit attention */ 247 && ( (abSense[12] == 0x29 && abSense[13] < 5 /* reset */) 248 || (abSense[12] == 0x2a && abSense[13] == 0 /* parameters changed */) //??? 249 || (abSense[12] == 0x3f && abSense[13] == 0 /* target operating conditions have changed */) //??? 250 || (abSense[12] == 0x3f && abSense[13] == 2 /* changed operating definition */) //??? 251 || (abSense[12] == 0x3f && abSense[13] == 3 /* inquiry parameters changed */) 252 || (abSense[12] == 0x3f && abSense[13] == 5 /* device identifier changed */) 253 ) 254 ) 255 { 256 *pfMediaPresent = false; 257 *pfMediaChanged = true; 258 rc = VINF_SUCCESS; 259 /** @todo check this media change stuff on Darwin. */ 260 } 261 262 return rc; 263 } 264 265 211 266 DECLHIDDEN(int) drvHostBasePollerWakeupOs(PDRVHOSTBASE pThis) 212 267 { -
trunk/src/VBox/Devices/Storage/DrvHostBase-linux.cpp
r64252 r64278 182 182 183 183 184 DECLHIDDEN(int) drvHostBaseDoLockOs(PDRVHOSTBASE pThis, bool fLock) 185 { 186 int rc = ioctl(RTFileToNative(pThis->hFileDevice), CDROM_LOCKDOOR, (int)fLock); 187 if (rc < 0) 188 { 189 if (errno == EBUSY) 190 rc = VERR_ACCESS_DENIED; 191 else if (errno == EDRIVE_CANT_DO_THIS) 192 rc = VERR_NOT_SUPPORTED; 193 else 194 rc = RTErrConvertFromErrno(errno); 195 } 196 197 return rc; 198 } 199 200 201 DECLHIDDEN(int) drvHostBaseEjectOs(PDRVHOSTBASE pThis) 202 { 203 int rc = ioctl(RTFileToNative(pThis->hFileDevice), CDROMEJECT, 0); 204 if (rc < 0) 205 { 206 if (errno == EBUSY) 207 rc = VERR_PDM_MEDIA_LOCKED; 208 else if (errno == ENOSYS) 209 rc = VERR_NOT_SUPPORTED; 210 else 211 rc = RTErrConvertFromErrno(errno); 212 } 213 214 return rc; 215 } 216 217 218 DECLHIDDEN(int) drvHostBaseQueryMediaStatusOs(PDRVHOSTBASE pThis, bool *pfMediaChanged, bool *pfMediaPresent) 219 { 220 *pfMediaPresent = ioctl(RTFileToNative(pThis->hFileDevice), CDROM_DRIVE_STATUS, CDSL_CURRENT) == CDS_DISC_OK; 221 *pfMediaChanged = false; 222 if (pThis->fMediaPresent != *pfMediaPresent) 223 *pfMediaChanged = ioctl(RTFileToNative(pThis->hFileDevice), CDROM_MEDIA_CHANGED, CDSL_CURRENT) == 1; 224 225 return VINF_SUCCESS; 226 } 227 228 184 229 DECLHIDDEN(int) drvHostBasePollerWakeupOs(PDRVHOSTBASE pThis) 185 230 { -
trunk/src/VBox/Devices/Storage/DrvHostBase-solaris.cpp
r64252 r64278 202 202 203 203 204 DECLHIDDEN(int) drvHostBaseDoLockOs(PDRVHOSTBASE pThis, bool fLock) 205 { 206 int rc = ioctl(RTFileToNative(pThis->hFileRawDevice), fLock ? DKIOCLOCK : DKIOCUNLOCK, 0); 207 if (rc < 0) 208 { 209 if (errno == EBUSY) 210 rc = VERR_ACCESS_DENIED; 211 else if (errno == ENOTSUP || errno == ENOSYS) 212 rc = VERR_NOT_SUPPORTED; 213 else 214 rc = RTErrConvertFromErrno(errno); 215 } 216 217 return rc; 218 } 219 220 221 DECLHIDDEN(int) drvHostBaseEjectOs(PDRVHOSTBASE pThis) 222 { 223 int rc = ioctl(RTFileToNative(pThis->hFileRawDevice), DKIOCEJECT, 0); 224 if (rc < 0) 225 { 226 if (errno == EBUSY) 227 rc = VERR_PDM_MEDIA_LOCKED; 228 else if (errno == ENOSYS || errno == ENOTSUP) 229 rc = VERR_NOT_SUPPORTED; 230 else if (errno == ENODEV) 231 rc = VERR_PDM_MEDIA_NOT_MOUNTED; 232 else 233 rc = RTErrConvertFromErrno(errno); 234 } 235 236 return rc; 237 } 238 239 240 DECLHIDDEN(int) drvHostBaseQueryMediaStatusOs(PDRVHOSTBASE pThis, bool *pfMediaChanged, bool *pfMediaPresent) 241 { 242 *pfMediaPresent = false; 243 *pfMediaChanged = false; 244 245 /* Need to pass the previous state and DKIO_NONE for the first time. */ 246 static dkio_state s_DeviceState = DKIO_NONE; 247 dkio_state PreviousState = s_DeviceState; 248 int rc = ioctl(RTFileToNative(pThis->hFileRawDevice), DKIOCSTATE, &s_DeviceState); 249 if (rc == 0) 250 { 251 *pfMediaPresent = (s_DeviceState == DKIO_INSERTED); 252 if (PreviousState != s_DeviceState) 253 *pfMediaChanged = true; 254 } 255 256 return VINF_SUCCESS; 257 } 258 259 204 260 DECLHIDDEN(int) drvHostBasePollerWakeupOs(PDRVHOSTBASE pThis) 205 261 { -
trunk/src/VBox/Devices/Storage/DrvHostBase-win.cpp
r64253 r64278 240 240 241 241 242 DECLHIDDEN(int) drvHostBaseDoLockOs(PDRVHOSTBASE pThis, bool fLock) 243 { 244 PREVENT_MEDIA_REMOVAL PreventMediaRemoval = {fLock}; 245 DWORD cbReturned; 246 int rc; 247 if (DeviceIoControl((HANDLE)RTFileToNative(pThis->hFileDevice), IOCTL_STORAGE_MEDIA_REMOVAL, 248 &PreventMediaRemoval, sizeof(PreventMediaRemoval), 249 NULL, 0, &cbReturned, 250 NULL)) 251 rc = VINF_SUCCESS; 252 else 253 /** @todo figure out the return codes for already locked. */ 254 rc = RTErrConvertFromWin32(GetLastError()); 255 256 return rc; 257 } 258 259 260 DECLHIDDEN(int) drvHostBaseEjectOs(PDRVHOSTBASE pThis) 261 { 262 int rc = VINF_SUCCESS; 263 RTFILE hFileDevice = pThis->hFileDevice; 264 if (hFileDevice == NIL_RTFILE) /* obsolete crap */ 265 rc = RTFileOpen(&hFileDevice, pThis->pszDeviceOpen, RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_NONE); 266 if (RT_SUCCESS(rc)) 267 { 268 /* do ioctl */ 269 DWORD cbReturned; 270 if (DeviceIoControl((HANDLE)RTFileToNative(hFileDevice), IOCTL_STORAGE_EJECT_MEDIA, 271 NULL, 0, 272 NULL, 0, &cbReturned, 273 NULL)) 274 rc = VINF_SUCCESS; 275 else 276 rc = RTErrConvertFromWin32(GetLastError()); 277 278 /* clean up handle */ 279 if (hFileDevice != pThis->hFileDevice) 280 RTFileClose(hFileDevice); 281 } 282 else 283 AssertMsgFailed(("Failed to open '%s' for ejecting this tray.\n", rc)); 284 285 return rc; 286 } 287 288 242 289 DECLHIDDEN(int) drvHostBasePollerWakeupOs(PDRVHOSTBASE pThis) 243 290 { -
trunk/src/VBox/Devices/Storage/DrvHostBase.cpp
r64274 r64278 1434 1434 * @returns VBox status code. 1435 1435 * @param pDrvIns Driver instance. 1436 * @param pszCfgValid Pointer to a string ofvalid CFGM options. 1436 1437 * @param pCfg Configuration handle. 1437 1438 * @param enmType Device type. 1438 1439 */ 1439 int DRVHostBaseInitData(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, PDMMEDIATYPE enmType)1440 int DRVHostBaseInitData(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, const char *pszCfgValid, PDMMEDIATYPE enmType) 1440 1441 { 1441 1442 PDRVHOSTBASE pThis = PDMINS_2_DATA(pDrvIns, PDRVHOSTBASE); … … 1491 1492 pThis->IMount.pfnUnlock = drvHostBaseUnlock; 1492 1493 pThis->IMount.pfnIsLocked = drvHostBaseIsLocked; 1494 1495 if (!CFGMR3AreValuesValid(pCfg, pszCfgValid)) 1496 { 1497 pThis->fAttachFailError = true; 1498 return VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES; 1499 } 1493 1500 1494 1501 /* -
trunk/src/VBox/Devices/Storage/DrvHostBase.h
r64252 r64278 185 185 186 186 187 int DRVHostBaseInitData(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, PDMMEDIATYPE enmType);187 int DRVHostBaseInitData(PPDMDRVINS pDrvIns, PCFGMNODE pCfg, const char *pszCfgValid, PDMMEDIATYPE enmType); 188 188 int DRVHostBaseInitFinish(PDRVHOSTBASE pThis); 189 189 int DRVHostBaseMediaPresent(PDRVHOSTBASE pThis); … … 197 197 DECLHIDDEN(int) drvHostBaseWriteOs(PDRVHOSTBASE pThis, uint64_t off, const void *pvBuf, size_t cbWrite); 198 198 DECLHIDDEN(int) drvHostBaseFlushOs(PDRVHOSTBASE pThis); 199 199 DECLHIDDEN(int) drvHostBaseDoLockOs(PDRVHOSTBASE pThis, bool fLock); 200 DECLHIDDEN(int) drvHostBaseEjectOs(PDRVHOSTBASE pThis); 201 202 DECLHIDDEN(int) drvHostBaseQueryMediaStatusOs(PDRVHOSTBASE pThis, bool *pfMediaChanged, bool *pfMediaPresent); 200 203 DECLHIDDEN(int) drvHostBasePollerWakeupOs(PDRVHOSTBASE pThis); 201 204 DECLHIDDEN(void) drvHostBaseDestructOs(PDRVHOSTBASE pThis); -
trunk/src/VBox/Devices/Storage/DrvHostDVD.cpp
r64252 r64278 152 152 /* Unlock drive if necessary. */ 153 153 if (pThis->fLocked) 154 drvHost DvdDoLock(pThis, false);154 drvHostBaseDoLockOs(pThis, false); 155 155 156 156 if (fEject) … … 159 159 * Eject the disc. 160 160 */ 161 #if defined(RT_OS_DARWIN) || defined(RT_OS_FREEBSD) 162 uint8_t abCmd[16] = 163 { 164 SCSI_START_STOP_UNIT, 0, 0, 0, 2 /*eject+stop*/, 0, 165 0,0,0,0,0,0,0,0,0,0 166 }; 167 rc = drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, NULL, 0, 0); 168 169 #elif defined(RT_OS_LINUX) 170 rc = ioctl(RTFileToNative(pThis->hFileDevice), CDROMEJECT, 0); 171 if (rc < 0) 172 { 173 if (errno == EBUSY) 174 rc = VERR_PDM_MEDIA_LOCKED; 175 else if (errno == ENOSYS) 176 rc = VERR_NOT_SUPPORTED; 177 else 178 rc = RTErrConvertFromErrno(errno); 179 } 180 181 #elif defined(RT_OS_SOLARIS) 182 rc = ioctl(RTFileToNative(pThis->hFileRawDevice), DKIOCEJECT, 0); 183 if (rc < 0) 184 { 185 if (errno == EBUSY) 186 rc = VERR_PDM_MEDIA_LOCKED; 187 else if (errno == ENOSYS || errno == ENOTSUP) 188 rc = VERR_NOT_SUPPORTED; 189 else if (errno == ENODEV) 190 rc = VERR_PDM_MEDIA_NOT_MOUNTED; 191 else 192 rc = RTErrConvertFromErrno(errno); 193 } 194 195 #elif defined(RT_OS_WINDOWS) 196 RTFILE hFileDevice = pThis->hFileDevice; 197 if (hFileDevice == NIL_RTFILE) /* obsolete crap */ 198 rc = RTFileOpen(&hFileDevice, pThis->pszDeviceOpen, RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_NONE); 199 if (RT_SUCCESS(rc)) 200 { 201 /* do ioctl */ 202 DWORD cbReturned; 203 if (DeviceIoControl((HANDLE)RTFileToNative(hFileDevice), IOCTL_STORAGE_EJECT_MEDIA, 204 NULL, 0, 205 NULL, 0, &cbReturned, 206 NULL)) 207 rc = VINF_SUCCESS; 208 else 209 rc = RTErrConvertFromWin32(GetLastError()); 210 211 /* clean up handle */ 212 if (hFileDevice != pThis->hFileDevice) 213 RTFileClose(hFileDevice); 214 } 215 else 216 AssertMsgFailed(("Failed to open '%s' for ejecting this tray.\n", rc)); 217 218 219 #else 220 AssertMsgFailed(("Eject is not implemented!\n")); 221 rc = VINF_SUCCESS; 222 #endif 161 rc = drvHostBaseEjectOs(pThis); 223 162 } 224 163 … … 249 188 static DECLCALLBACK(int) drvHostDvdDoLock(PDRVHOSTBASE pThis, bool fLock) 250 189 { 251 #if defined(RT_OS_DARWIN) || defined(RT_OS_FREEBSD) 252 uint8_t abCmd[16] = 253 { 254 SCSI_PREVENT_ALLOW_MEDIUM_REMOVAL, 0, 0, 0, fLock, 0, 255 0,0,0,0,0,0,0,0,0,0 256 }; 257 int rc = drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, NULL, 0, 0); 258 259 #elif defined(RT_OS_LINUX) 260 int rc = ioctl(RTFileToNative(pThis->hFileDevice), CDROM_LOCKDOOR, (int)fLock); 261 if (rc < 0) 262 { 263 if (errno == EBUSY) 264 rc = VERR_ACCESS_DENIED; 265 else if (errno == EDRIVE_CANT_DO_THIS) 266 rc = VERR_NOT_SUPPORTED; 267 else 268 rc = RTErrConvertFromErrno(errno); 269 } 270 271 #elif defined(RT_OS_SOLARIS) 272 int rc = ioctl(RTFileToNative(pThis->hFileRawDevice), fLock ? DKIOCLOCK : DKIOCUNLOCK, 0); 273 if (rc < 0) 274 { 275 if (errno == EBUSY) 276 rc = VERR_ACCESS_DENIED; 277 else if (errno == ENOTSUP || errno == ENOSYS) 278 rc = VERR_NOT_SUPPORTED; 279 else 280 rc = RTErrConvertFromErrno(errno); 281 } 282 283 #elif defined(RT_OS_WINDOWS) 284 285 PREVENT_MEDIA_REMOVAL PreventMediaRemoval = {fLock}; 286 DWORD cbReturned; 287 int rc; 288 if (DeviceIoControl((HANDLE)RTFileToNative(pThis->hFileDevice), IOCTL_STORAGE_MEDIA_REMOVAL, 289 &PreventMediaRemoval, sizeof(PreventMediaRemoval), 290 NULL, 0, &cbReturned, 291 NULL)) 292 rc = VINF_SUCCESS; 293 else 294 /** @todo figure out the return codes for already locked. */ 295 rc = RTErrConvertFromWin32(GetLastError()); 296 297 #else 298 AssertMsgFailed(("Lock/Unlock is not implemented!\n")); 299 int rc = VINF_SUCCESS; 300 301 #endif 190 int rc = drvHostBaseDoLockOs(pThis, fLock); 302 191 303 192 LogFlow(("drvHostDvdDoLock(, fLock=%RTbool): returns %Rrc\n", fLock, rc)); … … 315 204 * Poll for media change. 316 205 */ 317 #if defined(RT_OS_DARWIN) || defined(RT_OS_FREEBSD)318 #ifdef RT_OS_DARWIN319 AssertReturn(pThis->ppScsiTaskDI, VERR_INTERNAL_ERROR);320 #endif321 322 /*323 * Issue a TEST UNIT READY request.324 */325 bool fMediaChanged = false;326 bool fMediaPresent = false;327 uint8_t abCmd[16] = { SCSI_TEST_UNIT_READY, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };328 uint8_t abSense[32];329 int rc2 = drvHostBaseScsiCmdOs(pThis, abCmd, 6, PDMMEDIATXDIR_NONE, NULL, NULL, abSense, sizeof(abSense), 0);330 if (RT_SUCCESS(rc2))331 fMediaPresent = true;332 else if ( rc2 == VERR_UNRESOLVED_ERROR333 && abSense[2] == 6 /* unit attention */334 && ( (abSense[12] == 0x29 && abSense[13] < 5 /* reset */)335 || (abSense[12] == 0x2a && abSense[13] == 0 /* parameters changed */) //???336 || (abSense[12] == 0x3f && abSense[13] == 0 /* target operating conditions have changed */) //???337 || (abSense[12] == 0x3f && abSense[13] == 2 /* changed operating definition */) //???338 || (abSense[12] == 0x3f && abSense[13] == 3 /* inquiry parameters changed */)339 || (abSense[12] == 0x3f && abSense[13] == 5 /* device identifier changed */)340 )341 )342 {343 fMediaPresent = false;344 fMediaChanged = true;345 /** @todo check this media change stuff on Darwin. */346 }347 348 #elif defined(RT_OS_LINUX)349 bool fMediaPresent = ioctl(RTFileToNative(pThis->hFileDevice), CDROM_DRIVE_STATUS, CDSL_CURRENT) == CDS_DISC_OK;350 bool fMediaChanged = false;351 if (pThis->fMediaPresent != fMediaPresent)352 fMediaChanged = ioctl(RTFileToNative(pThis->hFileDevice), CDROM_MEDIA_CHANGED, CDSL_CURRENT) == 1;353 354 #elif defined(RT_OS_SOLARIS)355 206 bool fMediaPresent = false; 356 207 bool fMediaChanged = false; 357 358 /* Need to pass the previous state and DKIO_NONE for the first time. */ 359 static dkio_state s_DeviceState = DKIO_NONE; 360 dkio_state PreviousState = s_DeviceState; 361 int rc2 = ioctl(RTFileToNative(pThis->hFileRawDevice), DKIOCSTATE, &s_DeviceState); 362 if (rc2 == 0) 363 { 364 fMediaPresent = (s_DeviceState == DKIO_INSERTED); 365 if (PreviousState != s_DeviceState) 366 fMediaChanged = true; 367 } 368 369 #else 370 # error "Unsupported platform." 371 #endif 208 drvHostBaseQueryMediaStatusOs(pThis, &fMediaChanged, &fMediaPresent); 372 209 373 210 RTCritSectEnter(&pThis->CritSect); … … 460 297 * Init instance data. 461 298 */ 462 int rc = DRVHostBaseInitData(pDrvIns, pCfg, PDMMEDIATYPE_DVD); 299 int rc = DRVHostBaseInitData(pDrvIns, pCfg, "Path\0Interval\0Locked\0BIOSVisible\0AttachFailError\0Passthrough\0", 300 PDMMEDIATYPE_DVD); 463 301 if (RT_SUCCESS(rc)) 464 302 { 465 303 /* 466 * Validate configuration.304 * Override stuff. 467 305 */ 468 if (CFGMR3AreValuesValid(pCfg, "Path\0Interval\0Locked\0BIOSVisible\0AttachFailError\0Passthrough\0")) 306 #ifdef RT_OS_LINUX 307 pThis->pbDoubleBuffer = (uint8_t *)RTMemAlloc(SCSI_MAX_BUFFER_SIZE); 308 if (!pThis->pbDoubleBuffer) 309 return VERR_NO_MEMORY; 310 #endif 311 312 bool fPassthrough; 313 rc = CFGMR3QueryBool(pCfg, "Passthrough", &fPassthrough); 314 if (RT_SUCCESS(rc) && fPassthrough) 469 315 { 470 /* 471 * Override stuff. 472 */ 473 #ifdef RT_OS_LINUX 474 pThis->pbDoubleBuffer = (uint8_t *)RTMemAlloc(SCSI_MAX_BUFFER_SIZE); 475 if (!pThis->pbDoubleBuffer) 476 return VERR_NO_MEMORY; 316 pThis->IMedia.pfnSendCmd = drvHostDvdSendCmd; 317 /* Passthrough requires opening the device in R/W mode. */ 318 pThis->fReadOnlyConfig = false; 319 #ifdef VBOX_WITH_SUID_WRAPPER /* Solaris setuid for Passthrough mode. */ 320 rc = solarisCheckUserAuth(); 321 if (RT_FAILURE(rc)) 322 { 323 Log(("DVD: solarisCheckUserAuth failed. Permission denied!\n")); 324 return rc; 325 } 326 #endif /* VBOX_WITH_SUID_WRAPPER */ 327 } 328 329 pThis->IMount.pfnUnmount = drvHostDvdUnmount; 330 pThis->pfnDoLock = drvHostDvdDoLock; 331 #ifdef USE_MEDIA_POLLING 332 if (!fPassthrough) 333 pThis->pfnPoll = drvHostDvdPoll; 334 else 335 pThis->pfnPoll = NULL; 477 336 #endif 478 337 479 bool fPassthrough; 480 rc = CFGMR3QueryBool(pCfg, "Passthrough", &fPassthrough); 481 if (RT_SUCCESS(rc) && fPassthrough) 482 { 483 pThis->IMedia.pfnSendCmd = drvHostDvdSendCmd; 484 /* Passthrough requires opening the device in R/W mode. */ 485 pThis->fReadOnlyConfig = false; 486 #ifdef VBOX_WITH_SUID_WRAPPER /* Solaris setuid for Passthrough mode. */ 487 rc = solarisCheckUserAuth(); 488 if (RT_FAILURE(rc)) 489 { 490 Log(("DVD: solarisCheckUserAuth failed. Permission denied!\n")); 491 return rc; 492 } 493 #endif /* VBOX_WITH_SUID_WRAPPER */ 494 } 495 496 pThis->IMount.pfnUnmount = drvHostDvdUnmount; 497 pThis->pfnDoLock = drvHostDvdDoLock; 498 #ifdef USE_MEDIA_POLLING 499 if (!fPassthrough) 500 pThis->pfnPoll = drvHostDvdPoll; 501 else 502 pThis->pfnPoll = NULL; 503 #endif 504 505 /* 506 * 2nd init part. 507 */ 508 rc = DRVHostBaseInitFinish(pThis); 509 } 510 else 511 { 512 pThis->fAttachFailError = true; 513 rc = VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES; 514 } 338 /* 339 * 2nd init part. 340 */ 341 rc = DRVHostBaseInitFinish(pThis); 515 342 } 516 343 if (RT_FAILURE(rc)) -
trunk/src/VBox/Devices/Storage/DrvHostFloppy.cpp
r64249 r64278 116 116 * Init instance data. 117 117 */ 118 int rc = DRVHostBaseInitData(pDrvIns, pCfg, PDMMEDIATYPE_FLOPPY_1_44); 118 int rc = DRVHostBaseInitData(pDrvIns, pCfg, "Path\0ReadOnly\0Interval\0Locked\0BIOSVisible\0", 119 PDMMEDIATYPE_FLOPPY_1_44); 119 120 if (RT_SUCCESS(rc)) 120 121 { 121 122 /* 122 * Validate configuration.123 * Override stuff. 123 124 */ 124 if (CFGMR3AreValuesValid(pCfg, "Path\0ReadOnly\0Interval\0Locked\0BIOSVisible\0"))125 {126 /*127 * Override stuff.128 */129 125 #ifdef RT_OS_LINUX 130 126 pThis->Base.pfnPoll = drvHostFloppyPoll; 131 127 #endif 132 128 133 /* 134 * 2nd init part. 135 */ 136 rc = DRVHostBaseInitFinish(&pThis->Base); 137 } 138 else 139 { 140 pThis->Base.fAttachFailError = true; 141 rc = VERR_PDM_DRVINS_UNKNOWN_CFG_VALUES; 142 } 129 /* 130 * 2nd init part. 131 */ 132 rc = DRVHostBaseInitFinish(&pThis->Base); 143 133 } 134 144 135 if (RT_FAILURE(rc)) 145 136 {
Note:
See TracChangeset
for help on using the changeset viewer.