void *FindLocalizedFile(_In_z_ LPCWSTR wzResourceDllName, LocalizedFileHandler lfh, _In_opt_z_ LPCWSTR modulePathW) { // find path of the modulePath MyString driverPath; MyString modulePath; ClrGetModuleFileName(GetModuleHandleW(modulePathW), modulePath); // Rip off the application name. MyStringIterator trailingSlashLocation = StrEndIter(modulePath); if (FindLast(modulePath, trailingSlashLocation, W('\\'))) MakeString(driverPath, modulePath, StrBeginIter(modulePath), trailingSlashLocation); else // If it's not a full path, look in the current directory driverPath = W("."); // return the first of the local directory's copy or the resource DLL on %PATH% void *hmod = LoadLocalFile(driverPath, wzResourceDllName, lfh); if (hmod == NULL) hmod = LoadSearchPath(wzResourceDllName, lfh); return hmod; }
//***************************************************************************** // This function will handle ignore codes and tell the user what is happening. //***************************************************************************** bool _DbgBreakCheck( LPCSTR szFile, int iLine, LPCSTR szExpr, BOOL fConstrained) { STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_FORBID_FAULT; STATIC_CONTRACT_DEBUG_ONLY; RaiseExceptionOnAssert(rTestAndRaise); if (DebugBreakOnAssert()) { DebugBreak(); } DBGIGNORE* pDBGIFNORE = GetDBGIGNORE(); _DBGIGNOREDATA *psData; int i; // Check for ignore all. for (i = 0, psData = pDBGIFNORE->Ptr(); i < pDBGIFNORE->Count(); i++, psData++) { if (psData->iLine == iLine && SString::_stricmp(psData->rcFile, szFile) == 0 && psData->bIgnore == true) { return false; } } CONTRACT_VIOLATION(FaultNotFatal | GCViolation | TakesLockViolation); SString debugOutput; SString dialogOutput; SString modulePath; SString dialogTitle; SString dialogIgnoreMessage; BOOL formattedMessages = FALSE; // If we are low on memory we cannot even format a message. If this happens we want to // contain the exception here but display as much information as we can about the exception. if (!fConstrained) { EX_TRY { ClrGetModuleFileName(0, modulePath); debugOutput.Printf( W("\nAssert failure(PID %d [0x%08x], Thread: %d [0x%04x]): %hs\n") W(" File: %hs Line: %d\n") W(" Image: "), GetCurrentProcessId(), GetCurrentProcessId(), GetCurrentThreadId(), GetCurrentThreadId(), szExpr, szFile, iLine); debugOutput.Append(modulePath); debugOutput.Append(W("\n\n")); // Change format for message box. The extra spaces in the title // are there to get around format truncation. dialogOutput.Printf( W("%hs\n\n%hs, Line: %d\n\nAbort - Kill program\nRetry - Debug\nIgnore - Keep running\n") W("\n\nImage:\n"), szExpr, szFile, iLine); dialogOutput.Append(modulePath); dialogOutput.Append(W("\n")); dialogTitle.Printf(W("Assert Failure (PID %d, Thread %d/0x%04x)"), GetCurrentProcessId(), GetCurrentThreadId(), GetCurrentThreadId()); dialogIgnoreMessage.Printf(W("Ignore the assert for the rest of this run?\nYes - Assert will never fire again.\nNo - Assert will continue to fire.\n\n%hs\nLine: %d\n"), szFile, iLine); formattedMessages = TRUE; } EX_CATCH { } EX_END_CATCH(SwallowAllExceptions); }