Changeset 3337
- Timestamp:
- Apr 22, 2020, 7:56:36 PM (5 years ago)
- Location:
- trunk/src
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kWorker/kWorker.c
r3335 r3337 50 50 51 51 #include "nt/ntstuff.h" 52 #include "nt/nthlp.h" 52 53 #include <psapi.h> 53 54 … … 8047 8048 8048 8049 8050 /** Kernel32 - GetFileAttributesExA. */ 8051 static BOOL WINAPI kwSandbox_Kernel32_GetFileAttributesExA(LPCSTR pszFilename, GET_FILEEX_INFO_LEVELS enmLevel, 8052 WIN32_FILE_ATTRIBUTE_DATA *pData) 8053 { 8054 BOOL fRet; 8055 const char *pszExt = kHlpGetExt(pszFilename); 8056 if (kwFsIsCacheableExtensionA(pszExt, K_TRUE /*fAttrQuery*/)) 8057 { 8058 KFSLOOKUPERROR enmError; 8059 PKFSOBJ pFsObj; 8060 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 8061 8062 pFsObj = kFsCacheLookupNoMissingA(g_pFsCache, pszFilename, &enmError); 8063 if (pFsObj) 8064 { 8065 kHlpAssert(pFsObj->fHaveStats); 8066 if (enmLevel == GetFileExInfoStandard) 8067 { 8068 pData->dwFileAttributes = pFsObj->Stats.st_attribs; 8069 pData->nFileSizeHigh = (KU64)pFsObj->Stats.st_size >> 32; 8070 pData->nFileSizeLow = (KU32)pFsObj->Stats.st_size; 8071 *(KU64 *)&pData->ftCreationTime = birdNtTimeFromTimeSpec(&pFsObj->Stats.st_birthtim); 8072 *(KU64 *)&pData->ftLastAccessTime = birdNtTimeFromTimeSpec(&pFsObj->Stats.st_atim); 8073 *(KU64 *)&pData->ftLastWriteTime = birdNtTimeFromTimeSpec(&pFsObj->Stats.st_mtim); 8074 kFsCacheObjRelease(g_pFsCache, pFsObj); 8075 } 8076 else 8077 { 8078 kFsCacheObjRelease(g_pFsCache, pFsObj); 8079 fRet = GetFileAttributesExA(pszFilename, enmLevel, pData); 8080 } 8081 } 8082 else 8083 { 8084 SetLastError(kwFsLookupErrorToWindowsError(enmError)); 8085 fRet = FALSE; 8086 } 8087 8088 KWFS_LOG(("GetFileAttributesA(%s,%d,) -> %d [cached]\n", pszFilename, enmLevel, fRet)); 8089 return fRet; 8090 } 8091 8092 fRet = GetFileAttributesExA(pszFilename, enmLevel, pData); 8093 KWFS_LOG(("GetFileAttributesExA(%s,%d,) -> %d\n", pszFilename, enmLevel, fRet)); 8094 return fRet; 8095 } 8096 8097 8098 /** Kernel32 - GetFileAttributesExW. */ 8099 static BOOL WINAPI kwSandbox_Kernel32_GetFileAttributesExW(LPCWSTR pwszFilename, GET_FILEEX_INFO_LEVELS enmLevel, 8100 WIN32_FILE_ATTRIBUTE_DATA *pData) 8101 { 8102 BOOL fRet; 8103 if (kwFsIsCacheablePathExtensionW(pwszFilename, K_TRUE /*fAttrQuery*/)) 8104 { 8105 KFSLOOKUPERROR enmError; 8106 PKFSOBJ pFsObj; 8107 kHlpAssert(GetCurrentThreadId() == g_Sandbox.idMainThread); 8108 8109 pFsObj = kFsCacheLookupNoMissingW(g_pFsCache, pwszFilename, &enmError); 8110 if (pFsObj) 8111 { 8112 kHlpAssert(pFsObj->fHaveStats); 8113 if (enmLevel == GetFileExInfoStandard) 8114 { 8115 pData->dwFileAttributes = pFsObj->Stats.st_attribs; 8116 pData->nFileSizeHigh = (KU64)pFsObj->Stats.st_size >> 32; 8117 pData->nFileSizeLow = (KU32)pFsObj->Stats.st_size; 8118 *(KU64 *)&pData->ftCreationTime = birdNtTimeFromTimeSpec(&pFsObj->Stats.st_birthtim); 8119 *(KU64 *)&pData->ftLastAccessTime = birdNtTimeFromTimeSpec(&pFsObj->Stats.st_atim); 8120 *(KU64 *)&pData->ftLastWriteTime = birdNtTimeFromTimeSpec(&pFsObj->Stats.st_mtim); 8121 kFsCacheObjRelease(g_pFsCache, pFsObj); 8122 } 8123 else 8124 { 8125 kFsCacheObjRelease(g_pFsCache, pFsObj); 8126 fRet = GetFileAttributesExW(pwszFilename, enmLevel, pData); 8127 } 8128 } 8129 else 8130 { 8131 SetLastError(kwFsLookupErrorToWindowsError(enmError)); 8132 fRet = FALSE; 8133 } 8134 8135 KWFS_LOG(("GetFileAttributesW(%ls,%d,) -> %d [cached]\n", pwszFilename, enmLevel, fRet)); 8136 return fRet; 8137 } 8138 8139 fRet = GetFileAttributesExW(pwszFilename, enmLevel, pData); 8140 KWFS_LOG(("GetFileAttributesExW(%ls,%d,) -> %d\n", pwszFilename, enmLevel, fRet)); 8141 return fRet; 8142 } 8143 8144 8049 8145 /** Kernel32 - GetShortPathNameW - c1[xx].dll of VS2010 does this to the 8050 8146 * directory containing each include file. We cache the result to speed … … 9890 9986 { TUPLE("GetFileAttributesA"), NULL, (KUPTR)kwSandbox_Kernel32_GetFileAttributesA }, 9891 9987 { TUPLE("GetFileAttributesW"), NULL, (KUPTR)kwSandbox_Kernel32_GetFileAttributesW }, 9988 { TUPLE("GetFileAttributesExA"), NULL, (KUPTR)kwSandbox_Kernel32_GetFileAttributesExA }, 9989 { TUPLE("GetFileAttributesExW"), NULL, (KUPTR)kwSandbox_Kernel32_GetFileAttributesExW }, 9892 9990 { TUPLE("GetShortPathNameW"), NULL, (KUPTR)kwSandbox_Kernel32_GetShortPathNameW }, 9893 9991 #ifdef WITH_TEMP_MEMORY_FILES … … 10029 10127 { TUPLE("GetFileAttributesA"), NULL, (KUPTR)kwSandbox_Kernel32_GetFileAttributesA }, 10030 10128 { TUPLE("GetFileAttributesW"), NULL, (KUPTR)kwSandbox_Kernel32_GetFileAttributesW }, 10129 { TUPLE("GetFileAttributesExA"), NULL, (KUPTR)kwSandbox_Kernel32_GetFileAttributesExA }, 10130 { TUPLE("GetFileAttributesExW"), NULL, (KUPTR)kwSandbox_Kernel32_GetFileAttributesExW }, 10031 10131 { TUPLE("GetShortPathNameW"), NULL, (KUPTR)kwSandbox_Kernel32_GetShortPathNameW }, 10032 10132 #ifdef WITH_TEMP_MEMORY_FILES -
trunk/src/lib/nt/nthlp.h
r3223 r3337 90 90 91 91 92 static __inline __int64 birdNtTimeFromTimeSpec(BirdTimeSpec_T const *pTimeSpec) 93 { 94 __int64 iNtTime = pTimeSpec->tv_sec * 10000000; 95 iNtTime += pTimeSpec->tv_nsec / 100; 96 iNtTime += BIRD_NT_EPOCH_OFFSET_UNIX_100NS; 97 return iNtTime; 98 } 99 100 92 101 static __inline void birdNtTimeToTimeVal(__int64 iNtTime, BirdTimeVal_T *pTimeVal) 93 102 {
Note:
See TracChangeset
for help on using the changeset viewer.