Changeset 3337 for trunk/src


Ignore:
Timestamp:
Apr 22, 2020, 7:56:36 PM (5 years ago)
Author:
bird
Message:

kWorker: Intercept GetFileAttributesExA/W for speeding up moc.exe (qt).

Location:
trunk/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kWorker/kWorker.c

    r3335 r3337  
    5050
    5151#include "nt/ntstuff.h"
     52#include "nt/nthlp.h"
    5253#include <psapi.h>
    5354
     
    80478048
    80488049
     8050/** Kernel32 - GetFileAttributesExA. */
     8051static 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. */
     8099static 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
    80498145/** Kernel32 - GetShortPathNameW - c1[xx].dll of VS2010 does this to the
    80508146 * directory containing each include file.  We cache the result to speed
     
    98909986    { TUPLE("GetFileAttributesA"),          NULL,       (KUPTR)kwSandbox_Kernel32_GetFileAttributesA },
    98919987    { TUPLE("GetFileAttributesW"),          NULL,       (KUPTR)kwSandbox_Kernel32_GetFileAttributesW },
     9988    { TUPLE("GetFileAttributesExA"),        NULL,       (KUPTR)kwSandbox_Kernel32_GetFileAttributesExA },
     9989    { TUPLE("GetFileAttributesExW"),        NULL,       (KUPTR)kwSandbox_Kernel32_GetFileAttributesExW },
    98929990    { TUPLE("GetShortPathNameW"),           NULL,       (KUPTR)kwSandbox_Kernel32_GetShortPathNameW },
    98939991#ifdef WITH_TEMP_MEMORY_FILES
     
    1002910127    { TUPLE("GetFileAttributesA"),          NULL,       (KUPTR)kwSandbox_Kernel32_GetFileAttributesA },
    1003010128    { TUPLE("GetFileAttributesW"),          NULL,       (KUPTR)kwSandbox_Kernel32_GetFileAttributesW },
     10129    { TUPLE("GetFileAttributesExA"),        NULL,       (KUPTR)kwSandbox_Kernel32_GetFileAttributesExA },
     10130    { TUPLE("GetFileAttributesExW"),        NULL,       (KUPTR)kwSandbox_Kernel32_GetFileAttributesExW },
    1003110131    { TUPLE("GetShortPathNameW"),           NULL,       (KUPTR)kwSandbox_Kernel32_GetShortPathNameW },
    1003210132#ifdef WITH_TEMP_MEMORY_FILES
  • trunk/src/lib/nt/nthlp.h

    r3223 r3337  
    9090
    9191
     92static __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
    92101static __inline void birdNtTimeToTimeVal(__int64 iNtTime, BirdTimeVal_T *pTimeVal)
    93102{
Note: See TracChangeset for help on using the changeset viewer.