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;
}