Default to using program files if where.exe doesn't find dotnet.exe (#578)
This commit is contained in:
parent
e035d0ed96
commit
9162ab3436
|
|
@ -145,10 +145,6 @@ HOSTFXR_UTILITY::GetStandaloneHostfxrParameters(
|
||||||
{
|
{
|
||||||
goto Finished;
|
goto Finished;
|
||||||
}
|
}
|
||||||
if (FAILED(hr = struHostFxrDllLocation->Copy(struDllPath)))
|
|
||||||
{
|
|
||||||
goto Finished;
|
|
||||||
}
|
|
||||||
|
|
||||||
Finished:
|
Finished:
|
||||||
|
|
||||||
|
|
@ -479,6 +475,7 @@ HOSTFXR_UTILITY::FindDotnetExePath(
|
||||||
DWORD dwNumBytesRead;
|
DWORD dwNumBytesRead;
|
||||||
DWORD dwFilePointer;
|
DWORD dwFilePointer;
|
||||||
DWORD dwBinaryType;
|
DWORD dwBinaryType;
|
||||||
|
DWORD dwPathSize = MAX_PATH;
|
||||||
INT index = 0;
|
INT index = 0;
|
||||||
INT prevIndex = 0;
|
INT prevIndex = 0;
|
||||||
BOOL fResult = FALSE;
|
BOOL fResult = FALSE;
|
||||||
|
|
@ -545,105 +542,135 @@ HOSTFXR_UTILITY::FindDotnetExePath(
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// where.exe will return 1 if the file is not found
|
// where.exe will return 0 on success, 1 if the file is not found
|
||||||
// and 2 if there was an error. Check if the exit code is 1 and set
|
// and 2 if there was an error. Check if the exit code is 1 and set
|
||||||
// a new hr result saying it couldn't find dotnet.exe
|
// a new hr result saying it couldn't find dotnet.exe
|
||||||
//
|
//
|
||||||
if (!GetExitCodeProcess(processInformation.hProcess, &dwExitCode) ||
|
if (!GetExitCodeProcess(processInformation.hProcess, &dwExitCode))
|
||||||
dwExitCode != 0)
|
|
||||||
{
|
{
|
||||||
if (dwExitCode == 1)
|
goto Fallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// In this block, if anything fails, we will goto our fallback of
|
||||||
|
// looking in C:/Program Files/
|
||||||
|
//
|
||||||
|
if (dwExitCode == 0)
|
||||||
|
{
|
||||||
|
// Where succeeded.
|
||||||
|
// Reset file pointer to the beginning of the file.
|
||||||
|
dwFilePointer = SetFilePointer(hStdOutReadPipe, 0, NULL, FILE_BEGIN);
|
||||||
|
if (dwFilePointer == INVALID_SET_FILE_POINTER)
|
||||||
{
|
{
|
||||||
hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
|
goto Fallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// As the call to where.exe succeeded (dotnet.exe was found), ReadFile should not hang.
|
||||||
|
// TODO consider putting ReadFile in a separate thread with a timeout to guarantee it doesn't block.
|
||||||
|
//
|
||||||
|
if (!ReadFile(hStdOutReadPipe, pzFileContents, READ_BUFFER_SIZE, &dwNumBytesRead, NULL))
|
||||||
|
{
|
||||||
|
goto Fallback;
|
||||||
|
}
|
||||||
|
if (dwNumBytesRead >= READ_BUFFER_SIZE)
|
||||||
|
{
|
||||||
|
// This shouldn't ever be this large. We could continue to call ReadFile in a loop,
|
||||||
|
// however I'd rather error out here and report an issue.
|
||||||
|
goto Fallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FAILED(hr = struDotnetLocationsString.CopyA(pzFileContents, dwNumBytesRead)))
|
||||||
|
{
|
||||||
|
goto Finished;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check the bitness of the currently running process
|
||||||
|
// matches the dotnet.exe found.
|
||||||
|
if (!IsWow64Process(GetCurrentProcess(), &fIsWow64Process))
|
||||||
|
{
|
||||||
|
// Calling IsWow64Process failed
|
||||||
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
||||||
|
goto Finished;
|
||||||
|
}
|
||||||
|
if (fIsWow64Process)
|
||||||
|
{
|
||||||
|
// 32 bit mode
|
||||||
|
fIsCurrentProcess64Bit = FALSE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
hr = HRESULT_FROM_WIN32(GetLastError());
|
SYSTEM_INFO systemInfo;
|
||||||
|
GetNativeSystemInfo(&systemInfo);
|
||||||
|
fIsCurrentProcess64Bit = systemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!fFound)
|
||||||
|
{
|
||||||
|
index = struDotnetLocationsString.IndexOf(L"\r\n", prevIndex);
|
||||||
|
if (index == -1)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (FAILED(hr = struDotnetSubstring.Copy(struDotnetLocationsString.QueryStr(), index - prevIndex)))
|
||||||
|
{
|
||||||
|
goto Finished;
|
||||||
|
}
|
||||||
|
prevIndex = index;
|
||||||
|
|
||||||
|
if (GetBinaryTypeW(struDotnetSubstring.QueryStr(), &dwBinaryType) &&
|
||||||
|
fIsCurrentProcess64Bit == (dwBinaryType == SCS_64BIT_BINARY)) {
|
||||||
|
// Found a valid dotnet.
|
||||||
|
if (FAILED(hr = struDotnetPath->Copy(struDotnetSubstring)))
|
||||||
|
{
|
||||||
|
goto Finished;
|
||||||
|
}
|
||||||
|
fFound = TRUE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
goto Finished;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset file pointer to the beginning of the file.
|
Fallback:
|
||||||
dwFilePointer = SetFilePointer(hStdOutReadPipe, 0, NULL, FILE_BEGIN);
|
|
||||||
if (dwFilePointer == INVALID_SET_FILE_POINTER)
|
|
||||||
{
|
|
||||||
hr = HRESULT_FROM_WIN32(ERROR_FILE_INVALID);
|
|
||||||
goto Finished;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// As the call to where.exe succeeded (dotnet.exe was found), ReadFile should not hang.
|
|
||||||
// TODO consider putting ReadFile in a separate thread with a timeout to guarantee it doesn't block.
|
|
||||||
//
|
|
||||||
if (!ReadFile(hStdOutReadPipe, pzFileContents, READ_BUFFER_SIZE, &dwNumBytesRead, NULL))
|
|
||||||
{
|
|
||||||
hr = HRESULT_FROM_WIN32(ERROR_FILE_INVALID);
|
|
||||||
goto Finished;
|
|
||||||
}
|
|
||||||
if (dwNumBytesRead >= READ_BUFFER_SIZE)
|
|
||||||
{
|
|
||||||
// This shouldn't ever be this large. We could continue to call ReadFile in a loop,
|
|
||||||
// however I'd rather error out here and report an issue.
|
|
||||||
hr = HRESULT_FROM_WIN32(ERROR_FILE_TOO_LARGE);
|
|
||||||
goto Finished;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (FAILED(hr = struDotnetLocationsString.CopyA(pzFileContents, dwNumBytesRead)))
|
|
||||||
{
|
|
||||||
goto Finished;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check the bitness of the currently running process
|
|
||||||
// matches the dotnet.exe found.
|
|
||||||
if (!IsWow64Process(GetCurrentProcess(), &fIsWow64Process))
|
|
||||||
{
|
|
||||||
// Calling IsWow64Process failed
|
|
||||||
hr = HRESULT_FROM_WIN32(GetLastError());
|
|
||||||
goto Finished;
|
|
||||||
}
|
|
||||||
if (fIsWow64Process)
|
|
||||||
{
|
|
||||||
// 32 bit mode
|
|
||||||
fIsCurrentProcess64Bit = FALSE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SYSTEM_INFO systemInfo;
|
|
||||||
GetNativeSystemInfo(&systemInfo);
|
|
||||||
fIsCurrentProcess64Bit = systemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// Look in ProgramFiles
|
||||||
while (!fFound)
|
while (!fFound)
|
||||||
{
|
{
|
||||||
index = struDotnetLocationsString.IndexOf(L"\r\n", prevIndex);
|
if (FAILED(hr = struDotnetSubstring.Resize(dwPathSize)))
|
||||||
if (index == -1)
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (FAILED(hr = struDotnetSubstring.Copy(struDotnetLocationsString.QueryStr(), index - prevIndex)))
|
|
||||||
{
|
{
|
||||||
goto Finished;
|
goto Finished;
|
||||||
}
|
}
|
||||||
prevIndex = index;
|
|
||||||
|
|
||||||
if (!GetBinaryTypeW(struDotnetSubstring.QueryStr(), &dwBinaryType))
|
// Program files will changes based on the
|
||||||
|
dwNumBytesRead = GetEnvironmentVariable(L"ProgramFiles", struDotnetSubstring.QueryStr(), dwPathSize);
|
||||||
|
if (dwNumBytesRead == 0)
|
||||||
{
|
{
|
||||||
// TODO should we ignore this failure and continue to trying the next dotnet.exe?
|
|
||||||
hr = HRESULT_FROM_WIN32(GetLastError());
|
hr = HRESULT_FROM_WIN32(GetLastError());
|
||||||
goto Finished;
|
goto Finished;
|
||||||
}
|
}
|
||||||
if (fIsCurrentProcess64Bit == (dwBinaryType == SCS_64BIT_BINARY)) {
|
else if (dwNumBytesRead == dwPathSize)
|
||||||
// Found a valid dotnet.
|
{
|
||||||
struDotnetPath->Copy(struDotnetSubstring);
|
dwPathSize *= 2 + 30; // for dotnet substring
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (FAILED(hr = struDotnetSubstring.SyncWithBuffer()) ||
|
||||||
|
FAILED(hr = struDotnetSubstring.Append(L"\\dotnet\\dotnet.exe")))
|
||||||
|
{
|
||||||
|
goto Finished;
|
||||||
|
}
|
||||||
|
if (!UTILITY::CheckIfFileExists(struDotnetSubstring.QueryStr()))
|
||||||
|
{
|
||||||
|
hr = HRESULT_FROM_WIN32( GetLastError() );
|
||||||
|
goto Finished;
|
||||||
|
}
|
||||||
|
if (FAILED(hr = struDotnetPath->Copy(struDotnetSubstring)))
|
||||||
|
{
|
||||||
|
goto Finished;
|
||||||
|
}
|
||||||
fFound = TRUE;
|
fFound = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fFound)
|
|
||||||
{
|
|
||||||
hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);
|
|
||||||
goto Finished;
|
|
||||||
}
|
|
||||||
|
|
||||||
Finished:
|
Finished:
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue