static HRESULT GetLatestVersionFolder()

in src/InstrumentationEngine.ProfilerProxy/dllmain.cpp [131:221]


    static HRESULT GetLatestVersionFolder(_In_ CEventLogger& eventLogger, _In_ LPCWSTR wszProfilerPath, _Out_ std::wstring& versionFolder)
    {
        HRESULT hr = S_OK;

        //
        // Check configuration flags
        //

        WCHAR wszBuffer[2];
        ZeroMemory(wszBuffer, 2 * sizeof(WCHAR));
        bool useDebug = GetEnvironmentVariable(useDebugVar, wszBuffer, 2) > 0 && wcscmp(wszBuffer, _T("1")) == 0;

        ZeroMemory(wszBuffer, 2 * sizeof(WCHAR));
        bool usePreview = GetEnvironmentVariable(usePreviewVar, wszBuffer, 2) > 0 && wcscmp(wszBuffer, _T("1")) == 0;

        //
        // Iterate folders & compare versions
        //

        versionFolder.clear();

        WIN32_FIND_DATA findFileData;
        std::wstring profilerPathFilter = std::wstring(wszProfilerPath);

        // FilePattern is required for FindFirstFile to search
        // the wszProfilerPath directory rather than its parent.
        profilerPathFilter += _T("\\*");

        SafeFindFileHandle hSearchHandle = FindFirstFile(profilerPathFilter.c_str(), &findFileData);
        if (hSearchHandle == INVALID_HANDLE_VALUE)
        {
            eventLogger.LogError(_T("dllmain::GetLatestVersionFolder - No files or folders found"));
            return HRESULT_FROM_WIN32(GetLastError());
        }

        const InstrumentationEngineVersion* pLatestVersionFolder = nullptr;
        do {
            // Skip any files; we only want directories
            if ((findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0)
            {
                continue;
            }

            // Skip any invalid folder formats
            InstrumentationEngineVersion* pFolderVersion = nullptr;
            if (FAILED(InstrumentationEngineVersion::Create(findFileData.cFileName, &pFolderVersion)))
            {
                continue;
            }

            // Skip any versions that are filtered by configuration flags
            if (pFolderVersion->IsDebug() != useDebug ||
                (!usePreview && pFolderVersion->IsPreview()))
            {
                continue;
            }

            // Skip any folders without profiler
            BOOL hasProfiler;
            if (FAILED(HasProfilerDll(eventLogger, wszProfilerPath, pFolderVersion->GetVersionString().c_str(), &hasProfiler)) || !hasProfiler)
            {
                continue;
            }

            eventLogger.LogMessage(_T("dllmain::GetLatestVersionFolder - Found valid version folder '%s'"), pFolderVersion->GetVersionString().c_str());

            if (pLatestVersionFolder == nullptr ||
                pLatestVersionFolder->Compare(*pFolderVersion) < 0)
            {
                pLatestVersionFolder = pFolderVersion;
            }

        } while (FindNextFile(hSearchHandle, &findFileData));

        // Only return if no VersionFolder found
        DWORD dError = GetLastError();
        if (pLatestVersionFolder == nullptr)
        {
            eventLogger.LogError(_T("dllmain::GetLatestVersionFolder - Unable to find a valid versioned folder with profiler"));
            return E_UNEXPECTED;
        }
        else if(dError > 0 && dError != ERROR_NO_MORE_FILES)
        {
            versionFolder.clear();
            return HRESULT_FROM_WIN32(dError);
        }

        versionFolder = pLatestVersionFolder->GetVersionString();

        return S_OK;
    }