Changeset 34433 in vbox
- Timestamp:
- Nov 27, 2010 11:09:38 AM (14 years ago)
- Location:
- trunk
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/pdmifs.h
r34126 r34433 838 838 839 839 840 /** Pointer to a block port interface. */ 841 typedef struct PDMIBLOCKPORT *PPDMIBLOCKPORT; 840 842 /** 841 843 * Block notify interface (down). 842 844 * Pair with PDMIBLOCK. 843 845 */ 844 typedef PDMIDUMMY PDMIBLOCKPORT; 846 typedef struct PDMIBLOCKPORT 847 { 848 /** 849 * Returns the storage controller name, instance and LUN of the attached medium. 850 * 851 * @returns VBox status. 852 * @param pInterface Pointer to this interface. 853 * @param ppcszController Where to store the name of the storage controller. 854 * @param piInstance Where to store the instance number of the controller. 855 * @param piLUN Where to store the LUN of the attached device. 856 */ 857 DECLR3CALLBACKMEMBER(int, pfnQueryDeviceLocation, (PPDMIBLOCKPORT pInterface, const char **ppcszController, 858 uint32_t *piInstance, uint32_t *piLUN)); 859 860 } PDMIBLOCKPORT; 845 861 /** PDMIBLOCKPORT interface ID. */ 846 #define PDMIBLOCKPORT_IID "e87fa1ab-92d5-4100-8712-fe2a0c042faf" 847 /** Pointer to a block notify interface (dummy). */ 848 typedef PDMIBLOCKPORT *PPDMIBLOCKPORT; 862 #define PDMIBLOCKPORT_IID "bbbed4cf-0862-4ffd-b60c-f7a65ef8e8ff" 849 863 850 864 … … 1130 1144 /** Pointer to constant media geometry structure. */ 1131 1145 typedef const PDMMEDIAGEOMETRY *PCPDMMEDIAGEOMETRY; 1146 1147 /** Pointer to a media port interface. */ 1148 typedef struct PDMIMEDIAPORT *PPDMIMEDIAPORT; 1149 /** 1150 * Media port interface (down). 1151 */ 1152 typedef struct PDMIMEDIAPORT 1153 { 1154 /** 1155 * Returns the storage controller name, instance and LUN of the attached medium. 1156 * 1157 * @returns VBox status. 1158 * @param pInterface Pointer to this interface. 1159 * @param ppcszController Where to store the name of the storage controller. 1160 * @param piInstance Where to store the instance number of the controller. 1161 * @param piLUN Where to store the LUN of the attached device. 1162 */ 1163 DECLR3CALLBACKMEMBER(int, pfnQueryDeviceLocation, (PPDMIMEDIAPORT pInterface, const char **ppcszController, 1164 uint32_t *piInstance, uint32_t *piLUN)); 1165 1166 } PDMIMEDIAPORT; 1167 /** PDMIMEDIAPORT interface ID. */ 1168 #define PDMIMEDIAPORT_IID "9f7e8c9e-6d35-4453-bbef-1f78033174d6" 1132 1169 1133 1170 /** Pointer to a media interface. */ … … 2686 2723 int rcCompletion, bool fRedo, int rcReq)); 2687 2724 2725 /** 2726 * Returns the storage controller name, instance and LUN of the attached medium. 2727 * 2728 * @returns VBox status. 2729 * @param pInterface Pointer to this interface. 2730 * @param ppcszController Where to store the name of the storage controller. 2731 * @param piInstance Where to store the instance number of the controller. 2732 * @param piLUN Where to store the LUN of the attached device. 2733 */ 2734 DECLR3CALLBACKMEMBER(int, pfnQueryDeviceLocation, (PPDMISCSIPORT pInterface, const char **ppcszController, 2735 uint32_t *piInstance, uint32_t *piLUN)); 2736 2688 2737 } PDMISCSIPORT; 2689 2738 /** PDMISCSIPORT interface ID. */ 2690 #define PDMISCSIPORT_IID " 9d185b3b-1051-41f6-83ad-2a2a23f04e40"2739 #define PDMISCSIPORT_IID "05d9fc3b-e38c-4b30-8344-a323feebcfe5" 2691 2740 2692 2741 -
trunk/src/VBox/Devices/Storage/DevAHCI.cpp
r34142 r34433 890 890 #define PDMIMOUNTNOTIFY_2_PAHCIPORT(pInterface) ( (PAHCIPort)((uintptr_t)(pInterface) - RT_OFFSETOF(AHCIPort, IMountNotify)) ) 891 891 #define PDMIBASE_2_PAHCIPORT(pInterface) ( (PAHCIPort)((uintptr_t)(pInterface) - RT_OFFSETOF(AHCIPort, IBase)) ) 892 #define PDMIBLOCKPORT_2_PAHCIPORT(pInterface) ( (PAHCIPort)((uintptr_t)(pInterface) - RT_OFFSETOF(AHCIPort, IPort)) ) 892 893 #define PDMIBASE_2_PAHCI(pInterface) ( (PAHCI)((uintptr_t)(pInterface) - RT_OFFSETOF(AHCI, IBase)) ) 893 894 #define PDMILEDPORTS_2_PAHCI(pInterface) ( (PAHCI)((uintptr_t)(pInterface) - RT_OFFSETOF(AHCI, ILeds)) ) … … 2416 2417 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIMOUNTNOTIFY, &pAhciPort->IMountNotify); 2417 2418 return NULL; 2419 } 2420 2421 static DECLCALLBACK(int) ahciR3PortQueryDeviceLocation(PPDMIBLOCKPORT pInterface, const char **ppcszController, 2422 uint32_t *piInstance, uint32_t *piLUN) 2423 { 2424 PAHCIPort pAhciPort = PDMIBLOCKPORT_2_PAHCIPORT(pInterface); 2425 PPDMDEVINS pDevIns = pAhciPort->CTX_SUFF(pDevIns); 2426 2427 AssertPtrReturn(ppcszController, VERR_INVALID_POINTER); 2428 AssertPtrReturn(piInstance, VERR_INVALID_POINTER); 2429 AssertPtrReturn(piLUN, VERR_INVALID_POINTER); 2430 2431 *ppcszController = pDevIns->pReg->szName; 2432 *piInstance = pDevIns->iInstance; 2433 *piLUN = pAhciPort->iLUN; 2434 2435 return VINF_SUCCESS; 2418 2436 } 2419 2437 … … 7928 7946 pAhciPort->IBase.pfnQueryInterface = ahciR3PortQueryInterface; 7929 7947 pAhciPort->IPortAsync.pfnTransferCompleteNotify = ahciTransferCompleteNotify; 7948 pAhciPort->IPort.pfnQueryDeviceLocation = ahciR3PortQueryDeviceLocation; 7930 7949 pAhciPort->IMountNotify.pfnMountNotify = ahciMountNotify; 7931 7950 pAhciPort->IMountNotify.pfnUnmountNotify = ahciUnmountNotify; -
trunk/src/VBox/Devices/Storage/DevATA.cpp
r33540 r34433 506 506 #define CONTROLLER_2_DEVINS(pController) ( (pController)->CTX_SUFF(pDevIns) ) 507 507 #define PDMIBASE_2_ATASTATE(pInterface) ( (ATADevState *)((uintptr_t)(pInterface) - RT_OFFSETOF(ATADevState, IBase)) ) 508 #define PDMIBLOCKPORT_2_ATASTATE(pInterface) ( (ATADevState *)((uintptr_t)(pInterface) - RT_OFFSETOF(ATADevState, IPort)) ) 508 509 509 510 #ifndef VBOX_DEVICE_STRUCT_TESTCASE … … 5372 5373 } 5373 5374 5375 5376 /* -=-=-=-=-=- ATADevState::IPort -=-=-=-=-=- */ 5377 5378 /** 5379 * @interface_method_impl{PDMIBLOCKPORT,pfnQueryDeviceLocation} 5380 */ 5381 static DECLCALLBACK(int) ataR3QueryDeviceLocation(PPDMIBLOCKPORT pInterface, const char **ppcszController, 5382 uint32_t *piInstance, uint32_t *piLUN) 5383 { 5384 ATADevState *pIf = PDMIBLOCKPORT_2_ATASTATE(pInterface); 5385 PPDMDEVINS pDevIns = pIf->CTX_SUFF(pDevIns); 5386 5387 AssertPtrReturn(ppcszController, VERR_INVALID_POINTER); 5388 AssertPtrReturn(piInstance, VERR_INVALID_POINTER); 5389 AssertPtrReturn(piLUN, VERR_INVALID_POINTER); 5390 5391 *ppcszController = pDevIns->pReg->szName; 5392 *piInstance = pDevIns->iInstance; 5393 *piLUN = pIf->iLUN; 5394 5395 return VINF_SUCCESS; 5396 } 5374 5397 #endif /* IN_RING3 */ 5375 5398 … … 6737 6760 pIf->IMountNotify.pfnMountNotify = ataMountNotify; 6738 6761 pIf->IMountNotify.pfnUnmountNotify = ataUnmountNotify; 6762 pIf->IPort.pfnQueryDeviceLocation = ataR3QueryDeviceLocation; 6739 6763 pIf->Led.u32Magic = PDMLED_MAGIC; 6740 6764 } -
trunk/src/VBox/Devices/Storage/DevBusLogic.cpp
r34009 r34433 2140 2140 } 2141 2141 2142 static DECLCALLBACK(int) buslogicQueryDeviceLocation(PPDMISCSIPORT pInterface, const char **ppcszController, 2143 uint32_t *piInstance, uint32_t *piLUN) 2144 { 2145 PBUSLOGICDEVICE pBusLogicDevice = PDMISCSIPORT_2_PBUSLOGICDEVICE(pInterface); 2146 PPDMDEVINS pDevIns = pBusLogicDevice->CTX_SUFF(pBusLogic)->CTX_SUFF(pDevIns); 2147 2148 AssertPtrReturn(ppcszController, VERR_INVALID_POINTER); 2149 AssertPtrReturn(piInstance, VERR_INVALID_POINTER); 2150 AssertPtrReturn(piLUN, VERR_INVALID_POINTER); 2151 2152 *ppcszController = pDevIns->pReg->szName; 2153 *piInstance = pDevIns->iInstance; 2154 *piLUN = pBusLogicDevice->iLUN; 2155 2156 return VINF_SUCCESS; 2157 } 2158 2142 2159 static int buslogicDeviceSCSIRequestSetup(PBUSLOGIC pBusLogic, PBUSLOGICTASKSTATE pTaskState) 2143 2160 { … … 3072 3089 pDevice->IBase.pfnQueryInterface = buslogicDeviceQueryInterface; 3073 3090 pDevice->ISCSIPort.pfnSCSIRequestCompleted = buslogicDeviceSCSIRequestCompleted; 3091 pDevice->ISCSIPort.pfnQueryDeviceLocation = buslogicQueryDeviceLocation; 3074 3092 pDevice->ILed.pfnQueryStatusLed = buslogicDeviceQueryStatusLed; 3075 3093 -
trunk/src/VBox/Devices/Storage/DevLsiLogicSCSI.cpp
r34014 r34433 2181 2181 } 2182 2182 2183 static DECLCALLBACK(int) lsilogicQueryDeviceLocation(PPDMISCSIPORT pInterface, const char **ppcszController, 2184 uint32_t *piInstance, uint32_t *piLUN) 2185 { 2186 PLSILOGICDEVICE pLsiLogicDevice = PDMISCSIPORT_2_PLSILOGICDEVICE(pInterface); 2187 PPDMDEVINS pDevIns = pLsiLogicDevice->CTX_SUFF(pLsiLogic)->CTX_SUFF(pDevIns); 2188 2189 AssertPtrReturn(ppcszController, VERR_INVALID_POINTER); 2190 AssertPtrReturn(piInstance, VERR_INVALID_POINTER); 2191 AssertPtrReturn(piLUN, VERR_INVALID_POINTER); 2192 2193 *ppcszController = pDevIns->pReg->szName; 2194 *piInstance = pDevIns->iInstance; 2195 *piLUN = pLsiLogicDevice->iLUN; 2196 2197 return VINF_SUCCESS; 2198 } 2199 2183 2200 /** 2184 2201 * Return the configuration page header and data … … 5176 5193 pDevice->IBase.pfnQueryInterface = lsilogicDeviceQueryInterface; 5177 5194 pDevice->ISCSIPort.pfnSCSIRequestCompleted = lsilogicDeviceSCSIRequestCompleted; 5195 pDevice->ISCSIPort.pfnQueryDeviceLocation = lsilogicQueryDeviceLocation; 5178 5196 pDevice->ILed.pfnQueryStatusLed = lsilogicDeviceQueryStatusLed; 5179 5197 -
trunk/src/VBox/Devices/Storage/DrvBlock.cpp
r32139 r34433 101 101 /** Our mountable interface. */ 102 102 PDMIMOUNT IMount; 103 /** Our media port interface. */ 104 PDMIMEDIAPORT IMediaPort; 103 105 104 106 /** Pointer to the async media driver below us. … … 698 700 699 701 702 703 /* -=-=-=-=- IMediaPort -=-=-=-=- */ 704 705 /** Makes a PDRVBLOCK out of a PPDMIMEDIAPORT. */ 706 #define PDMIMEDIAPORT_2_DRVBLOCK(pInterface) ( (PDRVBLOCK((uintptr_t)pInterface - RT_OFFSETOF(DRVBLOCK, IMediaPort))) ) 707 708 /** 709 * @interface_method_impl{PDMIMEDIAPORT,pfnQueryDeviceLocation} 710 */ 711 static DECLCALLBACK(int) drvblockQueryDeviceLocation(PPDMIMEDIAPORT pInterface, const char **ppcszController, 712 uint32_t *piInstance, uint32_t *piLUN) 713 { 714 PDRVBLOCK pThis = PDMIMEDIAPORT_2_DRVBLOCK(pInterface); 715 716 return pThis->pDrvBlockPort->pfnQueryDeviceLocation(pThis->pDrvBlockPort, ppcszController, 717 piInstance, piLUN); 718 } 719 700 720 /* -=-=-=-=- IBase -=-=-=-=- */ 701 721 … … 714 734 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIBLOCKASYNC, pThis->pDrvMediaAsync ? &pThis->IBlockAsync : NULL); 715 735 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIMEDIAASYNCPORT, pThis->pDrvBlockAsyncPort ? &pThis->IMediaAsyncPort : NULL); 736 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIMEDIAPORT, &pThis->IMediaPort); 716 737 return NULL; 717 738 } … … 804 825 /* IMediaAsyncPort. */ 805 826 pThis->IMediaAsyncPort.pfnTransferCompleteNotify = drvblockAsyncTransferCompleteNotify; 827 828 /* IMediaPort */ 829 pThis->IMediaPort.pfnQueryDeviceLocation = drvblockQueryDeviceLocation; 806 830 807 831 /* -
trunk/src/VBox/Devices/Storage/DrvDiskIntegrity.cpp
r33540 r34433 134 134 PDMIMEDIA IMedia; 135 135 136 /** The media port interface above. */ 137 PPDMIMEDIAPORT pDrvMediaPort; 138 /** Media port interface */ 139 PDMIMEDIAPORT IMediaPort; 140 136 141 /** Pointer to the media async driver below us. 137 142 * This is NULL if the media is not mounted. */ … … 769 774 } 770 775 776 /* -=-=-=-=- IMediaPort -=-=-=-=- */ 777 778 /** Makes a PDRVBLOCK out of a PPDMIMEDIAPORT. */ 779 #define PDMIMEDIAPORT_2_DRVDISKINTEGRITY(pInterface) ( (PDRVDISKINTEGRITY((uintptr_t)pInterface - RT_OFFSETOF(DRVDISKINTEGRITY, IMediaPort))) ) 780 781 /** 782 * @interface_method_impl{PDMIMEDIAPORT,pfnQueryDeviceLocation} 783 */ 784 static DECLCALLBACK(int) drvdiskintQueryDeviceLocation(PPDMIMEDIAPORT pInterface, const char **ppcszController, 785 uint32_t *piInstance, uint32_t *piLUN) 786 { 787 PDRVDISKINTEGRITY pThis = PDMIMEDIAPORT_2_DRVDISKINTEGRITY(pInterface); 788 789 return pThis->pDrvMediaPort->pfnQueryDeviceLocation(pThis->pDrvMediaPort, ppcszController, 790 piInstance, piLUN); 791 } 792 771 793 /* -=-=-=-=- IBase -=-=-=-=- */ 772 794 … … 783 805 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIMEDIAASYNC, pThis->pDrvMediaAsync ? &pThis->IMediaAsync : NULL); 784 806 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIMEDIAASYNCPORT, &pThis->IMediaAsyncPort); 807 PDMIBASE_RETURN_INTERFACE(pszIID, PDMIMEDIAPORT, &pThis->IMediaPort); 785 808 return NULL; 786 809 } … … 894 917 pThis->IMediaAsyncPort.pfnTransferCompleteNotify = drvdiskintAsyncTransferCompleteNotify; 895 918 919 /* IMediaPort. */ 920 pThis->IMediaPort.pfnQueryDeviceLocation = drvdiskintQueryDeviceLocation; 921 922 /* Query the media port interface above us. */ 923 pThis->pDrvMediaPort = PDMIBASE_QUERY_INTERFACE(pDrvIns->pUpBase, PDMIMEDIAPORT); 924 if (!pThis->pDrvMediaPort) 925 return PDMDRV_SET_ERROR(pDrvIns, VERR_PDM_MISSING_INTERFACE_BELOW, 926 N_("No media port inrerface above")); 927 928 /* Try to attach async media port interface above.*/ 929 pThis->pDrvMediaAsyncPort = PDMIBASE_QUERY_INTERFACE(pDrvIns->pUpBase, PDMIMEDIAASYNCPORT); 930 896 931 /* 897 932 * Try attach driver below and query it's media interface. … … 909 944 910 945 pThis->pDrvMediaAsync = PDMIBASE_QUERY_INTERFACE(pBase, PDMIMEDIAASYNC); 911 912 /* Try to attach async media port interface above.*/913 pThis->pDrvMediaAsyncPort = PDMIBASE_QUERY_INTERFACE(pDrvIns->pUpBase, PDMIMEDIAASYNCPORT);914 946 915 947 if (pThis->fCheckConsistency) -
trunk/src/VBox/Devices/Storage/DrvSCSI.cpp
r34148 r34433 108 108 109 109 /** Converts a pointer to DRVSCSI::ISCSIConnector to a PDRVSCSI. */ 110 #define PDMISCSICONNECTOR_2_DRVSCSI(pInterface) ( (PDRVSCSI)((uintptr_t)pInterface - RT_OFFSETOF(DRVSCSI, ISCSIConnector)) )110 #define PDMISCSICONNECTOR_2_DRVSCSI(pInterface) ( (PDRVSCSI)((uintptr_t)pInterface - RT_OFFSETOF(DRVSCSI, ISCSIConnector)) ) 111 111 /** Converts a pointer to DRVSCSI::IPortAsync to a PDRVSCSI. */ 112 112 #define PDMIBLOCKASYNCPORT_2_DRVSCSI(pInterface) ( (PDRVSCSI)((uintptr_t)pInterface - RT_OFFSETOF(DRVSCSI, IPortAsync)) ) 113 /** Converts a pointer to DRVSCSI::IPort to a PDRVSCSI. */ 114 #define PDMIBLOCKPORT_2_DRVSCSI(pInterface) ( (PDRVSCSI)((uintptr_t)pInterface - RT_OFFSETOF(DRVSCSI, IPort)) ) 113 115 114 116 static bool drvscsiIsRedoPossible(int rc) … … 558 560 } 559 561 562 static DECLCALLBACK(int) drvscsiQueryDeviceLocation(PPDMIBLOCKPORT pInterface, const char **ppcszController, 563 uint32_t *piInstance, uint32_t *piLUN) 564 { 565 PDRVSCSI pThis = PDMIBLOCKPORT_2_DRVSCSI(pInterface); 566 567 return pThis->pDevScsiPort->pfnQueryDeviceLocation(pThis->pDevScsiPort, ppcszController, 568 piInstance, piLUN); 569 } 570 560 571 /** 561 572 * Worker for drvscsiReset, drvscsiSuspend and drvscsiPowerOff. … … 736 747 pDrvIns->IBase.pfnQueryInterface = drvscsiQueryInterface; 737 748 749 pThis->IPort.pfnQueryDeviceLocation = drvscsiQueryDeviceLocation; 738 750 pThis->IPortAsync.pfnTransferCompleteNotify = drvscsiTransferCompleteNotify; 739 751 -
trunk/src/VBox/Devices/Storage/DrvVD.cpp
r34247 r34433 128 128 /** The media interface. */ 129 129 PDMIMEDIA IMedia; 130 /** Media port. */ 131 PPDMIMEDIAPORT pDrvMediaPort; 130 132 /** Pointer to the driver instance. */ 131 133 PPDMDRVINS pDrvIns; … … 2097 2099 pThis->pImages = NULL; 2098 2100 2101 pThis->pDrvMediaPort = PDMIBASE_QUERY_INTERFACE(pDrvIns->pUpBase, PDMIMEDIAPORT); 2102 if (!pThis->pDrvMediaPort) 2103 return PDMDRV_SET_ERROR(pDrvIns, VERR_PDM_MISSING_INTERFACE_ABOVE, 2104 N_("No media port interface above")); 2105 2099 2106 /* Try to attach async media port interface above.*/ 2100 2107 pThis->pDrvMediaAsyncPort = PDMIBASE_QUERY_INTERFACE(pDrvIns->pUpBase, PDMIMEDIAASYNCPORT); … … 2627 2634 /* Create the block cache if enabled. */ 2628 2635 if ( fUseBlockCache 2636 && !pThis->fShareable 2629 2637 && RT_SUCCESS(rc)) 2630 2638 { 2631 /* Create a unique ID from the UUID of the last image in the chain. */ 2632 char achUuid[RTUUID_STR_LENGTH + 1]; 2633 RTUUID Uuid; 2634 2635 /** @todo: Images without UUIDs. */ 2636 rc = VDGetUuid(pThis->pDisk, VDGetCount(pThis->pDisk) - 1, &Uuid); 2637 AssertRC(rc); 2638 2639 memset(achUuid, 0, sizeof(achUuid)); 2640 rc = RTUuidToStr(&Uuid, achUuid, RTUUID_STR_LENGTH); 2641 AssertRC(rc); 2642 2643 rc = PDMDrvHlpBlkCacheRetain(pDrvIns, &pThis->pBlkCache, 2644 drvvdBlkCacheXferComplete, 2645 drvvdBlkCacheXferEnqueue, 2646 achUuid); 2647 if (rc == VERR_NOT_SUPPORTED) 2648 { 2649 LogRel(("VD: Block cache is not supported\n")); 2650 rc = VINF_SUCCESS; 2651 } 2639 /* 2640 * We need a unique ID for the block cache (to identify the owner of data 2641 * blocks in a saved state). UUIDs are not really suitable because 2642 * there are image formats which don't support them. Furthermore it is 2643 * possible that a new diff image was attached after a saved state 2644 * which changes the UUID. 2645 * However the device "name + device instance + LUN" triple the disk is 2646 * attached to is always constant for saved states. 2647 */ 2648 char *pszId = NULL; 2649 uint32_t iInstance, iLUN; 2650 const char *pcszController; 2651 2652 rc = pThis->pDrvMediaPort->pfnQueryDeviceLocation(pThis->pDrvMediaPort, &pcszController, 2653 &iInstance, &iLUN); 2654 if (RT_FAILURE(rc)) 2655 rc = PDMDRV_SET_ERROR(pDrvIns, VERR_PDM_DRIVER_INVALID_PROPERTIES, 2656 N_("DrvVD: Configuration error: Could not query device data")); 2652 2657 else 2653 AssertRC(rc); 2658 { 2659 int cbStr = RTStrAPrintf(&pszId, "%s-%d-%d", pcszController, iInstance, iLUN); 2660 2661 if (cbStr > 0) 2662 { 2663 rc = PDMDrvHlpBlkCacheRetain(pDrvIns, &pThis->pBlkCache, 2664 drvvdBlkCacheXferComplete, 2665 drvvdBlkCacheXferEnqueue, 2666 pszId); 2667 if (rc == VERR_NOT_SUPPORTED) 2668 { 2669 LogRel(("VD: Block cache is not supported\n")); 2670 rc = VINF_SUCCESS; 2671 } 2672 else 2673 AssertRC(rc); 2674 2675 RTStrFree(pszId); 2676 } 2677 else 2678 rc = PDMDRV_SET_ERROR(pDrvIns, VERR_PDM_DRIVER_INVALID_PROPERTIES, 2679 N_("DrvVD: Out of memory when creating block cache")); 2680 } 2654 2681 } 2655 2682
Note:
See TracChangeset
for help on using the changeset viewer.