HRESULT CAsmLink::ImportFile2(LPCWSTR pszFilename, LPCWSTR pszTargetName, IMetaDataAssemblyImport *pAssemblyScopeIn, BOOL fSmartImport, mdToken *pFileToken, IMetaDataAssemblyImport **ppAssemblyScope, DWORD *pdwCountOfScopes) { ASSERT(m_bInited); LPWSTR newTarget = NULL; bool bNewTarget = false; IMetaDataAssemblyImport *pAImport = NULL; IMetaDataImport *pImport = NULL; mdAssembly tkAssembly; if (pszFilename && wcslen(pszFilename) > MAX_PATH) return FileNameTooLong(pszFilename); if (pszTargetName && wcslen(pszTargetName) > MAX_PATH) return FileNameTooLong(pszTargetName); // File name too long if (pszTargetName == NULL) newTarget = VSAllocStr(pszFilename); else newTarget = VSAllocStr(pszTargetName); if (_wcsicmp(newTarget, pszFilename) == 0) { } else { bNewTarget = true; } if ((pAImport = pAssemblyScopeIn) != NULL) { pAImport->AddRef(); } else { HRESULT hr = m_pDisp->OpenScope(pszFilename, ofRead | ofNoTypeLib, IID_IMetaDataAssemblyImport, (IUnknown**)&pAImport); if (FAILED(hr)) { *pFileToken = 0; if (ppAssemblyScope) *ppAssemblyScope = NULL; if (pdwCountOfScopes) *pdwCountOfScopes = 0; VSFree(newTarget); return hr; } } HRESULT hr; VERIFY(SUCCEEDED(hr = pAImport->QueryInterface( IID_IMetaDataImport, (void**)&pImport))); hr = pAImport->GetAssemblyFromScope( &tkAssembly); if (FAILED(hr)) { hr = S_FALSE; // This is NOT an assembly if (ppAssemblyScope) *ppAssemblyScope = NULL; if (pdwCountOfScopes) *pdwCountOfScopes = 1; *pFileToken = mdTokenNil; CFile* file = new CFile(newTarget, pImport, m_pError, this); if (bNewTarget) { if (SUCCEEDED(hr = file->SetSource(pszFilename))) hr = file->UpdateModuleName(); } pAImport->Release(); pImport->Release(); if (SUCCEEDED(hr) && SUCCEEDED(hr = m_pModules->AddFile( file, 0, pFileToken))) { if (fSmartImport) hr = file->ImportFile( NULL, NULL); *pFileToken = TokenFromRid(RidFromToken(*pFileToken), mdtModule); } if (ppAssemblyScope) *ppAssemblyScope = NULL; if (pdwCountOfScopes) *pdwCountOfScopes = 1; VSFree(newTarget); return hr == S_OK ? S_FALSE : hr; } else { // It is an Assembly CAssemblyFile* assembly = new CAssemblyFile( pszFilename, pAImport, pImport, m_pError, this); if (ppAssemblyScope) *ppAssemblyScope = pAImport; else pAImport->Release(); pImport->Release(); if (m_bDontDoHashes) assembly->DontDoHash(); hr = assembly->ImportAssembly(pdwCountOfScopes, fSmartImport, m_pDisp); if (SUCCEEDED(hr) && bNewTarget) hr = assembly->ReportError( ERR_CantRenameAssembly, mdTokenNil, NULL, pszFilename); if (FAILED(hr)) { delete assembly; VSFree(newTarget); return hr; } VSFree(newTarget); if (FAILED(hr = m_pImports->AddFile( assembly, 0, pFileToken))) delete assembly; return SUCCEEDED(hr) ? S_OK : hr; } }
HRESULT CMnProfiler::GetMethodInfo(FunctionID functionID, wstring& assemblyName, wstring& className, wstring& methodName, wstring& methodParameters) { IMetaDataImport* pIMetaDataImport = 0; HRESULT hr = S_OK; mdToken funcToken = 0; WCHAR szName[NAME_BUFFER_SIZE]; ClassID classId; ModuleID moduleId; hr = m_pICorProfilerInfo->GetFunctionInfo(functionID, &classId, &moduleId, &funcToken); if(SUCCEEDED(hr)) { AssemblyID assemblyID; ULONG cchModule; LPCBYTE baseLoadAddress; hr = m_pICorProfilerInfo->GetModuleInfo(moduleId, &baseLoadAddress, NAME_BUFFER_SIZE, &cchModule, szName, &assemblyID); if(SUCCEEDED(hr)) { AppDomainID appDomainId; hr = m_pICorProfilerInfo->GetAssemblyInfo(assemblyID, NAME_BUFFER_SIZE, &cchModule, szName, &appDomainId, &moduleId); if(SUCCEEDED(hr)) { assemblyName = wstring(szName, cchModule); hr = m_pICorProfilerInfo->GetTokenAndMetaDataFromFunction(functionID, IID_IMetaDataImport, (LPUNKNOWN *) &pIMetaDataImport, &funcToken); if(SUCCEEDED(hr)) { mdTypeDef classTypeDef; ULONG cchFunction; ULONG cchClass; PCCOR_SIGNATURE methodSignatureBlob; ULONG methodSignatureBlobSize; hr = pIMetaDataImport->GetMethodProps(funcToken, &classTypeDef, szName, NAME_BUFFER_SIZE, &cchFunction, 0, &methodSignatureBlob, &methodSignatureBlobSize, 0, 0); if (SUCCEEDED(hr)) { methodName = wstring(szName, cchFunction); if (CheckMethodName(methodName)) { hr = pIMetaDataImport->GetTypeDefProps(classTypeDef, szName, NAME_BUFFER_SIZE, &cchClass, 0, 0); if (SUCCEEDED(hr)) { className = wstring(szName, cchClass); if (CheckMethodName(className)) { hr = MnFunctionInfo::ParseFunctionParameters(pIMetaDataImport, funcToken, methodParameters); } else { hr = E_FAIL; } /*logs::Logger::OutputInfo(_T("%s: Method \"%s\" Class %s Signature %s"), _T(__FUNCTION__), methodName.c_str(), className.c_str(), methodParameters.c_str());*/ } } else { hr = E_FAIL; } } pIMetaDataImport->Release(); } } } } return hr; }