FCIMPLEND FCIMPL0(StringObject*, SystemNative::GetRuntimeDirectory) { FCALL_CONTRACT; STRINGREF refRetVal = NULL; DWORD dwFile = MAX_LONGPATH+1; HELPER_METHOD_FRAME_BEGIN_RET_1(refRetVal); SString wszFilePathString; WCHAR * wszFile = wszFilePathString.OpenUnicodeBuffer(dwFile); HRESULT hr = GetInternalSystemDirectory(wszFile, &dwFile); wszFilePathString.CloseBuffer(dwFile); if(FAILED(hr)) COMPlusThrowHR(hr); dwFile--; // remove the trailing NULL if(dwFile) refRetVal = StringObject::NewString(wszFile, dwFile); HELPER_METHOD_FRAME_END(); return (StringObject*)OBJECTREFToObject(refRetVal); }
HRESULT FusionBind::GetVersion(LPWSTR pVersion, DWORD* pdwVersion) { HRESULT hr; WCHAR pCORSystem[_MAX_PATH]; DWORD dwCORSystem = _MAX_PATH; pCORSystem[0] = L'\0'; hr = GetInternalSystemDirectory(pCORSystem, &dwCORSystem); if(FAILED(hr)) return hr; if(dwCORSystem == 0) return E_FAIL; dwCORSystem--; // remove the null character if(dwCORSystem && pCORSystem[dwCORSystem-1] == L'\\') dwCORSystem--; // and the trailing slash if it exists WCHAR* pSeparator; WCHAR* pTail = pCORSystem + dwCORSystem; for(pSeparator = pCORSystem+dwCORSystem-1; pSeparator > pCORSystem && *pSeparator != L'\\';pSeparator--); if(*pSeparator == L'\\') pSeparator++; DWORD lgth = (DWORD)(pTail - pSeparator); if(lgth > *pdwVersion) { *pdwVersion = lgth+1; return HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER); } while(pSeparator < pTail) *pVersion++ = *pSeparator++; *pVersion = L'\0'; return S_OK; }