Changeset 64002 in vbox for trunk/src/VBox/Devices/Samples
- Timestamp:
- Sep 26, 2016 11:40:57 AM (9 years ago)
- svn:sync-xref-src-repo-rev:
- 110910
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Samples/DrvStorageFilter.cpp
r63886 r64002 41 41 PDMIMEDIA IMedia; 42 42 PDMIMEDIAPORT IMediaPort; 43 PDMIMEDIA ASYNC IMediaAsync;44 PDMIMEDIA ASYNCPORT IMediaAsyncPort;43 PDMIMEDIAEX IMediaEx; 44 PDMIMEDIAEXPORT IMediaExPort; 45 45 /** @} */ 46 46 … … 48 48 * @{ */ 49 49 PPDMIMEDIA pIMediaBelow; 50 PPDMIMEDIA ASYNC pIMediaAsyncBelow;50 PPDMIMEDIAEX pIMediaExBelow; 51 51 /** @} */ 52 52 … … 54 54 * @{ */ 55 55 PPDMIMEDIAPORT pIMediaPortAbove; 56 PPDMIMEDIA ASYNCPORT pIMediaAsyncPortAbove;56 PPDMIMEDIAEXPORT pIMediaExPortAbove; 57 57 /** @} */ 58 58 … … 69 69 /* 70 70 * 71 * IMediaAsyncPort Implementation. 72 * 73 */ 74 75 /** @interface_method_impl{PDMIMEDIAASYNCPORT,pfnTransferCompleteNotify} */ 76 static DECLCALLBACK(int) 77 drvStorageFltIMediaAsyncPort_TransferCompleteNotify(PPDMIMEDIAASYNCPORT pInterface, void *pvUser, int rcReq) 78 { 79 PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaAsyncPort); 80 int rc = pThis->pIMediaAsyncPortAbove->pfnTransferCompleteNotify(pThis->pIMediaAsyncPortAbove, pvUser, rcReq); 81 return rc; 82 } 83 84 85 /* 86 * 87 * IMediaAsync Implementation. 88 * 89 */ 90 91 /** @interface_method_impl{PDMIMEDIAASYNC,pfnStartRead} */ 92 static DECLCALLBACK(int) drvStorageFltIMediaAsync_StartRead(PPDMIMEDIAASYNC pInterface, uint64_t off, 93 PCRTSGSEG paSegs, unsigned cSegs, size_t cbRead, void *pvUser) 94 { 95 PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaAsync); 96 int rc = pThis->pIMediaAsyncBelow->pfnStartRead(pThis->pIMediaAsyncBelow, off, paSegs, cSegs, cbRead, pvUser); 97 return rc; 98 } 99 100 /** @interface_method_impl{PDMIMEDIAASYNC,pfnStartWrite} */ 101 static DECLCALLBACK(int) drvStorageFltIMediaAsync_StartWrite(PPDMIMEDIAASYNC pInterface, uint64_t off, 102 PCRTSGSEG paSegs, unsigned cSegs, size_t cbWrite, void *pvUser) 103 { 104 PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaAsync); 105 int rc = pThis->pIMediaAsyncBelow->pfnStartWrite(pThis->pIMediaAsyncBelow, off, paSegs, cSegs, cbWrite, pvUser); 106 return rc; 107 } 108 109 /** @interface_method_impl{PDMIMEDIAASYNC,pfnStartFlush} */ 110 static DECLCALLBACK(int) drvStorageFltIMediaAsync_StartFlush(PPDMIMEDIAASYNC pInterface, void *pvUser) 111 { 112 PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaAsync); 113 int rc = pThis->pIMediaAsyncBelow->pfnStartFlush(pThis->pIMediaAsyncBelow, pvUser); 114 return rc; 115 } 116 117 118 /** @interface_method_impl{PDMIMEDIAASYNC,pfnStartDiscard} */ 119 static DECLCALLBACK(int) drvStorageFltIMediaAsync_StartDiscard(PPDMIMEDIAASYNC pInterface, PCRTRANGE paRanges, 120 unsigned cRanges, void *pvUser) 121 { 122 PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaAsync); 123 int rc = pThis->pIMediaAsyncBelow->pfnStartDiscard(pThis->pIMediaAsyncBelow, paRanges, cRanges, pvUser); 124 return rc; 125 } 126 127 128 /* 129 * 130 * IMedia Implementation. 71 * IMediaPort Implementation. 131 72 * 132 73 */ … … 242 183 int rc = pThis->pIMediaBelow->pfnDiscard(pThis->pIMediaBelow, paRanges, cRanges); 243 184 return rc; 185 } 186 187 188 /* 189 * 190 * IMediaExPort Implementation. 191 * 192 */ 193 194 /** @interface_method_impl{PDMIMEDIAEXPORT,pfnIoReqCompleteNotify} */ 195 static DECLCALLBACK(int) drvStorageFltIMedia_IoReqCompleteNotify(PPDMIMEDIAEXPORT pInterface, PDMMEDIAEXIOREQ hIoReq, 196 void *pvIoReqAlloc, int rcReq) 197 { 198 PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaExPort); 199 return pThis->pIMediaExPortAbove->pfnIoReqCompleteNotify(pThis->pIMediaExPortAbove, hIoReq, pvIoReqAlloc, rcReq); 200 } 201 202 203 /** @interface_method_impl{PDMIMEDIAEXPORT,pfnIoReqCopyFromBuf} */ 204 static DECLCALLBACK(int) drvStorageFltIMedia_IoReqCopyFromBuf(PPDMIMEDIAEXPORT pInterface, PDMMEDIAEXIOREQ hIoReq, 205 void *pvIoReqAlloc, uint32_t offDst, PRTSGBUF pSgBuf, 206 size_t cbCopy) 207 { 208 PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaExPort); 209 return pThis->pIMediaExPortAbove->pfnIoReqCopyFromBuf(pThis->pIMediaExPortAbove, hIoReq, pvIoReqAlloc, 210 offDst, pSgBuf, cbCopy); 211 } 212 213 /** @interface_method_impl{PDMIMEDIAEXPORT,pfnIoReqCopyToBuf} */ 214 static DECLCALLBACK(int) drvStorageFltIMedia_IoReqCopyToBuf(PPDMIMEDIAEXPORT pInterface, PDMMEDIAEXIOREQ hIoReq, 215 void *pvIoReqAlloc, uint32_t offSrc, PRTSGBUF pSgBuf, 216 size_t cbCopy) 217 { 218 PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaExPort); 219 return pThis->pIMediaExPortAbove->pfnIoReqCopyToBuf(pThis->pIMediaExPortAbove, hIoReq, pvIoReqAlloc, 220 offSrc, pSgBuf, cbCopy); 221 } 222 223 /** @interface_method_impl{PDMIMEDIAEXPORT,pfnIoReqQueryDiscardRanges} */ 224 static DECLCALLBACK(int) drvStorageFltIMedia_IoReqQueryDiscardRanges(PPDMIMEDIAEXPORT pInterface, PDMMEDIAEXIOREQ hIoReq, 225 void *pvIoReqAlloc, uint32_t idxRangeStart, 226 uint32_t cRanges, PRTRANGE paRanges, 227 uint32_t *pcRanges) 228 { 229 PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaExPort); 230 return pThis->pIMediaExPortAbove->pfnIoReqQueryDiscardRanges(pThis->pIMediaExPortAbove, hIoReq, pvIoReqAlloc, 231 idxRangeStart, cRanges, paRanges, pcRanges); 232 } 233 234 /** @interface_method_impl{PDMIMEDIAEXPORT,pfnIoReqStateChanged} */ 235 static DECLCALLBACK(void) drvStorageFltIMedia_IoReqStateChanged(PPDMIMEDIAEXPORT pInterface, PDMMEDIAEXIOREQ hIoReq, 236 void *pvIoReqAlloc, PDMMEDIAEXIOREQSTATE enmState) 237 { 238 PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaExPort); 239 return pThis->pIMediaExPortAbove->pfnIoReqStateChanged(pThis->pIMediaExPortAbove, hIoReq, pvIoReqAlloc, enmState); 240 } 241 242 243 /* 244 * 245 * IMediaEx Implementation. 246 * 247 */ 248 249 /** @interface_method_impl{PDMIMEDIAEX,pfnQueryFeatures} */ 250 static DECLCALLBACK(int) drvStorageFltIMedia_QueryFeatures(PPDMIMEDIAEX pInterface, uint32_t *pfFeatures) 251 { 252 PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaEx); 253 254 int rc = pThis->pIMediaExBelow->pfnQueryFeatures(pThis->pIMediaExBelow, pfFeatures); 255 if (RT_SUCCESS(rc) && !pThis->fAsyncIOSupported) 256 *pfFeatures &= ~PDMIMEDIAEX_FEATURE_F_ASYNC; 257 258 return rc; 259 } 260 261 /** @interface_method_impl{PDMIMEDIAEX,pfnIoReqAllocSizeSet} */ 262 static DECLCALLBACK(int) drvStorageFltIMedia_IoReqAllocSizeSet(PPDMIMEDIAEX pInterface, size_t cbIoReqAlloc) 263 { 264 PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaEx); 265 return pThis->pIMediaExBelow->pfnIoReqAllocSizeSet(pThis->pIMediaExBelow, cbIoReqAlloc); 266 } 267 268 /** @interface_method_impl{PDMIMEDIAEX,pfnIoReqAlloc} */ 269 static DECLCALLBACK(int) drvStorageFltIMedia_IoReqAlloc(PPDMIMEDIAEX pInterface, PPDMMEDIAEXIOREQ phIoReq, void **ppvIoReqAlloc, 270 PDMMEDIAEXIOREQID uIoReqId, uint32_t fFlags) 271 { 272 PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaEx); 273 274 if (!pThis->fAsyncIOSupported) 275 fFlags |= PDMIMEDIAEX_F_SYNC; 276 return pThis->pIMediaExBelow->pfnIoReqAlloc(pThis->pIMediaExBelow, phIoReq, ppvIoReqAlloc, uIoReqId, fFlags); 277 } 278 279 /** @interface_method_impl{PDMIMEDIAEX,pfnIoReqFree} */ 280 static DECLCALLBACK(int) drvStorageFltIMedia_IoReqFree(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq) 281 { 282 PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaEx); 283 return pThis->pIMediaExBelow->pfnIoReqFree(pThis->pIMediaExBelow, hIoReq); 284 } 285 286 /** @interface_method_impl{PDMIMEDIAEX,pfnIoReqQueryResidual} */ 287 static DECLCALLBACK(int) drvStorageFltIMedia_IoReqQueryResidual(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq, size_t *pcbResidual) 288 { 289 PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaEx); 290 return pThis->pIMediaExBelow->pfnIoReqQueryResidual(pThis->pIMediaExBelow, hIoReq, pcbResidual); 291 } 292 293 /** @interface_method_impl{PDMIMEDIAEX,pfnIoReqCancelAll} */ 294 static DECLCALLBACK(int) drvStorageFltIMedia_IoReqCancelAll(PPDMIMEDIAEX pInterface) 295 { 296 PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaEx); 297 return pThis->pIMediaExBelow->pfnIoReqCancelAll(pThis->pIMediaExBelow); 298 } 299 300 /** @interface_method_impl{PDMIMEDIAEX,pfnIoReqCancel} */ 301 static DECLCALLBACK(int) drvStorageFltIMedia_IoReqCancel(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQID uIoReqId) 302 { 303 PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaEx); 304 return pThis->pIMediaExBelow->pfnIoReqCancel(pThis->pIMediaExBelow, uIoReqId); 305 } 306 307 /** @interface_method_impl{PDMIMEDIAEX,pfnIoReqRead} */ 308 static DECLCALLBACK(int) drvStorageFltIMedia_IoReqRead(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq, uint64_t off, size_t cbRead) 309 { 310 PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaEx); 311 return pThis->pIMediaExBelow->pfnIoReqRead(pThis->pIMediaExBelow, hIoReq, off, cbRead); 312 } 313 314 /** 315 * @interface_method_impl{PDMIMEDIAEX,pfnIoReqWrite} 316 */ 317 static DECLCALLBACK(int) drvStorageFltIMedia_IoReqWrite(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq, uint64_t off, size_t cbWrite) 318 { 319 PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaEx); 320 return pThis->pIMediaExBelow->pfnIoReqWrite(pThis->pIMediaExBelow, hIoReq, off, cbWrite); 321 } 322 323 /** @interface_method_impl{PDMIMEDIAEX,pfnIoReqFlush} */ 324 static DECLCALLBACK(int) drvStorageFltIMedia_IoReqFlush(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq) 325 { 326 PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaEx); 327 return pThis->pIMediaExBelow->pfnIoReqFlush(pThis->pIMediaExBelow, hIoReq); 328 } 329 330 /** @interface_method_impl{PDMIMEDIAEX,pfnIoReqDiscard} */ 331 static DECLCALLBACK(int) drvStorageFltIMedia_IoReqDiscard(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq, unsigned cRangesMax) 332 { 333 PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaEx); 334 return pThis->pIMediaExBelow->pfnIoReqDiscard(pThis->pIMediaExBelow, hIoReq, cRangesMax); 335 } 336 337 /** @interface_method_impl{PDMIMEDIAEX,pfnIoReqSendScsiCmd} */ 338 static DECLCALLBACK(int) drvStorageFltIMedia_IoReqSendScsiCmd(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq, uint32_t uLun, 339 const uint8_t *pbCdb, size_t cbCdb, PDMMEDIAEXIOREQSCSITXDIR enmTxDir, 340 size_t cbBuf, uint8_t *pabSense, size_t cbSense, uint32_t cTimeoutMillies) 341 { 342 PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaEx); 343 return pThis->pIMediaExBelow->pfnIoReqSendScsiCmd(pThis->pIMediaExBelow, hIoReq, uLun, pbCdb, cbCdb, 344 enmTxDir, cbBuf, pabSense, cbSense, cTimeoutMillies); 345 } 346 347 /** @interface_method_impl{PDMIMEDIAEX,pfnIoReqGetActiveCount} */ 348 static DECLCALLBACK(uint32_t) drvStorageFltIMedia_IoReqGetActiveCount(PPDMIMEDIAEX pInterface) 349 { 350 PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaEx); 351 return pThis->pIMediaExBelow->pfnIoReqGetActiveCount(pThis->pIMediaExBelow); 352 } 353 354 /** @interface_method_impl{PDMIMEDIAEX,pfnIoReqGetSuspendedCount} */ 355 static DECLCALLBACK(uint32_t) drvStorageFltIMedia_IoReqGetSuspendedCount(PPDMIMEDIAEX pInterface) 356 { 357 PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaEx); 358 return pThis->pIMediaExBelow->pfnIoReqGetSuspendedCount(pThis->pIMediaExBelow); 359 } 360 361 /** @interface_method_impl{PDMIMEDIAEX,pfnIoReqQuerySuspendedFirst} */ 362 static DECLCALLBACK(int) drvStorageFltIMedia_IoReqQuerySuspendedStart(PPDMIMEDIAEX pInterface, PPDMMEDIAEXIOREQ phIoReq, 363 void **ppvIoReqAlloc) 364 { 365 PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaEx); 366 return pThis->pIMediaExBelow->pfnIoReqQuerySuspendedStart(pThis->pIMediaExBelow, phIoReq, ppvIoReqAlloc); 367 } 368 369 /** @interface_method_impl{PDMIMEDIAEX,pfnIoReqQuerySuspendedNext} */ 370 static DECLCALLBACK(int) drvStorageFltIMedia_IoReqQuerySuspendedNext(PPDMIMEDIAEX pInterface, PDMMEDIAEXIOREQ hIoReq, 371 PPDMMEDIAEXIOREQ phIoReqNext, void **ppvIoReqAllocNext) 372 { 373 PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaEx); 374 return pThis->pIMediaExBelow->pfnIoReqQuerySuspendedNext(pThis->pIMediaExBelow, hIoReq, phIoReqNext, ppvIoReqAllocNext); 375 } 376 377 /** @interface_method_impl{PDMIMEDIAEX,pfnIoReqSuspendedSave} */ 378 static DECLCALLBACK(int) drvStorageFltIMedia_IoReqSuspendedSave(PPDMIMEDIAEX pInterface, PSSMHANDLE pSSM, PDMMEDIAEXIOREQ hIoReq) 379 { 380 PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaEx); 381 return pThis->pIMediaExBelow->pfnIoReqSuspendedSave(pThis->pIMediaExBelow, pSSM, hIoReq); 382 } 383 384 /** @interface_method_impl{PDMIMEDIAEX,pfnIoReqSuspendedLoad} */ 385 static DECLCALLBACK(int) drvStorageFltIMedia_IoReqSuspendedLoad(PPDMIMEDIAEX pInterface, PSSMHANDLE pSSM, PDMMEDIAEXIOREQ hIoReq) 386 { 387 PDRVSTORAGEFILTER pThis = RT_FROM_MEMBER(pInterface, DRVSTORAGEFILTER, IMediaEx); 388 return pThis->pIMediaExBelow->pfnIoReqSuspendedLoad(pThis->pIMediaExBelow, pSSM, hIoReq); 244 389 } 245 390 … … 262 407 if (pThis->pIMediaPortAbove) 263 408 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIMEDIAPORT, &pThis->IMediaPort); 264 265 if (pThis->fAsyncIOSupported && pThis->pIMediaAsyncBelow)266 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIMEDIAASYNC, &pThis->IMediaAsync);267 if (pThis->fAsyncIOSupported && pThis->pIMediaAsyncPortAbove)268 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIMEDIAASYNCPORT, &pThis->IMediaAsyncPort); 409 if (pThis->pIMediaExBelow) 410 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIMEDIAEX, &pThis->IMediaEx); 411 if (pThis->pIMediaExPortAbove) 412 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIMEDIAEXPORT, &pThis->IMediaExPort); 413 269 414 return NULL; 270 415 } … … 307 452 pThis->IMedia.pfnDiscard = drvStorageFltIMedia_Discard; 308 453 454 pThis->IMediaEx.pfnQueryFeatures = drvStorageFltIMedia_QueryFeatures; 455 pThis->IMediaEx.pfnIoReqAllocSizeSet = drvStorageFltIMedia_IoReqAllocSizeSet; 456 pThis->IMediaEx.pfnIoReqAlloc = drvStorageFltIMedia_IoReqAlloc; 457 pThis->IMediaEx.pfnIoReqFree = drvStorageFltIMedia_IoReqFree; 458 pThis->IMediaEx.pfnIoReqQueryResidual = drvStorageFltIMedia_IoReqQueryResidual; 459 pThis->IMediaEx.pfnIoReqCancelAll = drvStorageFltIMedia_IoReqCancelAll; 460 pThis->IMediaEx.pfnIoReqCancel = drvStorageFltIMedia_IoReqCancel; 461 pThis->IMediaEx.pfnIoReqRead = drvStorageFltIMedia_IoReqRead; 462 pThis->IMediaEx.pfnIoReqWrite = drvStorageFltIMedia_IoReqWrite; 463 pThis->IMediaEx.pfnIoReqFlush = drvStorageFltIMedia_IoReqFlush; 464 pThis->IMediaEx.pfnIoReqDiscard = drvStorageFltIMedia_IoReqDiscard; 465 pThis->IMediaEx.pfnIoReqSendScsiCmd = drvStorageFltIMedia_IoReqSendScsiCmd; 466 pThis->IMediaEx.pfnIoReqGetActiveCount = drvStorageFltIMedia_IoReqGetActiveCount; 467 pThis->IMediaEx.pfnIoReqGetSuspendedCount = drvStorageFltIMedia_IoReqGetSuspendedCount; 468 pThis->IMediaEx.pfnIoReqQuerySuspendedStart = drvStorageFltIMedia_IoReqQuerySuspendedStart; 469 pThis->IMediaEx.pfnIoReqQuerySuspendedNext = drvStorageFltIMedia_IoReqQuerySuspendedNext; 470 pThis->IMediaEx.pfnIoReqSuspendedSave = drvStorageFltIMedia_IoReqSuspendedSave; 471 pThis->IMediaEx.pfnIoReqSuspendedLoad = drvStorageFltIMedia_IoReqSuspendedLoad; 472 309 473 pThis->IMediaPort.pfnQueryDeviceLocation = drvStorageFltIMediaPort_QueryDeviceLocation; 310 474 311 pThis->IMediaAsync.pfnStartRead = drvStorageFltIMediaAsync_StartRead; 312 pThis->IMediaAsync.pfnStartWrite = drvStorageFltIMediaAsync_StartWrite; 313 pThis->IMediaAsync.pfnStartFlush = drvStorageFltIMediaAsync_StartFlush; 314 pThis->IMediaAsync.pfnStartDiscard = drvStorageFltIMediaAsync_StartDiscard; 315 316 pThis->IMediaAsyncPort.pfnTransferCompleteNotify = drvStorageFltIMediaAsyncPort_TransferCompleteNotify; 475 pThis->IMediaExPort.pfnIoReqCompleteNotify = drvStorageFltIMedia_IoReqCompleteNotify; 476 pThis->IMediaExPort.pfnIoReqCopyFromBuf = drvStorageFltIMedia_IoReqCopyFromBuf; 477 pThis->IMediaExPort.pfnIoReqCopyToBuf = drvStorageFltIMedia_IoReqCopyToBuf; 478 pThis->IMediaExPort.pfnIoReqQueryDiscardRanges = drvStorageFltIMedia_IoReqQueryDiscardRanges; 479 pThis->IMediaExPort.pfnIoReqStateChanged = drvStorageFltIMedia_IoReqStateChanged; 317 480 318 481 /* … … 327 490 * Query interfaces from the driver/device above us. 328 491 */ 329 pThis->pIMediaPortAbove 330 pThis->pIMedia AsyncPortAbove = PDMIBASE_QUERY_INTERFACE(pDrvIns->pUpBase, PDMIMEDIAASYNCPORT);492 pThis->pIMediaPortAbove = PDMIBASE_QUERY_INTERFACE(pDrvIns->pUpBase, PDMIMEDIAPORT); 493 pThis->pIMediaExPortAbove = PDMIBASE_QUERY_INTERFACE(pDrvIns->pUpBase, PDMIMEDIAEXPORT); 331 494 332 495 /* … … 337 500 AssertLogRelRCReturn(rc, rc); 338 501 339 pThis->pIMediaBelow 340 pThis->pIMedia AsyncBelow = PDMIBASE_QUERY_INTERFACE(pIBaseBelow, PDMIMEDIAASYNC);502 pThis->pIMediaBelow = PDMIBASE_QUERY_INTERFACE(pIBaseBelow, PDMIMEDIA); 503 pThis->pIMediaExBelow = PDMIBASE_QUERY_INTERFACE(pIBaseBelow, PDMIMEDIAEX); 341 504 342 505 AssertLogRelReturn(pThis->pIMediaBelow, VERR_PDM_MISSING_INTERFACE_BELOW); … … 344 507 if (!pThis->pIMediaBelow->pfnDiscard) 345 508 pThis->IMedia.pfnDiscard = NULL; 346 if (!pThis->pIMediaAsyncBelow || !pThis->pIMediaAsyncBelow->pfnStartDiscard)347 pThis->IMediaAsync.pfnStartDiscard = NULL;348 509 349 510 return VINF_SUCCESS;
Note:
See TracChangeset
for help on using the changeset viewer.