Changeset 39544 in vbox
- Timestamp:
- Dec 6, 2011 9:46:22 PM (13 years ago)
- svn:sync-xref-src-repo-rev:
- 75252
- Location:
- trunk/src/VBox/HostServices/SharedFolders
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/HostServices/SharedFolders/shflhandle.cpp
r28800 r39544 30 30 typedef struct 31 31 { 32 uint32_t uFlags; 33 uintptr_t pvUserData; 32 uint32_t uFlags; 33 uintptr_t pvUserData; 34 PSHFLCLIENTDATA pClient; 34 35 } SHFLINTHANDLE, *PSHFLINTHANDLE; 35 36 … … 67 68 } 68 69 69 SHFLHANDLE vbsfAllocHandle(uint32_t uType, uintptr_t pvUserData) 70 SHFLHANDLE vbsfAllocHandle(PSHFLCLIENTDATA pClient, uint32_t uType, 71 uintptr_t pvUserData) 70 72 { 71 73 SHFLHANDLE handle; … … 111 113 pHandles[handle].uFlags = (uType & SHFL_HF_TYPE_MASK) | SHFL_HF_VALID; 112 114 pHandles[handle].pvUserData = pvUserData; 115 pHandles[handle].pClient = pClient; 113 116 114 117 lastHandleIndex++; … … 119 122 } 120 123 121 int vbsfFreeHandle(SHFLHANDLE handle) 122 { 123 if (handle < SHFLHANDLE_MAX && (pHandles[handle].uFlags & SHFL_HF_VALID)) 124 static int vbsfFreeHandle(PSHFLCLIENTDATA pClient, SHFLHANDLE handle) 125 { 126 if ( handle < SHFLHANDLE_MAX 127 && (pHandles[handle].uFlags & SHFL_HF_VALID) 128 && pHandles[handle].pClient == pClient) 124 129 { 125 130 pHandles[handle].uFlags = 0; 126 131 pHandles[handle].pvUserData = 0; 132 pHandles[handle].pClient = 0; 127 133 return VINF_SUCCESS; 128 134 } … … 130 136 } 131 137 132 uintptr_t vbsfQueryHandle(SHFLHANDLE handle, uint32_t uType) 133 { 134 if (handle < SHFLHANDLE_MAX && (pHandles[handle].uFlags & SHFL_HF_VALID)) 138 uintptr_t vbsfQueryHandle(PSHFLCLIENTDATA pClient, SHFLHANDLE handle, 139 uint32_t uType) 140 { 141 if ( handle < SHFLHANDLE_MAX 142 && (pHandles[handle].uFlags & SHFL_HF_VALID) 143 && pHandles[handle].pClient == pClient) 135 144 { 136 145 Assert((uType & SHFL_HF_TYPE_MASK) != 0); … … 142 151 } 143 152 144 SHFLHANDLE vbsfAllocDirHandle (void) 153 SHFLFILEHANDLE *vbsfQueryFileHandle(PSHFLCLIENTDATA pClient, SHFLHANDLE handle) 154 { 155 return (SHFLFILEHANDLE *)vbsfQueryHandle(pClient, handle, 156 SHFL_HF_TYPE_FILE); 157 } 158 159 SHFLFILEHANDLE *vbsfQueryDirHandle(PSHFLCLIENTDATA pClient, SHFLHANDLE handle) 160 { 161 return (SHFLFILEHANDLE *)vbsfQueryHandle(pClient, handle, 162 SHFL_HF_TYPE_DIR); 163 } 164 165 uint32_t vbsfQueryHandleType(PSHFLCLIENTDATA pClient, SHFLHANDLE handle) 166 { 167 if ( handle < SHFLHANDLE_MAX 168 && (pHandles[handle].uFlags & SHFL_HF_VALID) 169 && pHandles[handle].pClient == pClient) 170 return pHandles[handle].uFlags & SHFL_HF_TYPE_MASK; 171 else 172 return 0; 173 } 174 175 SHFLHANDLE vbsfAllocDirHandle(PSHFLCLIENTDATA pClient) 145 176 { 146 177 SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)RTMemAllocZ (sizeof (SHFLFILEHANDLE)); … … 149 180 { 150 181 pHandle->Header.u32Flags = SHFL_HF_TYPE_DIR; 151 return vbsfAllocHandle(pHandle->Header.u32Flags, (uintptr_t)pHandle); 182 return vbsfAllocHandle(pClient, pHandle->Header.u32Flags, 183 (uintptr_t)pHandle); 152 184 } 153 185 … … 155 187 } 156 188 157 SHFLHANDLE vbsfAllocFileHandle (void)189 SHFLHANDLE vbsfAllocFileHandle(PSHFLCLIENTDATA pClient) 158 190 { 159 191 SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)RTMemAllocZ (sizeof (SHFLFILEHANDLE)); … … 162 194 { 163 195 pHandle->Header.u32Flags = SHFL_HF_TYPE_FILE; 164 return vbsfAllocHandle(pHandle->Header.u32Flags, (uintptr_t)pHandle); 196 return vbsfAllocHandle(pClient, pHandle->Header.u32Flags, 197 (uintptr_t)pHandle); 165 198 } 166 199 … … 168 201 } 169 202 170 void vbsfFreeFileHandle (SHFLHANDLE hHandle) 171 { 172 SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(hHandle, SHFL_HF_TYPE_DIR|SHFL_HF_TYPE_FILE); 203 void vbsfFreeFileHandle(PSHFLCLIENTDATA pClient, SHFLHANDLE hHandle) 204 { 205 SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(pClient, 206 hHandle, SHFL_HF_TYPE_DIR|SHFL_HF_TYPE_FILE); 173 207 174 208 if (pHandle) 175 209 { 176 vbsfFreeHandle( hHandle);210 vbsfFreeHandle(pClient, hHandle); 177 211 RTMemFree (pHandle); 178 212 } -
trunk/src/VBox/HostServices/SharedFolders/shflhandle.h
r28800 r39544 60 60 61 61 62 SHFLHANDLE vbsfAllocDirHandle (void);63 SHFLHANDLE vbsfAllocFileHandle (void);64 void vbsfFreeFileHandle ( SHFLHANDLE hHandle);62 SHFLHANDLE vbsfAllocDirHandle(PSHFLCLIENTDATA pClient); 63 SHFLHANDLE vbsfAllocFileHandle(PSHFLCLIENTDATA pClient); 64 void vbsfFreeFileHandle (PSHFLCLIENTDATA pClient, SHFLHANDLE hHandle); 65 65 66 66 67 67 int vbsfInitHandleTable(); 68 68 int vbsfFreeHandleTable(); 69 SHFLHANDLE vbsfAllocHandle(uint32_t uType, uintptr_t pvUserData); 70 uintptr_t vbsfQueryHandle(SHFLHANDLE handle, uint32_t uType); 71 int vbsfFreeHandle(SHFLHANDLE handle); 69 SHFLHANDLE vbsfAllocHandle(PSHFLCLIENTDATA pClient, uint32_t uType, 70 uintptr_t pvUserData); 71 SHFLFILEHANDLE *vbsfQueryFileHandle(PSHFLCLIENTDATA pClient, 72 SHFLHANDLE handle); 73 SHFLFILEHANDLE *vbsfQueryDirHandle(PSHFLCLIENTDATA pClient, SHFLHANDLE handle); 74 uint32_t vbsfQueryHandleType(PSHFLCLIENTDATA pClient, 75 SHFLHANDLE handle); 72 76 73 77 #endif /* __SHFLHANDLE__H */ -
trunk/src/VBox/HostServices/SharedFolders/vbsf.cpp
r39542 r39544 858 858 if (RT_SUCCESS(rc)) 859 859 { 860 handle = vbsfAllocFileHandle( );860 handle = vbsfAllocFileHandle(pClient); 861 861 } 862 862 if (SHFL_HANDLE_NIL != handle) 863 863 { 864 864 rc = VERR_NO_MEMORY; /* If this fails - rewritten immediately on success. */ 865 pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(handle, SHFL_HF_TYPE_FILE);865 pHandle = vbsfQueryFileHandle(pClient, handle); 866 866 } 867 867 if (0 != pHandle) … … 986 986 if (SHFL_HANDLE_NIL != handle) 987 987 { 988 vbsfFreeFileHandle (handle);988 vbsfFreeFileHandle(pClient, handle); 989 989 } 990 990 pParms->Handle = SHFL_HANDLE_NIL; … … 1016 1016 * @note folders are created with fMode = 0777 1017 1017 */ 1018 static int vbsfOpenDir (const char *pszPath, SHFLCREATEPARMS *pParms) 1018 static int vbsfOpenDir(SHFLCLIENTDATA *pClient, const char *pszPath, 1019 SHFLCREATEPARMS *pParms) 1019 1020 { 1020 1021 LogFlow(("vbsfOpenDir: pszPath = %s, pParms = %p\n", pszPath, pParms)); … … 1022 1023 1023 1024 int rc = VERR_NO_MEMORY; 1024 SHFLHANDLE handle = vbsfAllocDirHandle( );1025 SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(handle, SHFL_HF_TYPE_DIR);1025 SHFLHANDLE handle = vbsfAllocDirHandle(pClient); 1026 SHFLFILEHANDLE *pHandle = vbsfQueryDirHandle(pClient, handle); 1026 1027 if (0 != pHandle) 1027 1028 { … … 1101 1102 if (SHFL_HANDLE_NIL != handle) 1102 1103 { 1103 vbsfFreeFileHandle (handle);1104 vbsfFreeFileHandle(pClient, handle); 1104 1105 } 1105 1106 pParms->Handle = SHFL_HANDLE_NIL; … … 1325 1326 if (BIT_FLAG(pParms->CreateFlags, SHFL_CF_DIRECTORY)) 1326 1327 { 1327 rc = vbsfOpenDir (pszFullPath, pParms);1328 rc = vbsfOpenDir(pClient, pszFullPath, pParms); 1328 1329 } 1329 1330 else … … 1364 1365 pClient, Handle)); 1365 1366 1366 SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(Handle, SHFL_HF_TYPE_DIR|SHFL_HF_TYPE_FILE); 1367 //Assert(pHandle); 1368 if (!pHandle) 1369 return VERR_INVALID_HANDLE; 1370 1371 switch (ShflHandleType (&pHandle->Header)) 1367 uint32_t type = vbsfQueryHandleType(pClient, Handle); 1368 Assert((type & ~(SHFL_HF_TYPE_DIR | SHFL_HF_TYPE_FILE)) == 0); 1369 1370 switch (type & (SHFL_HF_TYPE_DIR | SHFL_HF_TYPE_FILE)) 1372 1371 { 1373 1372 case SHFL_HF_TYPE_DIR: 1374 1373 { 1375 rc = vbsfCloseDir (pHandle);1374 rc = vbsfCloseDir(vbsfQueryDirHandle(pClient, Handle)); 1376 1375 break; 1377 1376 } 1378 1377 case SHFL_HF_TYPE_FILE: 1379 1378 { 1380 rc = vbsfCloseFile (pHandle);1379 rc = vbsfCloseFile(vbsfQueryFileHandle(pClient, Handle)); 1381 1380 break; 1382 1381 } 1383 1382 default: 1384 AssertFailed(); 1385 break; 1386 } 1387 vbsfFreeFileHandle(Handle); 1383 return VERR_INVALID_HANDLE; 1384 } 1385 vbsfFreeFileHandle(pClient, Handle); 1388 1386 1389 1387 Log(("vbsfClose: rc = %Rrc\n", rc)); … … 1406 1404 int vbsfRead (SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, uint64_t offset, uint32_t *pcbBuffer, uint8_t *pBuffer) 1407 1405 { 1408 SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(Handle, SHFL_HF_TYPE_FILE);1406 SHFLFILEHANDLE *pHandle = vbsfQueryFileHandle(pClient, Handle); 1409 1407 size_t count = 0; 1410 1408 int rc; … … 1449 1447 int vbsfWrite (SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, uint64_t offset, uint32_t *pcbBuffer, uint8_t *pBuffer) 1450 1448 { 1451 SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(Handle, SHFL_HF_TYPE_FILE);1449 SHFLFILEHANDLE *pHandle = vbsfQueryFileHandle(pClient, Handle); 1452 1450 size_t count = 0; 1453 1451 int rc; … … 1499 1497 int vbsfFlush(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle) 1500 1498 { 1501 SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(Handle, SHFL_HF_TYPE_FILE);1499 SHFLFILEHANDLE *pHandle = vbsfQueryFileHandle(pClient, Handle); 1502 1500 int rc = VINF_SUCCESS; 1503 1501 … … 1529 1527 uint32_t *pcbBuffer, uint8_t *pBuffer, uint32_t *pIndex, uint32_t *pcFiles) 1530 1528 { 1531 SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(Handle, SHFL_HF_TYPE_DIR);1529 SHFLFILEHANDLE *pHandle = vbsfQueryDirHandle(pClient, Handle); 1532 1530 PRTDIRENTRYEX pDirEntry = 0, pDirEntryOrg; 1533 1531 uint32_t cbDirEntry, cbBufferOrg; … … 1772 1770 int vbsfQueryFileInfo(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, uint32_t flags, uint32_t *pcbBuffer, uint8_t *pBuffer) 1773 1771 { 1774 SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(Handle, SHFL_HF_TYPE_DIR|SHFL_HF_TYPE_FILE);1772 uint32_t type = vbsfQueryHandleType(pClient, Handle); 1775 1773 int rc = VINF_SUCCESS; 1776 1774 SHFLFSOBJINFO *pObjInfo = (SHFLFSOBJINFO *)pBuffer; … … 1778 1776 1779 1777 1780 if (pHandle == 0 || pcbBuffer == 0 || pObjInfo == 0 || *pcbBuffer < sizeof(SHFLFSOBJINFO)) 1778 if ( !(type == SHFL_HF_TYPE_DIR || type == SHFL_HF_TYPE_FILE) 1779 || pcbBuffer == 0 1780 || pObjInfo == 0 1781 || *pcbBuffer < sizeof(SHFLFSOBJINFO)) 1781 1782 { 1782 1783 AssertFailed(); … … 1789 1790 *pcbBuffer = 0; 1790 1791 1791 if (pHandle->Header.u32Flags & SHFL_HF_TYPE_DIR) 1792 { 1792 if (type == SHFL_HF_TYPE_DIR) 1793 { 1794 SHFLFILEHANDLE *pHandle = vbsfQueryDirHandle(pClient, Handle); 1793 1795 rc = RTDirQueryInfo(pHandle->dir.Handle, &fileinfo, RTFSOBJATTRADD_NOTHING); 1794 1796 } 1795 1797 else 1796 1798 { 1799 SHFLFILEHANDLE *pHandle = vbsfQueryFileHandle(pClient, Handle); 1797 1800 rc = RTFileQueryInfo(pHandle->file.Handle, &fileinfo, RTFSOBJATTRADD_NOTHING); 1798 1801 #ifdef RT_OS_WINDOWS … … 1814 1817 static int vbsfSetFileInfo(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, uint32_t flags, uint32_t *pcbBuffer, uint8_t *pBuffer) 1815 1818 { 1816 SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(Handle, SHFL_HF_TYPE_DIR|SHFL_HF_TYPE_FILE);1819 uint32_t type = vbsfQueryHandleType(pClient, Handle); 1817 1820 int rc = VINF_SUCCESS; 1818 1821 SHFLFSOBJINFO *pSFDEntry; 1819 1822 1820 if (pHandle == 0 || pcbBuffer == 0 || pBuffer == 0 || *pcbBuffer < sizeof(SHFLFSOBJINFO)) 1823 if ( !(type == SHFL_HF_TYPE_DIR || type == SHFL_HF_TYPE_FILE) 1824 || pcbBuffer == 0 1825 || pBuffer == 0 1826 || *pcbBuffer < sizeof(SHFLFSOBJINFO)) 1821 1827 { 1822 1828 AssertFailed(); … … 1830 1836 1831 1837 /* Change only the time values that are not zero */ 1832 if (pHandle->Header.u32Flags & SHFL_HF_TYPE_DIR) 1833 { 1838 if (type == SHFL_HF_TYPE_DIR) 1839 { 1840 SHFLFILEHANDLE *pHandle = vbsfQueryDirHandle(pClient, Handle); 1834 1841 rc = RTDirSetTimes(pHandle->dir.Handle, 1835 1842 (RTTimeSpecGetNano(&pSFDEntry->AccessTime)) ? &pSFDEntry->AccessTime : NULL, … … 1841 1848 else 1842 1849 { 1850 SHFLFILEHANDLE *pHandle = vbsfQueryFileHandle(pClient, Handle); 1843 1851 rc = RTFileSetTimes(pHandle->file.Handle, 1844 1852 (RTTimeSpecGetNano(&pSFDEntry->AccessTime)) ? &pSFDEntry->AccessTime : NULL, … … 1859 1867 } 1860 1868 1861 if (pHandle->Header.u32Flags & SHFL_HF_TYPE_FILE) 1862 { 1869 if (type == SHFL_HF_TYPE_FILE) 1870 { 1871 SHFLFILEHANDLE *pHandle = vbsfQueryFileHandle(pClient, Handle); 1863 1872 /* Change file attributes if necessary */ 1864 1873 if (pSFDEntry->Attr.fMode) … … 1903 1912 static int vbsfSetEndOfFile(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, uint32_t flags, uint32_t *pcbBuffer, uint8_t *pBuffer) 1904 1913 { 1905 SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(Handle, SHFL_HF_TYPE_FILE);1914 SHFLFILEHANDLE *pHandle = vbsfQueryFileHandle(pClient, Handle); 1906 1915 int rc = VINF_SUCCESS; 1907 1916 SHFLFSOBJINFO *pSFDEntry; … … 2033 2042 int vbsfSetFSInfo(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, uint32_t flags, uint32_t *pcbBuffer, uint8_t *pBuffer) 2034 2043 { 2035 SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(Handle, SHFL_HF_TYPE_DIR|SHFL_HF_TYPE_FILE|SHFL_HF_TYPE_VOLUME); 2036 2037 if (pHandle == 0 || pcbBuffer == 0 || pBuffer == 0) 2044 uint32_t type = vbsfQueryHandleType(pClient, Handle) 2045 & (SHFL_HF_TYPE_DIR|SHFL_HF_TYPE_FILE|SHFL_HF_TYPE_VOLUME); 2046 2047 if (type == 0 || pcbBuffer == 0 || pBuffer == 0) 2038 2048 { 2039 2049 AssertFailed(); … … 2073 2083 int vbsfLock(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, uint64_t offset, uint64_t length, uint32_t flags) 2074 2084 { 2075 SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(Handle, SHFL_HF_TYPE_FILE);2085 SHFLFILEHANDLE *pHandle = vbsfQueryFileHandle(pClient, Handle); 2076 2086 uint32_t fRTLock = 0; 2077 2087 int rc; … … 2127 2137 int vbsfUnlock(SHFLCLIENTDATA *pClient, SHFLROOT root, SHFLHANDLE Handle, uint64_t offset, uint64_t length, uint32_t flags) 2128 2138 { 2129 SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(Handle, SHFL_HF_TYPE_FILE);2139 SHFLFILEHANDLE *pHandle = vbsfQueryFileHandle(pClient, Handle); 2130 2140 int rc; 2131 2141 … … 2329 2339 for (int i=0;i<SHFLHANDLE_MAX;i++) 2330 2340 { 2331 SHFLFILEHANDLE *pHandle = (SHFLFILEHANDLE *)vbsfQueryHandle(i, SHFL_HF_TYPE_MASK); 2332 2333 if (pHandle) 2341 SHFLHANDLE Handle = (SHFLHANDLE)i; 2342 if (vbsfQueryHandleType(pClient, Handle)) 2334 2343 { 2335 2344 Log(("Open handle %08x\n", i));
Note:
See TracChangeset
for help on using the changeset viewer.