/*++ Revision History: 2-Feb-95 a-robw (Bob Watson) replaced Rtl... functions with local versions for Win95 replaced KdPrint calls with calls to local CapDbgPrint --*/ #include "cap.h" #ifdef i386 /*********************** CAP_SetJump ******************************* * * CAP_SetJmp(jmp_buf jmpBuf) * * * Purpose: Setup information from setjmp call for possible disposition * of a subsequent longjmp allso gets current datacell info * for longjmp * * Params: jmpBuf Environment array for longjmp * * * Return: -none- * * * History: * 12.19.92 MarkLea -- created * */ void CAP_SetJmp(jmp_buf jmpBuf) { PTHDBLK pthdblk; PJMPINFO pJmpInfo; LARGE_INTEGER liStart; LARGE_INTEGER liEnd; LONGLONG liWaste; SaveAllRegs (); SETCAPINUSE(); QueryPerformanceCounter (&liStart); pthdblk = GETCURTHDBLK(); pJmpInfo = &(pthdblk->jmpinfo); pJmpInfo->jmpBuf[pJmpInfo->nJmpCnt] = jmpBuf; pJmpInfo->ulCurCell[pJmpInfo->nJmpCnt] = pthdblk->ulCurCell; pJmpInfo->nJmpCnt++; QueryPerformanceCounter (&liEnd); liWaste = liEnd.QuadPart - liStart.QuadPart; liWaste += liWasteOverheadSavRes; pthdblk->liWasteCount += liWaste; SETUPPrint (("CAP: SetJmp() - liWaste = 0x%x%x\n", liWaste)); RESETCAPINUSE(); RestoreAllRegs (); _asm { mov esp,ebp pop ebp jmp setjmpaddr } } /* CAP_SetJmp () */ /*********************** CAP_LongJump ******************************* * * CAP_LongJmp(jmp_buf jmpBuf, int nRet) * * * Purpose: Intercepts lonkjmp call for disposition of CAP data and * to restore the datacell to the position at the time of the * associated setjmp call. Sets the current data cell pointer * to the pointer from the associated setjmp call. Cleans up * the data collection by calling PostPenter. * * Params: jmpBuf Environment array for restoring the stack * nRet return value for setjmp * * Return: -none- * * * History: * 12.19.92 MarkLea -- created * 12.21.92 MarkLea -- added what I hope is M-thread support * -- added call to PostPenter. * */ void CAP_LongJmp(jmp_buf jmpBuf, int nRet) { int nIndex; PTHDBLK pthdblk; PJMPINFO pJmpInfo; LARGE_INTEGER liStart; LARGE_INTEGER liEnd; LONGLONG liWaste; SaveAllRegs (); SETCAPINUSE(); QueryPerformanceCounter (&liStart); pthdblk = GETCURTHDBLK(); nIndex = 0; pJmpInfo = &(pthdblk->jmpinfo); // // Search for the correct jmpbuf and ulCurCell // while(jmpBuf != pJmpInfo->jmpBuf[nIndex]) { nIndex++; // // If we get here, there is something wrong, so abort the cap // if (nIndex == pJmpInfo->nJmpCnt) { CapDbgPrint ("CAP: CAP_LongJmp() - Too many setjmp() calls\n"); fProfiling=FALSE; } } // // Call PostPenter to cleanup the times from the current cell // //PostPenter(pthdblk); PostPenter(); SETCAPINUSE(); // PostPenter() resets this // // Set the Current cell to the one that was current when the // setjmp call was made // pthdblk->ulCurCell = pJmpInfo->ulCurCell[nIndex]; QueryPerformanceCounter (&liEnd); liWaste = liEnd.QuadPart - liStart.QuadPart; liWaste += liWasteOverheadSavRes; pthdblk->liWasteCount += liWaste; SETUPPrint (("CAP: LongJmp() - liWaste = 0x%x%x\n", liWaste)); RESETCAPINUSE(); RestoreAllRegs (); // // Now we need to call the original longjmp routine so we can complete // execution. // _asm { mov esp,ebp pop ebp jmp longjmpaddr } } /* CAP_LongJmp () */ #endif // ifdef i386 /*********************** CAP_LoadLibrary ******************************* * * CAP_LoadLibraryA (), * CAP_LoadLibraryExA (), * CAP_LoadLibraryW (), * CAP_LoadLibraryExW (), * * * Purpose: * * Params: -none- * * Return: -none- * * * History: * 12.19.92 MarkLea -- created * */ HANDLE CAP_LoadLibraryA (LPCSTR lpName) { PTHDBLK pthdblk; LARGE_INTEGER liStart; LARGE_INTEGER liEnd; LONGLONG liWaste; HANDLE hLib; hLib = LoadLibraryA (lpName); SETCAPINUSE(); if (hLib && (fProfiling || fPaused)) { QueryPerformanceCounter (&liStart); SetupLibProfiling (lpName, TRUE); if ( pthdblk = GETCURTHDBLK() ) { QueryPerformanceCounter (&liEnd); liWaste = liEnd.QuadPart - liStart.QuadPart; liWaste += liWasteOverheadSavRes; pthdblk->liWasteCount += liWaste; SETUPPrint (("CAP: LoadLibraryA() - liWaste = 0x%x%x\n", liWaste)); } } RESETCAPINUSE(); return (hLib); } /* CAP_LoadLibraryA () */ /*********************** CAP_LoadLibrary *******************************/ HANDLE CAP_LoadLibraryExA (LPCSTR lpName, HANDLE hFile, DWORD dwFlags) { PTHDBLK pthdblk; LARGE_INTEGER liStart; LARGE_INTEGER liEnd; LONGLONG liWaste; HANDLE hLib; hLib = LoadLibraryExA (lpName, hFile, dwFlags); SETCAPINUSE(); if (hLib && (fProfiling || fPaused)) { QueryPerformanceCounter (&liStart); SetupLibProfiling (lpName, TRUE); if ( pthdblk = GETCURTHDBLK() ) { QueryPerformanceCounter (&liEnd); liWaste = liEnd.QuadPart - liStart.QuadPart; liWaste += liWasteOverheadSavRes; pthdblk->liWasteCount += liWaste; SETUPPrint (("CAP: LoadLibraryExA() - liWaste = 0x%x%x\n", liWaste)); } } RESETCAPINUSE(); return (hLib); } /* CAP_LoadLibraryExA () */ #ifndef _CHICAGO_ /*********************** CAP_LoadLibraryW *******************************/ HANDLE CAP_LoadLibraryW (LPCWSTR lpName) { PTHDBLK pthdblk; LARGE_INTEGER liStart; LARGE_INTEGER liEnd; LONGLONG liWaste; UNICODE_STRING ucImageName; STRING ImageName; HANDLE hLib; hLib = LoadLibraryW (lpName); SETCAPINUSE(); if (hLib && (fProfiling || fPaused)) { QueryPerformanceCounter (&liStart); CapInitUnicodeString (&ucImageName, lpName); CapUnicodeStringToAnsiString (&ImageName, &ucImageName, TRUE); SetupLibProfiling (ImageName.Buffer, TRUE); if ( pthdblk = GETCURTHDBLK() ) { QueryPerformanceCounter (&liEnd); liWaste = liEnd.QuadPart - liStart.QuadPart; liWaste += liWasteOverheadSavRes; pthdblk->liWasteCount += liWaste; SETUPPrint (("CAP: LoadLibraryW() - liWaste = 0x%x%x\n", liWaste)); } } RESETCAPINUSE(); return (hLib); } /* CAP_LoadLibraryW () */ /*********************** CAP_LoadLibraryExW *******************************/ HANDLE CAP_LoadLibraryExW (LPCWSTR lpName, HANDLE hFile, DWORD dwFlags) { PTHDBLK pthdblk; LARGE_INTEGER liStart; LARGE_INTEGER liEnd; LONGLONG liWaste; UNICODE_STRING ucImageName; STRING ImageName; HANDLE hLib; hLib = LoadLibraryExW (lpName, hFile, dwFlags); SETCAPINUSE(); if (hLib && (fProfiling || fPaused)) { QueryPerformanceCounter (&liStart); CapInitUnicodeString (&ucImageName, lpName); CapUnicodeStringToAnsiString (&ImageName, &ucImageName, TRUE); SetupLibProfiling (ImageName.Buffer, TRUE); if ( pthdblk = GETCURTHDBLK() ) { QueryPerformanceCounter (&liEnd); liWaste = liEnd.QuadPart - liStart.QuadPart; liWaste += liWasteOverheadSavRes; pthdblk->liWasteCount += liWaste; SETUPPrint (("CAP: LoadLibraryExW() - liWaste = 0x%x%x\n", liWaste)); } } RESETCAPINUSE(); return (hLib); } /* CAP_LoadLibraryExW () */ #endif // !_CHICAGO_