HRESULT CAsmLink::LinkResource(mdAssembly AssemblyID, LPCWSTR pszFileName, LPCWSTR pszNewLocation, LPCWSTR pszResourceName, DWORD dwFlags) { ASSERT(m_bInited && !m_bPreClosed); ASSERT(AssemblyID == TokenFromRid(mdtAssembly, 1) || AssemblyID == AssemblyIsUBM); if (wcslen(pszFileName) > MAX_PATH) return FileNameTooLong(pszFileName); // File name too long HRESULT hr = S_OK; if (AssemblyID == AssemblyIsUBM) { hr = E_INVALIDARG; } else { if (pszNewLocation == NULL || pszNewLocation[0] == 0) pszNewLocation = pszFileName; CFile *file = NULL; file = new CFile( pszNewLocation, (IMetaDataEmit*)NULL, m_pError, this); if (file != NULL && pszNewLocation != NULL && pszNewLocation[0] != 0 && wcscmp(pszFileName, pszNewLocation) != 0) { if (FAILED(hr = file->SetSource(pszFileName))) { delete file; return hr; } } hr = m_pAssem->AddFile( file, ffContainsNoMetaData, NULL); if (SUCCEEDED(hr)) hr = m_pAssem->AddResource(file->GetFileToken(), pszResourceName, 0, dwFlags); else delete file; } return hr; }
HRESULT CAsmLink::SetAssemblyFile(LPCWSTR pszFilename, IMetaDataEmit *pEmitter, AssemblyFlags afFlags, mdAssembly *pAssemblyID) { ASSERT(m_bInited && !m_bPreClosed && !m_pAssem); ASSERT(pEmitter != NULL && pAssemblyID != NULL); HRESULT hr = E_FAIL; // NULL filename means 'InMemory' assembly, but we need a filename so convert it to the // empty string. if (pszFilename == NULL) { ASSERT(afFlags & afInMemory); pszFilename = L""; } if (FAILED(hr = SetNonAssemblyFlags(afFlags))) return hr; if (wcslen(pszFilename) > MAX_PATH) return FileNameTooLong(pszFilename); // File name too long CComPtr<IMetaDataAssemblyEmit> pAEmitter; hr = pEmitter->QueryInterface(IID_IMetaDataAssemblyEmit, (void**)&pAEmitter); if (SUCCEEDED(hr)) { m_pAssem = new CAssemblyFile(pszFilename, afFlags, pAEmitter, pEmitter, m_pError, this); *pAssemblyID = TokenFromRid(mdtAssembly, 1); } return hr; }
HRESULT CAsmLink::AddFile(mdAssembly AssemblyID, LPCWSTR pszFilename, DWORD dwFlags, IMetaDataEmit *pEmitter, mdFile * pFileToken) { ASSERT(m_bInited && !m_bPreClosed); ASSERT(AssemblyID == TokenFromRid(mdtAssembly, 1) || AssemblyID == AssemblyIsUBM); // NULL filename means 'InMemory' module, but we need a filename so convert it to the // empty string. if (pszFilename == NULL) pszFilename = L""; if (AssemblyID == AssemblyIsUBM) { if (m_pAssem == NULL) m_pAssem = new CAssemblyFile(m_pError, this); } if (wcslen(pszFilename) > MAX_PATH) return FileNameTooLong(pszFilename); // File name too long HRESULT hr = S_OK; CFile *file = new CFile(pszFilename, pEmitter, m_pError, this); if (FAILED(hr = m_pAssem->AddFile(file, dwFlags, pFileToken))) delete file; return hr; }
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; } }
int main(int argc, char* argv[]) { int iTestCase = 0; bErrorVerbose = true; char pszDecision[20]; for (;;) { // Get the pointers to the functions for disabling and enabling interception... getInterceptionDisablers(); uninterceptedPrint("=== HOLODECK FAULT TESTER 1.0 by TERRY LENTZ ===\n\n"); uninterceptedPrint("*** FILE FAULTS ***\n"); uninterceptedPrint("0 - File Not Found\t\t10 - File Cannot Be Created\n"); uninterceptedPrint("1 - File Cannot Be Accessed\t11 - Filename Too Long\n"); uninterceptedPrint("2 - Access Denied\t\t12 - Directory Read Only\n"); uninterceptedPrint("3 - Write Protected\t\t13 - Path Not Found\n"); uninterceptedPrint("4 - Crc Data Error\t\t14 - Directory Cannot Be Removed\n"); uninterceptedPrint("5 - Drive Cannot Seek Disk\t15 - Directory Not Empty\n"); uninterceptedPrint("6 - File In Use\t\t\t16 - Path Invalid\n"); uninterceptedPrint("7 - File Locked\t\t\t17 - Corrupt Structure\n"); uninterceptedPrint("8 - Disk Full\t\t\n"); uninterceptedPrint("9 - File Already Exists\t\t\n\n"); uninterceptedPrint("*** MEMORY FAULTS ***\n"); uninterceptedPrint("18 - Insufficient Memory\t\t21 - Invalid Address\n"); uninterceptedPrint("19 - Invalid Access To Location\t\t22 - Paging File Too Small\n"); uninterceptedPrint("20 - Segment Locked\t\t\n\n"); uninterceptedPrint("*** NETWORK FAULTS ***\n"); uninterceptedPrint("23 - Disconnected \t\t\t26 - Winsock Task Limit Reached\n"); uninterceptedPrint("24 - Network Not Installed\t\t27 - All Ports Unavailable\n"); uninterceptedPrint("25 - Wrong Winsock Version\t\t28 - Network is Down\n"); uninterceptedPrint("\nPlease enter the test that you would like to run: "); if (disableInterception != NULL) disableInterception(); scanf("%d", &iTestCase); if (enableInterception != NULL) enableInterception(); uninterceptedPrint("\n"); switch (iTestCase) { // FileNotFound case 0: uninterceptedPrint("=== TEST CASE: FileNotFound ===\n"); if (FileNotFound()) uninterceptedPrint("\nTEST Passed!\n"); else uninterceptedPrint("\nTEST Failed!\n"); break; // FileCannotBeAccessed case 1: uninterceptedPrint("=== TEST CASE: FileCannotBeAccessed ===\n"); if (FileCannotBeAccessed()) uninterceptedPrint("\nTEST Passed!\n"); else uninterceptedPrint("\nTEST Failed!\n"); break; // AccessDenied case 2: uninterceptedPrint("=== TEST CASE: AccessDenied ===\n"); if (AccessDenied()) uninterceptedPrint("\nTEST Passed!\n"); else uninterceptedPrint("\nTEST Failed!\n"); break; // WriteProtected case 3: uninterceptedPrint("=== TEST CASE: WriteProtected ===\n"); if (WriteProtected()) uninterceptedPrint("\nTEST Passed!\n"); else uninterceptedPrint("\nTEST Failed!\n"); break; // CrcDataError case 4: uninterceptedPrint("=== TEST CASE: CrcDataError ===\n"); if (CrcDataError()) uninterceptedPrint("\nTEST Passed!\n"); else uninterceptedPrint("\nTEST Failed!\n"); break; // DriveCannotSeekDisk case 5: uninterceptedPrint("=== TEST CASE: DriveCannotSeekDisk ===\n"); if (DriveCannotSeekDisk()) uninterceptedPrint("\nTEST Passed!\n"); else uninterceptedPrint("\nTEST Failed!\n"); break; // FileInUse case 6: uninterceptedPrint("=== TEST CASE: FileInUse ===\n"); if (FileInUse()) uninterceptedPrint("\nTEST Passed!\n"); else uninterceptedPrint("\nTEST Failed!\n"); break; // FileLocked case 7: uninterceptedPrint("=== TEST CASE: FileLocked ===\n"); if (FileLocked()) uninterceptedPrint("\nTEST Passed!\n"); else uninterceptedPrint("\nTEST Failed!\n"); break; // DiskFull case 8: uninterceptedPrint("=== TEST CASE: DiskFull ===\n"); if (DiskFull()) uninterceptedPrint("\nTEST Passed!\n"); else uninterceptedPrint("\nTEST Failed!\n"); break; // FileAlreadyExists case 9: uninterceptedPrint("=== TEST CASE: FileAlreadyExists ===\n"); if (FileAlreadyExists()) uninterceptedPrint("\nTEST Passed!\n"); else uninterceptedPrint("\nTEST Failed!\n"); break; // FileCannotBeCreated case 10: uninterceptedPrint("=== TEST CASE: FileCannotBeCreated ===\n"); if (FileCannotBeCreated()) uninterceptedPrint("\nTEST Passed!\n"); else uninterceptedPrint("\nTEST Failed!\n"); break; // FileNameTooLong case 11: uninterceptedPrint("=== TEST CASE: FileNameTooLong ===\n"); if (FileNameTooLong()) uninterceptedPrint("\nTEST Passed!\n"); else uninterceptedPrint("\nTEST Failed!\n"); break; // DirectoryReadOnly case 12: uninterceptedPrint("=== TEST CASE: DirectoryReadOnly ===\n"); if (DirectoryReadOnly()) uninterceptedPrint("\nTEST Passed!\n"); else uninterceptedPrint("\nTEST Failed!\n"); break; // PathNotFound case 13: uninterceptedPrint("=== TEST CASE: PathNotFound ===\n"); if (PathNotFound()) uninterceptedPrint("\nTEST Passed!\n"); else uninterceptedPrint("\nTEST Failed!\n"); break; // DirectoryCannotBeRemoved case 14: uninterceptedPrint("=== TEST CASE: DirectoryCannotBeRemoved ===\n"); if (DirectoryCannotBeRemoved()) uninterceptedPrint("\nTEST Passed!\n"); else uninterceptedPrint("\nTEST Failed!\n"); break; // DirectoryNotEmpty case 15: uninterceptedPrint("=== TEST CASE: DirectoryNotEmpty ===\n"); if (DirectoryNotEmpty()) uninterceptedPrint("\nTEST Passed!\n"); else uninterceptedPrint("\nTEST Failed!\n"); break; // PathInvalid case 16: uninterceptedPrint("=== TEST CASE: PathInvalid ===\n"); if (PathInvalid()) uninterceptedPrint("\nTEST Passed!\n"); else uninterceptedPrint("\nTEST Failed!\n"); break; // CorruptStructure case 17: uninterceptedPrint("=== TEST CASE: CorruptStructure ===\n"); if (CorruptStructure()) uninterceptedPrint("\nTEST Passed!\n"); else uninterceptedPrint("\nTEST Failed!\n"); break; // InsufficientMemory case 18: uninterceptedPrint("=== TEST CASE: InsufficientMemory ===\n"); if (InsufficientMemory()) uninterceptedPrint("\nTEST Passed!\n"); else uninterceptedPrint("\nTEST Failed!\n"); break; // InvalidAccessToLocation case 19: uninterceptedPrint("=== TEST CASE: InvalidAccessToLocation ===\n"); if (InvalidAccessToLocation()) uninterceptedPrint("\nTEST Passed!\n"); else uninterceptedPrint("\nTEST Failed!\n"); break; // SegmentLocked case 20: uninterceptedPrint("=== TEST CASE: SegmentLocked ===\n"); if (SegmentLocked()) uninterceptedPrint("\nTEST Passed!\n"); else uninterceptedPrint("\nTEST Failed!\n"); break; // InvalidAddress case 21: uninterceptedPrint("=== TEST CASE: InvalidAddress ===\n"); if (InvalidAddress()) uninterceptedPrint("\nTEST Passed!\n"); else uninterceptedPrint("\nTEST Failed!\n"); break; // PagingFileTooSmall case 22: uninterceptedPrint("=== TEST CASE: PagingFileTooSmall ===\n"); if (PagingFileTooSmall()) uninterceptedPrint("\nTEST Passed!\n"); else uninterceptedPrint("\nTEST Failed!\n"); break; // Disconnected case 23: uninterceptedPrint("=== TEST CASE: Disconnected ===\n"); if (Disconnected()) uninterceptedPrint("\nTEST Passed!\n"); else uninterceptedPrint("\nTEST Failed!\n"); break; // NetworkNotInstalled case 24: uninterceptedPrint("=== TEST CASE: NetworkNotInstalled ===\n"); if (NetworkNotInstalled()) uninterceptedPrint("\nTEST Passed!\n"); else uninterceptedPrint("\nTEST Failed!\n"); break; // WrongWinsockVersion case 25: uninterceptedPrint("=== TEST CASE: WrongWinsockVersion ===\n"); if (WrongWinsockVersion()) uninterceptedPrint("\nTEST Passed!\n"); else uninterceptedPrint("\nTEST Failed!\n"); break; // WinsockTaskLimitReached case 26: uninterceptedPrint("=== TEST CASE: WinsockTaskLimitReached ===\n"); if (WinsockTaskLimitReached()) uninterceptedPrint("\nTEST Passed!\n"); else uninterceptedPrint("\nTEST Failed!\n"); break; // AllPortsUnavailable case 27: uninterceptedPrint("=== TEST CASE: AllPortsUnavailable ===\n"); if (AllPortsUnavailable()) uninterceptedPrint("\nTEST Passed!\n"); else uninterceptedPrint("\nTEST Failed!\n"); break; // NetworkIsDown case 28: uninterceptedPrint("=== TEST CASE: NetworkIsDown ===\n"); if (NetworkIsDown()) uninterceptedPrint("\nTEST Passed!\n"); else uninterceptedPrint("\nTEST Failed!\n"); break; } uninterceptedPrint("\nWould You Like to Run Another Test (Y/N) ? "); if (disableInterception != NULL) disableInterception(); scanf("%s", pszDecision); if (enableInterception != NULL) enableInterception(); if ((_stricmp(pszDecision, "y"))) break; } return 0; }