You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

3195 lines
207 KiB

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.13"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Pin: Controlling and Initializing</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td id="projectalign" style="padding-left: 0.5em;">
<div id="projectname">Pin
</div>
</td>
</tr>
</tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.13 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
$(function() {
initMenu('',true,false,'search.php','Search');
$(document).ready(function() { init_search(); });
});
</script>
<div id="main-nav"></div>
</div><!-- top -->
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
onmouseover="return searchBox.OnSearchSelectShow()"
onmouseout="return searchBox.OnSearchSelectHide()"
onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>
<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0"
name="MSearchResults" id="MSearchResults">
</iframe>
</div>
<div class="header">
<div class="summary">
<a href="#nested-classes">Classes</a> &#124;
<a href="#typedef-members">Typedefs</a> &#124;
<a href="#enum-members">Enumerations</a> &#124;
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">Controlling and Initializing</div> </div>
</div><!--header-->
<div class="contents">
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
Classes</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structCALL__APPLICATION__FUNCTION__PARAM.html">CALL_APPLICATION_FUNCTION_PARAM</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
Typedefs</h2></td></tr>
<tr class="memitem:ga9578251834f6ec47ac1a5c99ded59fe9"><td class="memItemLeft" align="right" valign="top">typedef <a class="el" href="group__PIN__CONTROL.html#ga8c5c16fb133375efa3a27d3a3900c603">EXCEPT_HANDLING_RESULT</a>(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga9578251834f6ec47ac1a5c99ded59fe9">LEVEL_PINCLIENT::INTERNAL_EXCEPTION_CALLBACK</a>) (<a class="el" href="group__PIN__THREAD__API.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a> tid, EXCEPTION_INFO *pExceptInfo, <a class="el" href="group__PHYSICAL__CONTEXT__API.html#ga3c6833a027db42b5d528a0c65cefbc07">PHYSICAL_CONTEXT</a> *pPhysCtxt, VOID *v)</td></tr>
<tr class="separator:ga9578251834f6ec47ac1a5c99ded59fe9"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gadfef9e89968c6491114d7ceae51ab61b"><td class="memItemLeft" align="right" valign="top">typedef VOID *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gadfef9e89968c6491114d7ceae51ab61b">LEVEL_PINCLIENT::PIN_CONFIGURATION_INFO</a></td></tr>
<tr class="separator:gadfef9e89968c6491114d7ceae51ab61b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gab3fdb5c00cacaeb25c3aa3db43b84fef"><td class="memItemLeft" align="right" valign="top">typedef VOID(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gab3fdb5c00cacaeb25c3aa3db43b84fef">LEVEL_PINCLIENT::REMOVE_INSTRUMENTATION_CALLBACK</a>) (VOID *v)</td></tr>
<tr class="separator:gab3fdb5c00cacaeb25c3aa3db43b84fef"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gad93663f939ea407871c840249f006f33"><td class="memItemLeft" align="right" valign="top">typedef VOID(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gad93663f939ea407871c840249f006f33">LEVEL_PINCLIENT::DETACH_CALLBACK</a>) (VOID *v)</td></tr>
<tr class="separator:gad93663f939ea407871c840249f006f33"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga361f5aee528beb87f164a24ea821562a"><td class="memItemLeft" align="right" valign="top">typedef VOID(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga361f5aee528beb87f164a24ea821562a">LEVEL_PINCLIENT::DETACH_PROBED_CALLBACK</a>) (VOID *v)</td></tr>
<tr class="separator:ga361f5aee528beb87f164a24ea821562a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaa0a95b60754d6948bd2993e009667fbe"><td class="memItemLeft" align="right" valign="top">typedef VOID(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gaa0a95b60754d6948bd2993e009667fbe">LEVEL_PINCLIENT::ATTACH_PROBED_CALLBACK</a>) (VOID *v)</td></tr>
<tr class="separator:gaa0a95b60754d6948bd2993e009667fbe"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga9736b66161bfa0f18752e0d484862f85"><td class="memItemLeft" align="right" valign="top">typedef VOID(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga9736b66161bfa0f18752e0d484862f85">LEVEL_PINCLIENT::ATTACH_CALLBACK</a>) (VOID *v)</td></tr>
<tr class="separator:ga9736b66161bfa0f18752e0d484862f85"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga2dddda6b6e9c6d8958893aa552401d72"><td class="memItemLeft" align="right" valign="top">typedef VOID(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga2dddda6b6e9c6d8958893aa552401d72">LEVEL_PINCLIENT::APPLICATION_START_CALLBACK</a>) (VOID *v)</td></tr>
<tr class="separator:ga2dddda6b6e9c6d8958893aa552401d72"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gad158b812f88e6cd2d61036b3acae44b4"><td class="memItemLeft" align="right" valign="top">typedef VOID(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gad158b812f88e6cd2d61036b3acae44b4">LEVEL_PINCLIENT::PREPARE_FOR_FINI_CALLBACK</a>) (VOID *v)</td></tr>
<tr class="separator:gad158b812f88e6cd2d61036b3acae44b4"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaba48bfb240e26cdcb7829cae9d3ed779"><td class="memItemLeft" align="right" valign="top">typedef VOID(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gaba48bfb240e26cdcb7829cae9d3ed779">LEVEL_PINCLIENT::FINI_CALLBACK</a>) (INT32 code, VOID *v)</td></tr>
<tr class="separator:gaba48bfb240e26cdcb7829cae9d3ed779"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gabd102b3a57c3d84b65c4d5af80539097"><td class="memItemLeft" align="right" valign="top">typedef size_t(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gabd102b3a57c3d84b65c4d5af80539097">LEVEL_PINCLIENT::FETCH_CALLBACK</a>) (void *buf, ADDRINT addr, size_t size, EXCEPTION_INFO *pExceptInfo, VOID *v)</td></tr>
<tr class="separator:gabd102b3a57c3d84b65c4d5af80539097"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gad38f03cb81217ec22ce4d5415097cf99"><td class="memItemLeft" align="right" valign="top">typedef VOID(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gad38f03cb81217ec22ce4d5415097cf99">LEVEL_PINCLIENT::OUT_OF_MEMORY_CALLBACK</a>) (size_t size, VOID *v)</td></tr>
<tr class="separator:gad38f03cb81217ec22ce4d5415097cf99"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga59a53cc4fdf602553ab60f7ee4ca4c00"><td class="memItemLeft" align="right" valign="top">typedef ADDRINT(<a class="el" href="group__INST__ARGS.html#ga5d3025eb005b7ea4745799f0ee1b86a6">PIN_FAST_ANALYSIS_CALL</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga59a53cc4fdf602553ab60f7ee4ca4c00">LEVEL_PINCLIENT::MEMORY_ADDR_TRANS_CALLBACK</a>) (PIN_MEM_TRANS_INFO *memTransInfo, VOID *v)</td></tr>
<tr class="separator:ga59a53cc4fdf602553ab60f7ee4ca4c00"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gacaa6554b9595fcbf5f5a80ded1e1bced"><td class="memItemLeft" align="right" valign="top">typedef VOID(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gacaa6554b9595fcbf5f5a80ded1e1bced">LEVEL_PINCLIENT::FORK_CALLBACK</a>) (<a class="el" href="group__PIN__THREAD__API.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a> threadid, const <a class="el" href="group__CONTEXT__API.html#ga73f8f88949aaecf53a6d23f56399c676">CONTEXT</a> *ctxt, VOID *v)</td></tr>
<tr class="separator:gacaa6554b9595fcbf5f5a80ded1e1bced"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga53886d52f0a0c1dd12d8e938dc530365"><td class="memItemLeft" align="right" valign="top">typedef VOID(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga53886d52f0a0c1dd12d8e938dc530365">LEVEL_PINCLIENT::THREAD_START_CALLBACK</a>) (<a class="el" href="group__PIN__THREAD__API.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a> threadIndex, <a class="el" href="group__CONTEXT__API.html#ga73f8f88949aaecf53a6d23f56399c676">CONTEXT</a> *ctxt, INT32 flags, VOID *v)</td></tr>
<tr class="separator:ga53886d52f0a0c1dd12d8e938dc530365"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaa754d61b3a52358306370958274e2013"><td class="memItemLeft" align="right" valign="top">typedef VOID(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gaa754d61b3a52358306370958274e2013">LEVEL_PINCLIENT::THREAD_ATTACH_PROBED_CALLBACK</a>) (VOID *sigmask, VOID *v)</td></tr>
<tr class="separator:gaa754d61b3a52358306370958274e2013"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaad9e083b98d96b87afa850f33d92f9a3"><td class="memItemLeft" align="right" valign="top">typedef VOID(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gaad9e083b98d96b87afa850f33d92f9a3">LEVEL_PINCLIENT::THREAD_DETACH_PROBED_CALLBACK</a>) (VOID *v)</td></tr>
<tr class="separator:gaad9e083b98d96b87afa850f33d92f9a3"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaa4b59600ac32ad5dd0601bac3aa5aff1"><td class="memItemLeft" align="right" valign="top">typedef VOID(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gaa4b59600ac32ad5dd0601bac3aa5aff1">LEVEL_PINCLIENT::THREAD_ATTACH_CALLBACK</a>) (<a class="el" href="group__PIN__THREAD__API.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a> threadIndex, <a class="el" href="group__CONTEXT__API.html#ga73f8f88949aaecf53a6d23f56399c676">CONTEXT</a> *ctxt, VOID *v)</td></tr>
<tr class="separator:gaa4b59600ac32ad5dd0601bac3aa5aff1"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga399c9fcfab421902d1f9b797cc9189b1"><td class="memItemLeft" align="right" valign="top">typedef VOID(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga399c9fcfab421902d1f9b797cc9189b1">LEVEL_PINCLIENT::THREAD_DETACH_CALLBACK</a>) (<a class="el" href="group__PIN__THREAD__API.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a> threadIndex, const <a class="el" href="group__CONTEXT__API.html#ga73f8f88949aaecf53a6d23f56399c676">CONTEXT</a> *ctxt, VOID *v)</td></tr>
<tr class="separator:ga399c9fcfab421902d1f9b797cc9189b1"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaa56617d8763d8e0f90db638d7bf6bd39"><td class="memItemLeft" align="right" valign="top">typedef VOID(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gaa56617d8763d8e0f90db638d7bf6bd39">LEVEL_PINCLIENT::THREAD_FINI_CALLBACK</a>) (<a class="el" href="group__PIN__THREAD__API.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a> threadIndex, const <a class="el" href="group__CONTEXT__API.html#ga73f8f88949aaecf53a6d23f56399c676">CONTEXT</a> *ctxt, INT32 code, VOID *v)</td></tr>
<tr class="separator:gaa56617d8763d8e0f90db638d7bf6bd39"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga8f39acc1effd9b2d81b9e26762337070"><td class="memItemLeft" align="right" valign="top">typedef VOID(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga8f39acc1effd9b2d81b9e26762337070">LEVEL_PINCLIENT::CONTEXT_CHANGE_CALLBACK</a>) (<a class="el" href="group__PIN__THREAD__API.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a> threadIndex, <a class="el" href="group__PIN__CONTROL.html#ga8e4e6511a0e09fdc5ec7d6dbf395b3a8">CONTEXT_CHANGE_REASON</a> reason, const <a class="el" href="group__CONTEXT__API.html#ga73f8f88949aaecf53a6d23f56399c676">CONTEXT</a> *from, <a class="el" href="group__CONTEXT__API.html#ga73f8f88949aaecf53a6d23f56399c676">CONTEXT</a> *to, INT32 info, VOID *v)</td></tr>
<tr class="separator:ga8f39acc1effd9b2d81b9e26762337070"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga6ee371f87beed6c47af068b0631dd823"><td class="memItemLeft" align="right" valign="top">typedef BOOL(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga6ee371f87beed6c47af068b0631dd823">LEVEL_PINCLIENT::INTERCEPT_SIGNAL_CALLBACK</a>) (<a class="el" href="group__PIN__THREAD__API.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a> tid, INT32 sig, <a class="el" href="group__CONTEXT__API.html#ga73f8f88949aaecf53a6d23f56399c676">CONTEXT</a> *ctxt, BOOL hasHandler, const EXCEPTION_INFO *pExceptInfo, VOID *v)</td></tr>
<tr class="separator:ga6ee371f87beed6c47af068b0631dd823"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga697b2b9d4aad145efbed077f6a5a5c90"><td class="memItemLeft" align="right" valign="top">typedef VOID(*&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga697b2b9d4aad145efbed077f6a5a5c90">LEVEL_PINCLIENT::FORK_PROBE_MODE_CALLBACK</a>) (UINT32 childPid, VOID *v)</td></tr>
<tr class="separator:ga697b2b9d4aad145efbed077f6a5a5c90"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="enum-members"></a>
Enumerations</h2></td></tr>
<tr class="memitem:ga139152abe353fdff0216a5519d261c73"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga139152abe353fdff0216a5519d261c73">LEVEL_PINCLIENT::SYMBOL_INFO_MODE</a> { <br />
&#160;&#160;<a class="el" href="group__PIN__CONTROL.html#gga139152abe353fdff0216a5519d261c73af44e4b240fa01ca6ed3a64acf6022ce4">LEVEL_PINCLIENT::NO_SYMBOLS</a> = 0,
<br />
&#160;&#160;<a class="el" href="group__PIN__CONTROL.html#gga139152abe353fdff0216a5519d261c73a3486158cb738b76b7385310ec8f5b671">LEVEL_PINCLIENT::EXPORT_SYMBOLS</a> = (1&lt;&lt;0),
<br />
&#160;&#160;<a class="el" href="group__PIN__CONTROL.html#gga139152abe353fdff0216a5519d261c73a25bfc332ecb53ef24ee4ff743d09bde1">LEVEL_PINCLIENT::DEBUG_SYMBOLS</a> = (1&lt;&lt;1),
<br />
&#160;&#160;<a class="el" href="group__PIN__CONTROL.html#gga139152abe353fdff0216a5519d261c73aa07edbcaef24a5dbbe880f20916bd74e">LEVEL_PINCLIENT::IFUNC_SYMBOLS</a> = (1&lt;&lt;2),
<br />
&#160;&#160;<a class="el" href="group__PIN__CONTROL.html#gga139152abe353fdff0216a5519d261c73a172580d6ba02ac51ce4d3140bdafec07">LEVEL_PINCLIENT::DEBUG_OR_EXPORT_SYMBOLS</a> = (DEBUG_SYMBOLS | EXPORT_SYMBOLS)
<br />
}</td></tr>
<tr class="separator:ga139152abe353fdff0216a5519d261c73"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga0244f9b4e34e4eed7d483fa6ec7b70f0"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga0244f9b4e34e4eed7d483fa6ec7b70f0">LEVEL_PINCLIENT::SMC_ENABLE_DISABLE_TYPE</a> { <br />
&#160;&#160;<b>SMC_ENABLE</b>,
<br />
&#160;&#160;<b>SMC_DISABLE</b>
<br />
}</td></tr>
<tr class="separator:ga0244f9b4e34e4eed7d483fa6ec7b70f0"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gab459bf0034704bf1aa7fa7e192b7dc08"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gab459bf0034704bf1aa7fa7e192b7dc08">LEVEL_PINCLIENT::FPOINT</a> { <br />
&#160;&#160;<a class="el" href="group__PIN__CONTROL.html#ggab459bf0034704bf1aa7fa7e192b7dc08ad25e85d29c19e7e0c5a9a768191bbcd7">LEVEL_PINCLIENT::FPOINT_BEFORE</a>,
<br />
&#160;&#160;<a class="el" href="group__PIN__CONTROL.html#ggab459bf0034704bf1aa7fa7e192b7dc08ae95eedd3db4447dda41b3fe76c7013c6">LEVEL_PINCLIENT::FPOINT_AFTER_IN_PARENT</a>,
<br />
&#160;&#160;<a class="el" href="group__PIN__CONTROL.html#ggab459bf0034704bf1aa7fa7e192b7dc08ab97d0822ccc4bd553feab25fc85412fc">LEVEL_PINCLIENT::FPOINT_AFTER_IN_CHILD</a>
<br />
}</td></tr>
<tr class="separator:gab459bf0034704bf1aa7fa7e192b7dc08"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaf9a18d894714ae57264a2302638fc4b3"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gaf9a18d894714ae57264a2302638fc4b3">LEVEL_PINCLIENT::ATTACH_STATUS</a> { <br />
&#160;&#160;<a class="el" href="group__PIN__CONTROL.html#ggaf9a18d894714ae57264a2302638fc4b3ab479d68822d4264f3ad10880a5b21a3d">LEVEL_PINCLIENT::ATTACH_INITIATED</a>,
<br />
&#160;&#160;<a class="el" href="group__PIN__CONTROL.html#ggaf9a18d894714ae57264a2302638fc4b3a14afa31e2dadab79279e93630e18f671">LEVEL_PINCLIENT::ATTACH_FAILED_DETACH</a>
<br />
}</td></tr>
<tr class="separator:gaf9a18d894714ae57264a2302638fc4b3"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga8e4e6511a0e09fdc5ec7d6dbf395b3a8"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga8e4e6511a0e09fdc5ec7d6dbf395b3a8">CONTEXT_CHANGE_REASON</a> { <br />
&#160;&#160;<a class="el" href="group__PIN__CONTROL.html#gga8e4e6511a0e09fdc5ec7d6dbf395b3a8ae712c798df1d0e94022f6382a4c8239e">CONTEXT_CHANGE_REASON_FATALSIGNAL</a>,
<br />
&#160;&#160;<a class="el" href="group__PIN__CONTROL.html#gga8e4e6511a0e09fdc5ec7d6dbf395b3a8a43b8b032e969e0e5d14a3ed7385f29db">CONTEXT_CHANGE_REASON_SIGNAL</a>,
<br />
&#160;&#160;<a class="el" href="group__PIN__CONTROL.html#gga8e4e6511a0e09fdc5ec7d6dbf395b3a8a7e8b6943c9aa3a85b0a9cd23bc738dd9">CONTEXT_CHANGE_REASON_SIGRETURN</a>,
<br />
&#160;&#160;<a class="el" href="group__PIN__CONTROL.html#gga8e4e6511a0e09fdc5ec7d6dbf395b3a8a641c250ce491d66cc19f1205160dc279">CONTEXT_CHANGE_REASON_APC</a>,
<br />
&#160;&#160;<a class="el" href="group__PIN__CONTROL.html#gga8e4e6511a0e09fdc5ec7d6dbf395b3a8ae4c034a98f8eba91b2f8ac5b2543492b">CONTEXT_CHANGE_REASON_EXCEPTION</a>,
<br />
&#160;&#160;<a class="el" href="group__PIN__CONTROL.html#gga8e4e6511a0e09fdc5ec7d6dbf395b3a8a5b48097c22e4fcfdf12650129f364b50">CONTEXT_CHANGE_REASON_CALLBACK</a>
<br />
}</td></tr>
<tr class="separator:ga8e4e6511a0e09fdc5ec7d6dbf395b3a8"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga8c5c16fb133375efa3a27d3a3900c603"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga8c5c16fb133375efa3a27d3a3900c603">EXCEPT_HANDLING_RESULT</a> { <br />
&#160;&#160;<a class="el" href="group__PIN__CONTROL.html#gga8c5c16fb133375efa3a27d3a3900c603a32e365f541f4ea48f730a030185558cd">EHR_HANDLED</a>,
<br />
&#160;&#160;<a class="el" href="group__PIN__CONTROL.html#gga8c5c16fb133375efa3a27d3a3900c603ab394692e0b4ad2fda77e7597c75c9599">EHR_UNHANDLED</a>,
<br />
&#160;&#160;<a class="el" href="group__PIN__CONTROL.html#gga8c5c16fb133375efa3a27d3a3900c603a1950501612b017bd8db1634f7dc8bf8f">EHR_CONTINUE_SEARCH</a>
<br />
}</td></tr>
<tr class="separator:ga8c5c16fb133375efa3a27d3a3900c603"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga4e114852e46d5d839d6e71e242709777"><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga4e114852e46d5d839d6e71e242709777">PIN_CALLBACK_TYPE</a> { <br />
&#160;&#160;<a class="el" href="group__PIN__CONTROL.html#gga4e114852e46d5d839d6e71e242709777af6f04d87615566deb3bd49ec1e3468ef">PIN_CALLBACK_TYPE_NONE</a> = 0,
<br />
&#160;&#160;<a class="el" href="group__PIN__CONTROL.html#gga4e114852e46d5d839d6e71e242709777ae9e0416b9e54e38bc1cf69956f81bc2c">PIN_CALLBACK_TYPE_SYSCALL</a> = 1
<br />
}</td></tr>
<tr class="separator:ga4e114852e46d5d839d6e71e242709777"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
Functions</h2></td></tr>
<tr class="memitem:ga8cf4aca0b0bdbc7fc0ae965883d8e3c2"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga8cf4aca0b0bdbc7fc0ae965883d8e3c2">LEVEL_PINCLIENT::PIN_InitSymbols</a> ()</td></tr>
<tr class="separator:ga8cf4aca0b0bdbc7fc0ae965883d8e3c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gac133406ab660e13f67dd64f27cdf67c6"><td class="memItemLeft" align="right" valign="top">BOOL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gac133406ab660e13f67dd64f27cdf67c6">LEVEL_PINCLIENT::PIN_InitSymbolsAlt</a> (<a class="el" href="group__PIN__CONTROL.html#ga139152abe353fdff0216a5519d261c73">SYMBOL_INFO_MODE</a> mode)</td></tr>
<tr class="separator:gac133406ab660e13f67dd64f27cdf67c6"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga5f4e19c43f3de21d382c3c4e2442d961"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga5f4e19c43f3de21d382c3c4e2442d961">LEVEL_PINCLIENT::PIN_AddFollowChildProcessFunction</a> (<a class="el" href="group__CHILD__PROCESS__API.html#gaf1def25be0eafe4f4249392e7c67e72e">FOLLOW_CHILD_PROCESS_CALLBACK</a> fun, VOID *val)</td></tr>
<tr class="separator:ga5f4e19c43f3de21d382c3c4e2442d961"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga60adbdd03078851f0e2611ab06e17c19"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga60adbdd03078851f0e2611ab06e17c19">LEVEL_PINCLIENT::PIN_AddInternalExceptionHandler</a> (<a class="el" href="group__PIN__CONTROL.html#ga9578251834f6ec47ac1a5c99ded59fe9">INTERNAL_EXCEPTION_CALLBACK</a> fun, VOID *val)</td></tr>
<tr class="separator:ga60adbdd03078851f0e2611ab06e17c19"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga75d9372356e0cda2acb7f5851d328575"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga75d9372356e0cda2acb7f5851d328575">LEVEL_PINCLIENT::PIN_TryStart</a> (<a class="el" href="group__PIN__THREAD__API.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a> tid, <a class="el" href="group__PIN__CONTROL.html#ga9578251834f6ec47ac1a5c99ded59fe9">INTERNAL_EXCEPTION_CALLBACK</a> fun, VOID *val)</td></tr>
<tr class="separator:ga75d9372356e0cda2acb7f5851d328575"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga4b5c7f34928a2594509ba69baf404129"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga4b5c7f34928a2594509ba69baf404129">LEVEL_PINCLIENT::PIN_TryEnd</a> (<a class="el" href="group__PIN__THREAD__API.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a> tid)</td></tr>
<tr class="separator:ga4b5c7f34928a2594509ba69baf404129"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga294137f03b1d950d0f1f95968979b490"><td class="memItemLeft" align="right" valign="top">BOOL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga294137f03b1d950d0f1f95968979b490">LEVEL_PINCLIENT::PIN_IsProbeMode</a> ()</td></tr>
<tr class="separator:ga294137f03b1d950d0f1f95968979b490"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gabb4b02d78ee780c3b70e86a86ff798cd"><td class="memItemLeft" align="right" valign="top">BOOL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gabb4b02d78ee780c3b70e86a86ff798cd">LEVEL_PINCLIENT::PIN_IsAttaching</a> ()</td></tr>
<tr class="separator:gabb4b02d78ee780c3b70e86a86ff798cd"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga389d27155d820029712f396a2a824370"><td class="memItemLeft" align="right" valign="top">BOOL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga389d27155d820029712f396a2a824370">LEVEL_PINCLIENT::PIN_IsSafeForProbedInsertion</a> (ADDRINT addr)</td></tr>
<tr class="separator:ga389d27155d820029712f396a2a824370"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga163322863f36bbbeef986c94d319eef0"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga163322863f36bbbeef986c94d319eef0">LEVEL_PINCLIENT::PIN_InsertCallProbed</a> (ADDRINT addr, AFUNPTR funptr,...)</td></tr>
<tr class="separator:ga163322863f36bbbeef986c94d319eef0"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gadf5abd51ee9b1d599c539a9e2784e9ef"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gadf5abd51ee9b1d599c539a9e2784e9ef">LEVEL_PINCLIENT::PIN_LockClient</a> ()</td></tr>
<tr class="separator:gadf5abd51ee9b1d599c539a9e2784e9ef"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaa6239dd852b5236f75413209aceb7a79"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gaa6239dd852b5236f75413209aceb7a79">LEVEL_PINCLIENT::PIN_UnlockClient</a> ()</td></tr>
<tr class="separator:gaa6239dd852b5236f75413209aceb7a79"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga5ae5853e6600a23f9c552cba784870cc"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga5ae5853e6600a23f9c552cba784870cc">LEVEL_PINCLIENT::PIN_CallApplicationFunction</a> (const <a class="el" href="group__CONTEXT__API.html#ga73f8f88949aaecf53a6d23f56399c676">CONTEXT</a> *ctxt, <a class="el" href="group__PIN__THREAD__API.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a> tid, <a class="el" href="group__PROTO__API.html#gacfd9f3c8dc22310ce9b9152e8c61b17c">CALLINGSTD_TYPE</a> cstype, AFUNPTR origFunPtr, <a class="el" href="structCALL__APPLICATION__FUNCTION__PARAM.html">CALL_APPLICATION_FUNCTION_PARAM</a> *param,...)</td></tr>
<tr class="separator:ga5ae5853e6600a23f9c552cba784870cc"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gac167b8d28d255e53a0ac1f6e9edcd3ec"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gac167b8d28d255e53a0ac1f6e9edcd3ec">LEVEL_PINCLIENT::PIN_AddFiniFunction</a> (<a class="el" href="group__PIN__CONTROL.html#gaba48bfb240e26cdcb7829cae9d3ed779">FINI_CALLBACK</a> fun, VOID *val)</td></tr>
<tr class="separator:gac167b8d28d255e53a0ac1f6e9edcd3ec"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga3ca849f6b9c098afb7769e0845cc52c1"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga3ca849f6b9c098afb7769e0845cc52c1">LEVEL_PINCLIENT::PIN_AddPrepareForFiniFunction</a> (<a class="el" href="group__PIN__CONTROL.html#gad158b812f88e6cd2d61036b3acae44b4">PREPARE_FOR_FINI_CALLBACK</a> fun, VOID *val)</td></tr>
<tr class="separator:ga3ca849f6b9c098afb7769e0845cc52c1"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga50e51f92c7ea2b6d8b271ecf71a7db65"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga50e51f92c7ea2b6d8b271ecf71a7db65">LEVEL_PINCLIENT::PIN_AddFetchFunction</a> (<a class="el" href="group__PIN__CONTROL.html#gabd102b3a57c3d84b65c4d5af80539097">FETCH_CALLBACK</a> fun, VOID *val)</td></tr>
<tr class="separator:ga50e51f92c7ea2b6d8b271ecf71a7db65"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga29ad6213c90cfee4a67640798c0c2501"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga29ad6213c90cfee4a67640798c0c2501">LEVEL_PINCLIENT::PIN_FetchCode</a> (void *copyBuf, const VOID *address, size_t maxSize, EXCEPTION_INFO *pExceptInfo)</td></tr>
<tr class="separator:ga29ad6213c90cfee4a67640798c0c2501"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga897b98855a1853146f9d291687f41946"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga897b98855a1853146f9d291687f41946">LEVEL_PINCLIENT::PIN_AddOutOfMemoryFunction</a> (<a class="el" href="group__PIN__CONTROL.html#gad38f03cb81217ec22ce4d5415097cf99">OUT_OF_MEMORY_CALLBACK</a> fun, VOID *val)</td></tr>
<tr class="separator:ga897b98855a1853146f9d291687f41946"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga6d9a4cd860d8168ce1dab07da404752e"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga6d9a4cd860d8168ce1dab07da404752e">LEVEL_PINCLIENT::PIN_AddMemoryAddressTransFunction</a> (<a class="el" href="group__PIN__CONTROL.html#ga59a53cc4fdf602553ab60f7ee4ca4c00">MEMORY_ADDR_TRANS_CALLBACK</a> fun, VOID *val)</td></tr>
<tr class="separator:ga6d9a4cd860d8168ce1dab07da404752e"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga8852a4e2eb765b1356069037bdf05f83"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__PIN__CONTROL.html#ga59a53cc4fdf602553ab60f7ee4ca4c00">MEMORY_ADDR_TRANS_CALLBACK</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga8852a4e2eb765b1356069037bdf05f83">LEVEL_PINCLIENT::PIN_GetMemoryAddressTransFunction</a> ()</td></tr>
<tr class="separator:ga8852a4e2eb765b1356069037bdf05f83"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gafc04e55a26e3b74cdebb8c6a1bf5503b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gafc04e55a26e3b74cdebb8c6a1bf5503b">LEVEL_PINCLIENT::PIN_AddDetachFunction</a> (<a class="el" href="group__PIN__CONTROL.html#gad93663f939ea407871c840249f006f33">DETACH_CALLBACK</a> fun, VOID *val)</td></tr>
<tr class="separator:gafc04e55a26e3b74cdebb8c6a1bf5503b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gafd8d7788f12ec84f1c81074851ff716d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gafd8d7788f12ec84f1c81074851ff716d">LEVEL_PINCLIENT::PIN_AddDetachFunctionProbed</a> (<a class="el" href="group__PIN__CONTROL.html#ga361f5aee528beb87f164a24ea821562a">DETACH_PROBED_CALLBACK</a> fun, VOID *val)</td></tr>
<tr class="separator:gafd8d7788f12ec84f1c81074851ff716d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga93431bb0680a22395327ac7d8bb0c14c"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga93431bb0680a22395327ac7d8bb0c14c">LEVEL_PINCLIENT::PIN_AddThreadStartFunction</a> (<a class="el" href="group__PIN__CONTROL.html#ga53886d52f0a0c1dd12d8e938dc530365">THREAD_START_CALLBACK</a> fun, VOID *val)</td></tr>
<tr class="separator:ga93431bb0680a22395327ac7d8bb0c14c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga6bdae30ea6adc711a3ae04aed47bc222"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga6bdae30ea6adc711a3ae04aed47bc222">LEVEL_PINCLIENT::PIN_AddThreadAttachProbedFunction</a> (<a class="el" href="group__PIN__CONTROL.html#gaa754d61b3a52358306370958274e2013">THREAD_ATTACH_PROBED_CALLBACK</a> fun, VOID *val)</td></tr>
<tr class="separator:ga6bdae30ea6adc711a3ae04aed47bc222"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga697a1abfcdcc139915c008190aba9dcb"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga697a1abfcdcc139915c008190aba9dcb">LEVEL_PINCLIENT::PIN_AddThreadAttachFunction</a> (<a class="el" href="group__PIN__CONTROL.html#gaa4b59600ac32ad5dd0601bac3aa5aff1">THREAD_ATTACH_CALLBACK</a> fun, VOID *val)</td></tr>
<tr class="separator:ga697a1abfcdcc139915c008190aba9dcb"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gae579102abbf9c663827c82b867db63ad"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gae579102abbf9c663827c82b867db63ad">LEVEL_PINCLIENT::PIN_AddThreadDetachProbedFunction</a> (<a class="el" href="group__PIN__CONTROL.html#gaad9e083b98d96b87afa850f33d92f9a3">THREAD_DETACH_PROBED_CALLBACK</a> fun, VOID *val)</td></tr>
<tr class="separator:gae579102abbf9c663827c82b867db63ad"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga7f157496433d50573d2f025beca83e5a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga7f157496433d50573d2f025beca83e5a">LEVEL_PINCLIENT::PIN_AddThreadDetachFunction</a> (<a class="el" href="group__PIN__CONTROL.html#ga399c9fcfab421902d1f9b797cc9189b1">THREAD_DETACH_CALLBACK</a> fun, VOID *val)</td></tr>
<tr class="separator:ga7f157496433d50573d2f025beca83e5a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga4516c650e020cd12a5425b08588d2ae2"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga4516c650e020cd12a5425b08588d2ae2">LEVEL_PINCLIENT::PIN_AddApplicationStartFunction</a> (<a class="el" href="group__PIN__CONTROL.html#ga2dddda6b6e9c6d8958893aa552401d72">APPLICATION_START_CALLBACK</a> fun, VOID *val)</td></tr>
<tr class="separator:ga4516c650e020cd12a5425b08588d2ae2"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gae79d468cc5e19b450603f07f3397203d"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gae79d468cc5e19b450603f07f3397203d">LEVEL_PINCLIENT::PIN_AddThreadFiniFunction</a> (<a class="el" href="group__PIN__CONTROL.html#gaa56617d8763d8e0f90db638d7bf6bd39">THREAD_FINI_CALLBACK</a> fun, VOID *val)</td></tr>
<tr class="separator:gae79d468cc5e19b450603f07f3397203d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga786fd61c9be3c42a1a6deefc71dffadf"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga786fd61c9be3c42a1a6deefc71dffadf">LEVEL_PINCLIENT::PIN_AddContextChangeFunction</a> (<a class="el" href="group__PIN__CONTROL.html#ga8f39acc1effd9b2d81b9e26762337070">CONTEXT_CHANGE_CALLBACK</a> fun, VOID *val)</td></tr>
<tr class="separator:ga786fd61c9be3c42a1a6deefc71dffadf"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga240de32335a0aca3ceee37ad96b1dd12"><td class="memItemLeft" align="right" valign="top">BOOL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga240de32335a0aca3ceee37ad96b1dd12">LEVEL_PINCLIENT::PIN_InterceptSignal</a> (INT32 sig, <a class="el" href="group__PIN__CONTROL.html#ga6ee371f87beed6c47af068b0631dd823">INTERCEPT_SIGNAL_CALLBACK</a> fun, VOID *val)</td></tr>
<tr class="separator:ga240de32335a0aca3ceee37ad96b1dd12"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gac7795f34b4a267644e4d10b288c38d96"><td class="memItemLeft" align="right" valign="top">BOOL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gac7795f34b4a267644e4d10b288c38d96">LEVEL_PINCLIENT::PIN_UnblockSignal</a> (INT32 sig, BOOL enable)</td></tr>
<tr class="separator:gac7795f34b4a267644e4d10b288c38d96"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaec69b96ad1f34e000f56a06abfd1311b"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gaec69b96ad1f34e000f56a06abfd1311b">LEVEL_PINCLIENT::PIN_SetSmcSupport</a> (<a class="el" href="group__PIN__CONTROL.html#ga0244f9b4e34e4eed7d483fa6ec7b70f0">SMC_ENABLE_DISABLE_TYPE</a> enable_disable)</td></tr>
<tr class="separator:gaec69b96ad1f34e000f56a06abfd1311b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga7282900fb6160031936d8b63fecc4e21"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga7282900fb6160031936d8b63fecc4e21">LEVEL_PINCLIENT::PIN_AddForkFunction</a> (<a class="el" href="group__PIN__CONTROL.html#gab459bf0034704bf1aa7fa7e192b7dc08">FPOINT</a> point, <a class="el" href="group__PIN__CONTROL.html#gacaa6554b9595fcbf5f5a80ded1e1bced">FORK_CALLBACK</a> fun, VOID *val)</td></tr>
<tr class="separator:ga7282900fb6160031936d8b63fecc4e21"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga7f5784c3b9431086f3b5b750912ca0c2"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga7f5784c3b9431086f3b5b750912ca0c2">LEVEL_PINCLIENT::PIN_RemoveInstrumentation</a> ()</td></tr>
<tr class="separator:ga7f5784c3b9431086f3b5b750912ca0c2"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaf896499ed7402ef4e34baaa64626e0bd"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gaf896499ed7402ef4e34baaa64626e0bd">LEVEL_PINCLIENT::PIN_RemoveInstrumentationInRange</a> (ADDRINT start, ADDRINT end)</td></tr>
<tr class="separator:gaf896499ed7402ef4e34baaa64626e0bd"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gafc1635c2b2550236a66dcba25f9cc8a7"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gafc1635c2b2550236a66dcba25f9cc8a7">LEVEL_PINCLIENT::PIN_RemoveFiniFunctions</a> ()</td></tr>
<tr class="separator:gafc1635c2b2550236a66dcba25f9cc8a7"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga6277d16bf33ede39685a26a92fc3cbef"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga6277d16bf33ede39685a26a92fc3cbef">LEVEL_PINCLIENT::PIN_Detach</a> ()</td></tr>
<tr class="separator:ga6277d16bf33ede39685a26a92fc3cbef"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga4940c04f3fe39a87090c6872b9ba7e5a"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__PIN__CONTROL.html#gaf9a18d894714ae57264a2302638fc4b3">ATTACH_STATUS</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga4940c04f3fe39a87090c6872b9ba7e5a">LEVEL_PINCLIENT::PIN_Attach</a> (<a class="el" href="group__PIN__CONTROL.html#ga9736b66161bfa0f18752e0d484862f85">ATTACH_CALLBACK</a> fun, VOID *val)</td></tr>
<tr class="separator:ga4940c04f3fe39a87090c6872b9ba7e5a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga634584cd69b124a7edd58655010e295f"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga634584cd69b124a7edd58655010e295f">LEVEL_PINCLIENT::PIN_DetachProbed</a> ()</td></tr>
<tr class="separator:ga634584cd69b124a7edd58655010e295f"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga5630fbebba55f0b78adb96adccc8daf8"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__PIN__CONTROL.html#gaf9a18d894714ae57264a2302638fc4b3">ATTACH_STATUS</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga5630fbebba55f0b78adb96adccc8daf8">LEVEL_PINCLIENT::PIN_AttachProbed</a> (<a class="el" href="group__PIN__CONTROL.html#gaa0a95b60754d6948bd2993e009667fbe">ATTACH_PROBED_CALLBACK</a> fun, VOID *val)</td></tr>
<tr class="separator:ga5630fbebba55f0b78adb96adccc8daf8"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gabf3035f1cd239935bb4b9d45b39be266"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__PIN__CONTROL.html#gadfef9e89968c6491114d7ceae51ab61b">PIN_CONFIGURATION_INFO</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gabf3035f1cd239935bb4b9d45b39be266">LEVEL_PINCLIENT::PIN_CreateDefaultConfigurationInfo</a> ()</td></tr>
<tr class="separator:gabf3035f1cd239935bb4b9d45b39be266"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga48dd43d356a2b768c7c0d3cbc4e1fee6"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga48dd43d356a2b768c7c0d3cbc4e1fee6">LEVEL_PINCLIENT::PIN_SetAllowedConcurrentCallbacks</a> (<a class="el" href="group__PIN__CONTROL.html#gadfef9e89968c6491114d7ceae51ab61b">PIN_CONFIGURATION_INFO</a> options, <a class="el" href="group__PIN__CONTROL.html#ga4e114852e46d5d839d6e71e242709777">PIN_CALLBACK_TYPE</a> callbackType)</td></tr>
<tr class="separator:ga48dd43d356a2b768c7c0d3cbc4e1fee6"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gaded401aeb030a76ee3396137b06ad808"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gaded401aeb030a76ee3396137b06ad808">LEVEL_PINCLIENT::PIN_StartProgram</a> (<a class="el" href="group__PIN__CONTROL.html#gadfef9e89968c6491114d7ceae51ab61b">PIN_CONFIGURATION_INFO</a> options=<a class="el" href="group__PIN__CONTROL.html#gabf3035f1cd239935bb4b9d45b39be266">PIN_CreateDefaultConfigurationInfo</a>())</td></tr>
<tr class="separator:gaded401aeb030a76ee3396137b06ad808"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga01a31bf221500b0ca0b97fb64cc62247"><td class="memItemLeft" align="right" valign="top">VOID&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga01a31bf221500b0ca0b97fb64cc62247">LEVEL_PINCLIENT::PIN_StartProgramProbed</a> ()</td></tr>
<tr class="separator:ga01a31bf221500b0ca0b97fb64cc62247"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga1c358b4853587c9556c8d464c1bae643"><td class="memItemLeft" align="right" valign="top">const std::string &amp;&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga1c358b4853587c9556c8d464c1bae643">LEVEL_PINCLIENT::PIN_Version</a> ()</td></tr>
<tr class="separator:ga1c358b4853587c9556c8d464c1bae643"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga783d3bd40c3fb2ca51b1f9af31a70c9c"><td class="memItemLeft" align="right" valign="top">BOOL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga783d3bd40c3fb2ca51b1f9af31a70c9c">LEVEL_PINCLIENT::PIN_Init</a> (INT32 argc, CHAR **argv)</td></tr>
<tr class="separator:ga783d3bd40c3fb2ca51b1f9af31a70c9c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gab047eba18942e83814934eda278de607"><td class="memItemLeft" align="right" valign="top">CHAR *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gab047eba18942e83814934eda278de607">LEVEL_PINCLIENT::PIN_VmFullPath</a> ()</td></tr>
<tr class="separator:gab047eba18942e83814934eda278de607"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gac266390e4b69a624a88adcda64ac86c8"><td class="memItemLeft" align="right" valign="top">const CHAR *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gac266390e4b69a624a88adcda64ac86c8">LEVEL_PINCLIENT::PIN_ToolFullPath</a> ()</td></tr>
<tr class="separator:gac266390e4b69a624a88adcda64ac86c8"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga98669d2f5629027689d60bd852ffa0eb"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga98669d2f5629027689d60bd852ffa0eb">LEVEL_PINCLIENT::PIN_SafeCopy</a> (VOID *dst, const VOID *src, size_t size)</td></tr>
<tr class="separator:ga98669d2f5629027689d60bd852ffa0eb"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga271a2d60a060ddd0c13d6599afe8c0e2"><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga271a2d60a060ddd0c13d6599afe8c0e2">LEVEL_PINCLIENT::PIN_SafeCopyEx</a> (VOID *dst, const VOID *src, size_t size, EXCEPTION_INFO *pExceptInfo)</td></tr>
<tr class="separator:ga271a2d60a060ddd0c13d6599afe8c0e2"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gac671358905f7d4dac7d544b6048e3ee3"><td class="memItemLeft" align="right" valign="top">BOOL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gac671358905f7d4dac7d544b6048e3ee3">LEVEL_PINCLIENT::PIN_IsActionPending</a> (<a class="el" href="group__PIN__THREAD__API.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a> tid)</td></tr>
<tr class="separator:gac671358905f7d4dac7d544b6048e3ee3"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga4494aa98db78e24a10caec922404200e"><td class="memItemLeft" align="right" valign="top">UINT32&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga4494aa98db78e24a10caec922404200e">LEVEL_PINCLIENT::PIN_GetInitialThreadCount</a> ()</td></tr>
<tr class="separator:ga4494aa98db78e24a10caec922404200e"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga97c4af33bb0a330a0967c80c61fcd1c4"><td class="memItemLeft" align="right" valign="top">BOOL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga97c4af33bb0a330a0967c80c61fcd1c4">LEVEL_PINCLIENT::PIN_CheckReadAccess</a> (VOID *addr)</td></tr>
<tr class="separator:ga97c4af33bb0a330a0967c80c61fcd1c4"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gab1c7bfe02dcbcc4415ef03a7267a1b11"><td class="memItemLeft" align="right" valign="top">BOOL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gab1c7bfe02dcbcc4415ef03a7267a1b11">LEVEL_PINCLIENT::PIN_CheckWriteAccess</a> (VOID *addr)</td></tr>
<tr class="separator:gab1c7bfe02dcbcc4415ef03a7267a1b11"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ga0df38f14792706f4377486473c0bb382"><td class="memItemLeft" align="right" valign="top">ADDRINT&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#ga0df38f14792706f4377486473c0bb382">LEVEL_PINCLIENT::PIN_GetAuxVectorValue</a> (ADDRINT type, bool *found)</td></tr>
<tr class="separator:ga0df38f14792706f4377486473c0bb382"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:gac25229eab5d0cd015f9d52046771a81f"><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__PIN__CONTROL.html#gac25229eab5d0cd015f9d52046771a81f">LEVEL_PINCLIENT::PIN_AddForkFunctionProbed</a> (<a class="el" href="group__PIN__CONTROL.html#gab459bf0034704bf1aa7fa7e192b7dc08">FPOINT</a> point, <a class="el" href="group__PIN__CONTROL.html#ga697b2b9d4aad145efbed077f6a5a5c90">FORK_PROBE_MODE_CALLBACK</a> fun, VOID *val)</td></tr>
<tr class="separator:gac25229eab5d0cd015f9d52046771a81f"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<a name="details" id="details"></a><h2 class="groupheader">Detailed Description</h2>
<p>This group of functions is used to initialize Pin, start the application, and a call backs for events like application exit. </p>
<h2 class="groupheader">Typedef Documentation</h2>
<a id="ga2dddda6b6e9c6d8958893aa552401d72"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga2dddda6b6e9c6d8958893aa552401d72">&#9670;&nbsp;</a></span>APPLICATION_START_CALLBACK</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef VOID(* LEVEL_PINCLIENT::APPLICATION_START_CALLBACK) (VOID *v)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Call back function when pin initialization is finished.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">v</td><td>The tool's call-back value. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="ga9736b66161bfa0f18752e0d484862f85"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga9736b66161bfa0f18752e0d484862f85">&#9670;&nbsp;</a></span>ATTACH_CALLBACK</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef VOID(* LEVEL_PINCLIENT::ATTACH_CALLBACK) (VOID *v)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Call back function when Pin attaches to application in JIT mode</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">v</td><td>The tool's call-back value. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="gaa0a95b60754d6948bd2993e009667fbe"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gaa0a95b60754d6948bd2993e009667fbe">&#9670;&nbsp;</a></span>ATTACH_PROBED_CALLBACK</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef VOID(* LEVEL_PINCLIENT::ATTACH_PROBED_CALLBACK) (VOID *v)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Call back function when Pin attaches to application in Probe mode</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">v</td><td>The tool's call-back value. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="ga8f39acc1effd9b2d81b9e26762337070"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga8f39acc1effd9b2d81b9e26762337070">&#9670;&nbsp;</a></span>CONTEXT_CHANGE_CALLBACK</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef VOID(* LEVEL_PINCLIENT::CONTEXT_CHANGE_CALLBACK) (<a class="el" href="group__PIN__THREAD__API.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a> threadIndex, <a class="el" href="group__PIN__CONTROL.html#ga8e4e6511a0e09fdc5ec7d6dbf395b3a8">CONTEXT_CHANGE_REASON</a> reason, const <a class="el" href="group__CONTEXT__API.html#ga73f8f88949aaecf53a6d23f56399c676">CONTEXT</a> *from, <a class="el" href="group__CONTEXT__API.html#ga73f8f88949aaecf53a6d23f56399c676">CONTEXT</a> *to, INT32 info, VOID *v)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Call-back function when application changes context.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">threadIndex</td><td>The Pin thread ID of the thread that changes contexts. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">reason</td><td>Cause of the context change. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">from</td><td>Application's register state prior to the context change (NULL if <em>reason</em> is CONTEXT_CHANGE_REASON_CALLBACK). </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">to</td><td>Application's register state after context change (NULL if <em>reason</em> is CONTEXT_CHANGE_REASON_FATALSIGNAL). The tool may change this and affect the new register state. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">info</td><td>Additional information (depends on <em>reason</em>): <ul>
<li>CONTEXT_CHANGE_REASON_FATALSIGNAL: The Unix signal number. </li>
<li>CONTEXT_CHANGE_REASON_SIGNAL: The Unix signal number. </li>
<li>CONTEXT_CHANGE_REASON_EXCEPTION: The Windows exception code. </li>
</ul>
</td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">v</td><td>The tool's call-back value. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="gad93663f939ea407871c840249f006f33"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gad93663f939ea407871c840249f006f33">&#9670;&nbsp;</a></span>DETACH_CALLBACK</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef VOID(* LEVEL_PINCLIENT::DETACH_CALLBACK) (VOID *v)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Call back function when Pin detaches from application in JIT mode</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">v</td><td>The tool's call-back value. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="ga361f5aee528beb87f164a24ea821562a"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga361f5aee528beb87f164a24ea821562a">&#9670;&nbsp;</a></span>DETACH_PROBED_CALLBACK</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef VOID(* LEVEL_PINCLIENT::DETACH_PROBED_CALLBACK) (VOID *v)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Call back function when Pin detaches from application in Probe mode</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">v</td><td>The tool's call-back value. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="gabd102b3a57c3d84b65c4d5af80539097"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gabd102b3a57c3d84b65c4d5af80539097">&#9670;&nbsp;</a></span>FETCH_CALLBACK</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef size_t(* LEVEL_PINCLIENT::FETCH_CALLBACK) (void *buf, ADDRINT addr, size_t size, EXCEPTION_INFO *pExceptInfo, VOID *v)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Call back function that Pin will use to fetch code bytes to be jitted.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[out]</td><td class="paramname">buf</td><td>A buffer which receives the fetched instruction bytes. This buffer is at least <em>size</em> bytes long. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">addr</td><td>Starting address from which instruction bytes should be fetched. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">size</td><td>The number of bytes that should be fetched. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">pExceptInfo</td><td>If less than <em>size</em> bytes are fetched, <em>pExceptInfo</em> receives an exception that describes why more bytes could not be fetched. If Pin needs more bytes to decode the next instruction, this exception will be delivered to the application. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">v</td><td>The tool's call-back value.</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>The number of bytes sucessfully fetched into <em>buf</em>. This may be less than <em>size</em> (or even zero) if Pin attempts to fetch instructions from an invalid address. </dd></dl>
</div>
</div>
<a id="gaba48bfb240e26cdcb7829cae9d3ed779"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gaba48bfb240e26cdcb7829cae9d3ed779">&#9670;&nbsp;</a></span>FINI_CALLBACK</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef VOID(* LEVEL_PINCLIENT::FINI_CALLBACK) (INT32 code, VOID *v)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Call back function when application exits. It is called after all the per thread fini functions were called (registered via <a class="el" href="group__PIN__CONTROL.html#gae79d468cc5e19b450603f07f3397203d">PIN_AddThreadFiniFunction</a>). This function may be called on any application thread or internal thread spawned by the tool.</p>
<p>It is prohibited to access the TLS in this callback.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">code</td><td>O/S specific termination code for the application. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">v</td><td>The tool's call-back value. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="gacaa6554b9595fcbf5f5a80ded1e1bced"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gacaa6554b9595fcbf5f5a80ded1e1bced">&#9670;&nbsp;</a></span>FORK_CALLBACK</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef VOID(* LEVEL_PINCLIENT::FORK_CALLBACK) (<a class="el" href="group__PIN__THREAD__API.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a> threadid, const <a class="el" href="group__CONTEXT__API.html#ga73f8f88949aaecf53a6d23f56399c676">CONTEXT</a> *ctxt, VOID *v)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Call-back function when the application forks.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">threadId</td><td>Thread index </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">ctxt</td><td>Register state immediately before/after the fork. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">v</td><td>The tool's call-back value. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="ga697b2b9d4aad145efbed077f6a5a5c90"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga697b2b9d4aad145efbed077f6a5a5c90">&#9670;&nbsp;</a></span>FORK_PROBE_MODE_CALLBACK</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef VOID(* LEVEL_PINCLIENT::FORK_PROBE_MODE_CALLBACK) (UINT32 childPid, VOID *v)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Call-back function in probe mode for fork notification.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">childPid</td><td>Process id of the child process, available after fork in parent </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">v</td><td>The tool's call-back value. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="ga6ee371f87beed6c47af068b0631dd823"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga6ee371f87beed6c47af068b0631dd823">&#9670;&nbsp;</a></span>INTERCEPT_SIGNAL_CALLBACK</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef BOOL(* LEVEL_PINCLIENT::INTERCEPT_SIGNAL_CALLBACK) (<a class="el" href="group__PIN__THREAD__API.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a> tid, INT32 sig, <a class="el" href="group__CONTEXT__API.html#ga73f8f88949aaecf53a6d23f56399c676">CONTEXT</a> *ctxt, BOOL hasHandler, const EXCEPTION_INFO *pExceptInfo, VOID *v)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Call back function when the tool intercepts a signal with <a class="el" href="group__PIN__CONTROL.html#ga240de32335a0aca3ceee37ad96b1dd12">PIN_InterceptSignal()</a>.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">tid</td><td>The Pin thread ID of the thread that handled the signal. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">sig</td><td>The signal number. </td></tr>
<tr><td class="paramdir">[in,out]</td><td class="paramname">ctxt</td><td>The application's register state when it was interrupted by the signal. The tool may change this context if desired. If so, the application continues at the modified context. Or, if the application's signal handler is invoked, the handler is passed the modified context for its return context. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">hasHandler</td><td>TRUE if the application has a handler registered for this signal. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">pExceptInfo</td><td>If the signal represents an exception, <em>pExceptInfo</em> points to a description of the exception. If the signal is not an exception, <em>pExceptInfo</em> is NULL. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">v</td><td>The tool's call-back value.</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Returning TRUE tells Pin to pass the signal on to the application. Returning FALSE tells Pin to squash the signal and execution resumes at <em>ctxt</em>. </dd></dl>
</div>
</div>
<a id="ga9578251834f6ec47ac1a5c99ded59fe9"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga9578251834f6ec47ac1a5c99ded59fe9">&#9670;&nbsp;</a></span>INTERNAL_EXCEPTION_CALLBACK</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef <a class="el" href="group__PIN__CONTROL.html#ga8c5c16fb133375efa3a27d3a3900c603">EXCEPT_HANDLING_RESULT</a>(* LEVEL_PINCLIENT::INTERNAL_EXCEPTION_CALLBACK) (<a class="el" href="group__PIN__THREAD__API.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a> tid, EXCEPTION_INFO *pExceptInfo, <a class="el" href="group__PHYSICAL__CONTEXT__API.html#ga3c6833a027db42b5d528a0c65cefbc07">PHYSICAL_CONTEXT</a> *pPhysCtxt, VOID *v)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Handler (call-back) function when pin/tool generates internal exception. This function can be registered via <a class="el" href="group__PIN__CONTROL.html#ga60adbdd03078851f0e2611ab06e17c19">PIN_AddInternalExceptionHandler()</a> or <a class="el" href="group__PIN__CONTROL.html#ga75d9372356e0cda2acb7f5851d328575">PIN_TryStart()</a>. This function becomes active only after APPLICATION_START_CALLBACK notification is delivered. Any internal exception prior to this event can't be handled.</p>
<p>If the exception occurred while analysis routine is executed, it is legal to modify the execution control path using functions such as <a class="el" href="group__EXCEPTION__API.html#ga656279818bb8972fbdac576b57854561">PIN_RaiseException()</a> or <a class="el" href="group__CONTEXT__API.html#gaa836395fa2c09ed62f85d74b46970659">PIN_ExecuteAt()</a>. In this case, any per-thread INTERNAL_EXCEPTION_CALLBACK function registered via <a class="el" href="group__PIN__CONTROL.html#ga75d9372356e0cda2acb7f5851d328575">PIN_TryStart()</a> will be unregistered automatically (similar semantics to <a class="el" href="group__PIN__CONTROL.html#ga4b5c7f34928a2594509ba69baf404129">PIN_TryEnd()</a> for all registered notifications)</p>
<dl class="section note"><dt>Note</dt><dd>It is unsupported to call <a class="el" href="group__PIN__CONTROL.html#ga5ae5853e6600a23f9c552cba784870cc">PIN_CallApplicationFunction()</a> in the scope of this callback</dd></dl>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">tid</td><td>The Pin thread ID of the thread that generated the exception. </td></tr>
<tr><td class="paramdir">[in,out]</td><td class="paramname">pExceptInfo</td><td>Pointer to the EXCEPTION_INFO structure that describes the exception. If the exception should be raised in the context of the application (using <a class="el" href="group__EXCEPTION__API.html#ga656279818bb8972fbdac576b57854561">PIN_RaiseException()</a>), The tool should update the exception info to match the OS logic (e.g. update exception address using <a class="el" href="group__EXCEPTION__API.html#gae2086cd53a577f44e1b2ed32e9231816">PIN_SetExceptionAddress()</a>). </td></tr>
<tr><td class="paramdir">[in,out]</td><td class="paramname">pPhysCtxt</td><td>Physical register state when the exception was generated. The tool can change <em>pPhysCtxt</em> (make sure that if <a class="el" href="group__PIN__CONTROL.html#ga75d9372356e0cda2acb7f5851d328575">PIN_TryStart()</a> was called, matching <a class="el" href="group__PIN__CONTROL.html#ga4b5c7f34928a2594509ba69baf404129">PIN_TryEnd()</a> will be called) </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">v</td><td>The tool's call-back value.</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>an <em>EXCEPT_HANDLING_RESULT</em> value </dd></dl>
</div>
</div>
<a id="ga59a53cc4fdf602553ab60f7ee4ca4c00"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga59a53cc4fdf602553ab60f7ee4ca4c00">&#9670;&nbsp;</a></span>MEMORY_ADDR_TRANS_CALLBACK</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef ADDRINT(<a class="el" href="group__INST__ARGS.html#ga5d3025eb005b7ea4745799f0ee1b86a6">PIN_FAST_ANALYSIS_CALL</a> * LEVEL_PINCLIENT::MEMORY_ADDR_TRANS_CALLBACK) (PIN_MEM_TRANS_INFO *memTransInfo, VOID *v)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Call back function for pin/tool to modify memory address arguments in analysis routines. This feature allows users to register for a callback immediately prior to an analysis routine which gets one of the four IARG_MEMORY*_PTR as a parameter. The callback enables the user to manipulate the memory address pointed to by the aforementioned parameter. This function can be registered via <a class="el" href="group__PIN__CONTROL.html#ga6d9a4cd860d8168ce1dab07da404752e">PIN_AddMemoryAddressTransFunction()</a>. This function is called from the jitted code, so calls to this function are not serialized.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">memTransInfo</td><td>Memory address data structure </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">v</td><td>The tool's call-back value </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="gad38f03cb81217ec22ce4d5415097cf99"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gad38f03cb81217ec22ce4d5415097cf99">&#9670;&nbsp;</a></span>OUT_OF_MEMORY_CALLBACK</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef VOID(* LEVEL_PINCLIENT::OUT_OF_MEMORY_CALLBACK) (size_t size, VOID *v)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Call back function when pin/tool is out of memory. This function can be registered via <a class="el" href="group__PIN__CONTROL.html#ga897b98855a1853146f9d291687f41946">PIN_AddOutOfMemoryFunction()</a>.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">size</td><td>Size of the failed allocation </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">v</td><td>The tool's call-back value </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="gadfef9e89968c6491114d7ceae51ab61b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gadfef9e89968c6491114d7ceae51ab61b">&#9670;&nbsp;</a></span>PIN_CONFIGURATION_INFO</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef VOID* <a class="el" href="group__PIN__CONTROL.html#gadfef9e89968c6491114d7ceae51ab61b">LEVEL_PINCLIENT::PIN_CONFIGURATION_INFO</a></td>
</tr>
</table>
</div><div class="memdoc">
<p>Global configuration for Pin. Currently, this configuration includes whether Pin should serialize calls to some callbacks (for backward compatibility) or if it should concurrently call the callbacks (better for multi-threaded performance).</p>
<p>See also: <a class="el" href="group__PIN__CONTROL.html#ga48dd43d356a2b768c7c0d3cbc4e1fee6">PIN_SetAllowedConcurrentCallbacks()</a></p>
<dl class="section note"><dt>Note</dt><dd>A new instance of PIN_CONFIGURATION_INFO with default values should be created with <a class="el" href="group__PIN__CONTROL.html#gabf3035f1cd239935bb4b9d45b39be266">PIN_CreateDefaultConfigurationInfo()</a> </dd></dl>
</div>
</div>
<a id="gad158b812f88e6cd2d61036b3acae44b4"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gad158b812f88e6cd2d61036b3acae44b4">&#9670;&nbsp;</a></span>PREPARE_FOR_FINI_CALLBACK</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef VOID(* LEVEL_PINCLIENT::PREPARE_FOR_FINI_CALLBACK) (VOID *v)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Call back function invoked when Pin is about to detach from terminating process. The function that is registered by this callback may gracefully finish all the internal threads of the tool, e.g.</p><ul>
<li>Force all the internal threads of the tool to finish using return from the main function of the thread or calling PIN_ExitThread.</li>
<li>Wait until all the internal threads are finished before it will continue to run. : normal run of the internal threads after exit from all registered call back functions of this type is not guaranteed. : If current thread is an internal thread, do not finish it in this callback!</li>
</ul>
<p>This function is invoked in thread that initiated process termination. This function is registered via <a class="el" href="group__PIN__CONTROL.html#ga3ca849f6b9c098afb7769e0845cc52c1">PIN_AddPrepareForFiniFunction()</a>.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">v</td><td>The tool's call-back value </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="gab3fdb5c00cacaeb25c3aa3db43b84fef"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gab3fdb5c00cacaeb25c3aa3db43b84fef">&#9670;&nbsp;</a></span>REMOVE_INSTRUMENTATION_CALLBACK</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef VOID(* LEVEL_PINCLIENT::REMOVE_INSTRUMENTATION_CALLBACK) (VOID *v)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Call back function when Pin removes all old instrumented code from its cache</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">v</td><td>The tool's call-back value. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="gaa4b59600ac32ad5dd0601bac3aa5aff1"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gaa4b59600ac32ad5dd0601bac3aa5aff1">&#9670;&nbsp;</a></span>THREAD_ATTACH_CALLBACK</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef VOID(* LEVEL_PINCLIENT::THREAD_ATTACH_CALLBACK) (<a class="el" href="group__PIN__THREAD__API.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a> threadIndex, <a class="el" href="group__CONTEXT__API.html#ga73f8f88949aaecf53a6d23f56399c676">CONTEXT</a> *ctxt, VOID *v)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Call-back function when an attached thread starts to run under Pin in JIT mode.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">threadIndex</td><td>The Pin thread ID of the terminating thread. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">ctxt</td><td>Register state of the thread. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">v</td><td>The tool's call-back value. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="gaa754d61b3a52358306370958274e2013"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gaa754d61b3a52358306370958274e2013">&#9670;&nbsp;</a></span>THREAD_ATTACH_PROBED_CALLBACK</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef VOID(* LEVEL_PINCLIENT::THREAD_ATTACH_PROBED_CALLBACK) (VOID *sigmask, VOID *v)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Call-back function when an attached thread starts to run under Pin in probe mode. The tool receives the signal mask at the attach point and can modify it. The changes to this value will be applied when the thread continues to run. Pin does not validate the new signal mask so tools must take extra care when modifying this value.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in,out]</td><td class="paramname">sigmask</td><td>The thread's signal mask at the attach point. The tool may change this and affect the signal mask once the thread starts running again. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">v</td><td>The tool's call-back value. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="ga399c9fcfab421902d1f9b797cc9189b1"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga399c9fcfab421902d1f9b797cc9189b1">&#9670;&nbsp;</a></span>THREAD_DETACH_CALLBACK</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef VOID(* LEVEL_PINCLIENT::THREAD_DETACH_CALLBACK) (<a class="el" href="group__PIN__THREAD__API.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a> threadIndex, const <a class="el" href="group__CONTEXT__API.html#ga73f8f88949aaecf53a6d23f56399c676">CONTEXT</a> *ctxt, VOID *v)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Call-back function before an application thread is detached from Pin in JIT mode. The callback is received in the thread native context before Pin detach.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">threadIndex</td><td>The Pin thread ID of the terminating thread. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">ctxt</td><td>Register state of the thread immediately before it detaches. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">v</td><td>The tool's call-back value. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="gaad9e083b98d96b87afa850f33d92f9a3"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gaad9e083b98d96b87afa850f33d92f9a3">&#9670;&nbsp;</a></span>THREAD_DETACH_PROBED_CALLBACK</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef VOID(* LEVEL_PINCLIENT::THREAD_DETACH_PROBED_CALLBACK) (VOID *v)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Call-back function before an application thread is being detached from Pin in probe mode. The callback is received in the thread native context before probes removal.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">v</td><td>The tool's call-back value. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="gaa56617d8763d8e0f90db638d7bf6bd39"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gaa56617d8763d8e0f90db638d7bf6bd39">&#9670;&nbsp;</a></span>THREAD_FINI_CALLBACK</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef VOID(* LEVEL_PINCLIENT::THREAD_FINI_CALLBACK) (<a class="el" href="group__PIN__THREAD__API.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a> threadIndex, const <a class="el" href="group__CONTEXT__API.html#ga73f8f88949aaecf53a6d23f56399c676">CONTEXT</a> *ctxt, INT32 code, VOID *v)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Call-back function when thread ends.</p>
<p>This function may be called on a different thread than the given threadIndex.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">threadIndex</td><td>The Pin thread ID of the terminating thread. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">ctxt</td><td>Register state of the thread immediately before it terminates. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">code</td><td>O/S specific termination code for the thread. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">v</td><td>The tool's call-back value. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a id="ga53886d52f0a0c1dd12d8e938dc530365"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga53886d52f0a0c1dd12d8e938dc530365">&#9670;&nbsp;</a></span>THREAD_START_CALLBACK</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">typedef VOID(* LEVEL_PINCLIENT::THREAD_START_CALLBACK) (<a class="el" href="group__PIN__THREAD__API.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a> threadIndex, <a class="el" href="group__CONTEXT__API.html#ga73f8f88949aaecf53a6d23f56399c676">CONTEXT</a> *ctxt, INT32 flags, VOID *v)</td>
</tr>
</table>
</div><div class="memdoc">
<p>Call-back function when thread begins.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">threadIndex</td><td>The Pin thread ID of the new thread. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">ctxt</td><td>Initial register state for the new thread. The tool may change this. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">flags</td><td>O/S specific flags for the new thread. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">v</td><td>The tool's call-back value. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<h2 class="groupheader">Enumeration Type Documentation</h2>
<a id="gaf9a18d894714ae57264a2302638fc4b3"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gaf9a18d894714ae57264a2302638fc4b3">&#9670;&nbsp;</a></span>ATTACH_STATUS</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">enum <a class="el" href="group__PIN__CONTROL.html#gaf9a18d894714ae57264a2302638fc4b3">LEVEL_PINCLIENT::ATTACH_STATUS</a></td>
</tr>
</table>
</div><div class="memdoc">
<p>Return values of <a class="el" href="group__PIN__CONTROL.html#ga4940c04f3fe39a87090c6872b9ba7e5a">PIN_Attach()</a> and <a class="el" href="group__PIN__CONTROL.html#ga5630fbebba55f0b78adb96adccc8daf8">PIN_AttachProbed()</a> which describe the status of the attach request. </p>
<table class="fieldtable">
<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="ggaf9a18d894714ae57264a2302638fc4b3ab479d68822d4264f3ad10880a5b21a3d"></a>ATTACH_INITIATED&#160;</td><td class="fielddoc"><p>Attach request was delivered successfully to PIN. </p>
</td></tr>
<tr><td class="fieldname"><a id="ggaf9a18d894714ae57264a2302638fc4b3a14afa31e2dadab79279e93630e18f671"></a>ATTACH_FAILED_DETACH&#160;</td><td class="fielddoc"><p>Attach request was not delivered to Pin since detach session hasn't completed yet. </p>
</td></tr>
</table>
</div>
</div>
<a id="ga8e4e6511a0e09fdc5ec7d6dbf395b3a8"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga8e4e6511a0e09fdc5ec7d6dbf395b3a8">&#9670;&nbsp;</a></span>CONTEXT_CHANGE_REASON</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">enum <a class="el" href="group__PIN__CONTROL.html#ga8e4e6511a0e09fdc5ec7d6dbf395b3a8">CONTEXT_CHANGE_REASON</a></td>
</tr>
</table>
</div><div class="memdoc">
<p>Possible reasons for an application context change. </p>
<table class="fieldtable">
<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="gga8e4e6511a0e09fdc5ec7d6dbf395b3a8ae712c798df1d0e94022f6382a4c8239e"></a>CONTEXT_CHANGE_REASON_FATALSIGNAL&#160;</td><td class="fielddoc"><p>Receipt of fatal Unix signal. </p>
</td></tr>
<tr><td class="fieldname"><a id="gga8e4e6511a0e09fdc5ec7d6dbf395b3a8a43b8b032e969e0e5d14a3ed7385f29db"></a>CONTEXT_CHANGE_REASON_SIGNAL&#160;</td><td class="fielddoc"><p>Receipt of handled Unix signal. </p>
</td></tr>
<tr><td class="fieldname"><a id="gga8e4e6511a0e09fdc5ec7d6dbf395b3a8a7e8b6943c9aa3a85b0a9cd23bc738dd9"></a>CONTEXT_CHANGE_REASON_SIGRETURN&#160;</td><td class="fielddoc"><p>Return from Unix signal handler. </p>
</td></tr>
<tr><td class="fieldname"><a id="gga8e4e6511a0e09fdc5ec7d6dbf395b3a8a641c250ce491d66cc19f1205160dc279"></a>CONTEXT_CHANGE_REASON_APC&#160;</td><td class="fielddoc"><p>Receipt of Windows APC. </p>
</td></tr>
<tr><td class="fieldname"><a id="gga8e4e6511a0e09fdc5ec7d6dbf395b3a8ae4c034a98f8eba91b2f8ac5b2543492b"></a>CONTEXT_CHANGE_REASON_EXCEPTION&#160;</td><td class="fielddoc"><p>Receipt of Windows exception. </p>
</td></tr>
<tr><td class="fieldname"><a id="gga8e4e6511a0e09fdc5ec7d6dbf395b3a8a5b48097c22e4fcfdf12650129f364b50"></a>CONTEXT_CHANGE_REASON_CALLBACK&#160;</td><td class="fielddoc"><p>Receipt of Windows call-back. </p>
</td></tr>
</table>
</div>
</div>
<a id="ga8c5c16fb133375efa3a27d3a3900c603"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga8c5c16fb133375efa3a27d3a3900c603">&#9670;&nbsp;</a></span>EXCEPT_HANDLING_RESULT</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">enum <a class="el" href="group__PIN__CONTROL.html#ga8c5c16fb133375efa3a27d3a3900c603">EXCEPT_HANDLING_RESULT</a></td>
</tr>
</table>
</div><div class="memdoc">
<p>Possible return values of the INTERNAL_EXCEPTION_CALLBACK exception filter function </p>
<table class="fieldtable">
<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="gga8c5c16fb133375efa3a27d3a3900c603a32e365f541f4ea48f730a030185558cd"></a>EHR_HANDLED&#160;</td><td class="fielddoc"><p>Exception is handled. Continue execution with the internal physical context. </p>
</td></tr>
<tr><td class="fieldname"><a id="gga8c5c16fb133375efa3a27d3a3900c603ab394692e0b4ad2fda77e7597c75c9599"></a>EHR_UNHANDLED&#160;</td><td class="fielddoc"><p>Exception is not handled. Execute default system procedure for unhandled exceptions (Windows) or abort the process (Unix) </p>
</td></tr>
<tr><td class="fieldname"><a id="gga8c5c16fb133375efa3a27d3a3900c603a1950501612b017bd8db1634f7dc8bf8f"></a>EHR_CONTINUE_SEARCH&#160;</td><td class="fielddoc"><p>Execute next (upper level) exception filter function, if any. For the uppermost filter, this is the same as EHR_UNHANDLED semantics </p>
</td></tr>
</table>
</div>
</div>
<a id="gab459bf0034704bf1aa7fa7e192b7dc08"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gab459bf0034704bf1aa7fa7e192b7dc08">&#9670;&nbsp;</a></span>FPOINT</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">enum <a class="el" href="group__PIN__CONTROL.html#gab459bf0034704bf1aa7fa7e192b7dc08">LEVEL_PINCLIENT::FPOINT</a></td>
</tr>
</table>
</div><div class="memdoc">
<p>time of callback notification </p>
<table class="fieldtable">
<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="ggab459bf0034704bf1aa7fa7e192b7dc08ad25e85d29c19e7e0c5a9a768191bbcd7"></a>FPOINT_BEFORE&#160;</td><td class="fielddoc"><p>Call-back in parent, just before fork. </p>
</td></tr>
<tr><td class="fieldname"><a id="ggab459bf0034704bf1aa7fa7e192b7dc08ae95eedd3db4447dda41b3fe76c7013c6"></a>FPOINT_AFTER_IN_PARENT&#160;</td><td class="fielddoc"><p>Call-back in parent, immediately after fork. </p>
</td></tr>
<tr><td class="fieldname"><a id="ggab459bf0034704bf1aa7fa7e192b7dc08ab97d0822ccc4bd553feab25fc85412fc"></a>FPOINT_AFTER_IN_CHILD&#160;</td><td class="fielddoc"><p>Call-back in child, immediately after fork. </p>
</td></tr>
</table>
</div>
</div>
<a id="ga4e114852e46d5d839d6e71e242709777"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga4e114852e46d5d839d6e71e242709777">&#9670;&nbsp;</a></span>PIN_CALLBACK_TYPE</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">enum <a class="el" href="group__PIN__CONTROL.html#ga4e114852e46d5d839d6e71e242709777">PIN_CALLBACK_TYPE</a></td>
</tr>
</table>
</div><div class="memdoc">
<p>Types of Pin callbacks. These type could be used with the function <a class="el" href="group__PIN__CONTROL.html#ga48dd43d356a2b768c7c0d3cbc4e1fee6">PIN_SetAllowedConcurrentCallbacks()</a> </p>
<table class="fieldtable">
<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="gga4e114852e46d5d839d6e71e242709777af6f04d87615566deb3bd49ec1e3468ef"></a>PIN_CALLBACK_TYPE_NONE&#160;</td><td class="fielddoc"><p>None of the callback types. </p>
</td></tr>
<tr><td class="fieldname"><a id="gga4e114852e46d5d839d6e71e242709777ae9e0416b9e54e38bc1cf69956f81bc2c"></a>PIN_CALLBACK_TYPE_SYSCALL&#160;</td><td class="fielddoc"><p>Syscall entry/exit callback. </p>
</td></tr>
</table>
</div>
</div>
<a id="ga0244f9b4e34e4eed7d483fa6ec7b70f0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga0244f9b4e34e4eed7d483fa6ec7b70f0">&#9670;&nbsp;</a></span>SMC_ENABLE_DISABLE_TYPE</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">enum <a class="el" href="group__PIN__CONTROL.html#ga0244f9b4e34e4eed7d483fa6ec7b70f0">LEVEL_PINCLIENT::SMC_ENABLE_DISABLE_TYPE</a></td>
</tr>
</table>
</div><div class="memdoc">
<p>Enum for controlling Pin's SMC detection </p>
</div>
</div>
<a id="ga139152abe353fdff0216a5519d261c73"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga139152abe353fdff0216a5519d261c73">&#9670;&nbsp;</a></span>SYMBOL_INFO_MODE</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">enum <a class="el" href="group__PIN__CONTROL.html#ga139152abe353fdff0216a5519d261c73">LEVEL_PINCLIENT::SYMBOL_INFO_MODE</a></td>
</tr>
</table>
</div><div class="memdoc">
<p>List of supported modes of symbolic information delivery. Used in <a class="el" href="group__PIN__CONTROL.html#gac133406ab660e13f67dd64f27cdf67c6">PIN_InitSymbolsAlt()</a>. </p>
<table class="fieldtable">
<tr><th colspan="2">Enumerator</th></tr><tr><td class="fieldname"><a id="gga139152abe353fdff0216a5519d261c73af44e4b240fa01ca6ed3a64acf6022ce4"></a>NO_SYMBOLS&#160;</td><td class="fielddoc"><p>No symbols required. </p>
</td></tr>
<tr><td class="fieldname"><a id="gga139152abe353fdff0216a5519d261c73a3486158cb738b76b7385310ec8f5b671"></a>EXPORT_SYMBOLS&#160;</td><td class="fielddoc"><p>Only symbols taken from export table are provided (Windows only) </p>
</td></tr>
<tr><td class="fieldname"><a id="gga139152abe353fdff0216a5519d261c73a25bfc332ecb53ef24ee4ff743d09bde1"></a>DEBUG_SYMBOLS&#160;</td><td class="fielddoc"><p>Debug symbols (Windows only, currently implemented as DEBUG_OR_EXPORT_SYMBOLS) </p>
</td></tr>
<tr><td class="fieldname"><a id="gga139152abe353fdff0216a5519d261c73aa07edbcaef24a5dbbe880f20916bd74e"></a>IFUNC_SYMBOLS&#160;</td><td class="fielddoc"><p>IFUNC symbols (Linux only) </p>
</td></tr>
<tr><td class="fieldname"><a id="gga139152abe353fdff0216a5519d261c73a172580d6ba02ac51ce4d3140bdafec07"></a>DEBUG_OR_EXPORT_SYMBOLS&#160;</td><td class="fielddoc"><p>First debug symbols if available, otherwise export symbols (Windows only) </p>
</td></tr>
</table>
</div>
</div>
<h2 class="groupheader">Function Documentation</h2>
<a id="ga4516c650e020cd12a5425b08588d2ae2"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga4516c650e020cd12a5425b08588d2ae2">&#9670;&nbsp;</a></span>PIN_AddApplicationStartFunction()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a> LEVEL_PINCLIENT::PIN_AddApplicationStartFunction </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__PIN__CONTROL.html#ga2dddda6b6e9c6d8958893aa552401d72">APPLICATION_START_CALLBACK</a>&#160;</td>
<td class="paramname"><em>fun</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">VOID *&#160;</td>
<td class="paramname"><em>val</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Register a notification function that is called after pin initialization is finished. This notification function is available when pin launches the application and when pin attaches to a running process.</p>
<p>On Unix (Linux &amp; macOS*): This notification function is called on the application's main thread (both launch &amp; attach mode). This notification is called right before Pin resume the application.</p>
<p>On Windows: When pin launches the application, this notification function is called on the application's main thread. When pin attaches to a running process, this notification function is called on a dedicated thread which is not part of the application's threads.<br />
When it is called, all the application's threads are paused by Pin and are about to be released.<br />
No new threads can be created by the application at this time.</p>
<p>When Pin starts running a program, it calls into the tool several times in the following order:<br />
</p><ol type="1">
<li>Calls the tool's main() function.<br />
</li>
<li>If the tool set up a notification with <a class="el" href="group__IMG__BASIC__API.html#ga494869187b5d94d7dd346bc9ff49642f">IMG_AddInstrumentFunction()</a>, Pin calls this call-back for each image that is already loaded in the application's address space at the point when Pin attaches to it.<br />
</li>
<li>Calls any notification call-backs set up with <a class="el" href="group__PIN__CONTROL.html#ga4516c650e020cd12a5425b08588d2ae2">PIN_AddApplicationStartFunction()</a>.<br />
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fun</td><td>Function to be called at application start. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">val</td><td>Value to pass to the function.</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>PIN_CALLBACK A handle to a callback that can be used to further modify this callback's properties</dd></dl>
<dl class="section note"><dt>Note</dt><dd>The pin client lock is obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT &amp; Probe<br />
<b>O/S</b>: Windows, Linux, macOS*<br />
<b>CPU:</b> IA-32, Intel(R) 64<br />
</dd></dl>
</li>
</ol>
</div>
</div>
<a id="ga786fd61c9be3c42a1a6deefc71dffadf"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga786fd61c9be3c42a1a6deefc71dffadf">&#9670;&nbsp;</a></span>PIN_AddContextChangeFunction()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a> LEVEL_PINCLIENT::PIN_AddContextChangeFunction </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__PIN__CONTROL.html#ga8f39acc1effd9b2d81b9e26762337070">CONTEXT_CHANGE_CALLBACK</a>&#160;</td>
<td class="paramname"><em>fun</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">VOID *&#160;</td>
<td class="paramname"><em>val</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Register a notification function that is called immediately before the application changes context due to receipt of an asynchronous event such as Unix signal or Windows APC.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fun</td><td>Call-back function to execute immediately before the application changes context. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">val</td><td>Value to pass to the function.</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>PIN_CALLBACK A handle to a callback that can be used to further modify this callback's properties</dd></dl>
<dl class="section note"><dt>Note</dt><dd>The pin client lock is obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux, Windows<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="gafc04e55a26e3b74cdebb8c6a1bf5503b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gafc04e55a26e3b74cdebb8c6a1bf5503b">&#9670;&nbsp;</a></span>PIN_AddDetachFunction()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a> LEVEL_PINCLIENT::PIN_AddDetachFunction </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__PIN__CONTROL.html#gad93663f939ea407871c840249f006f33">DETACH_CALLBACK</a>&#160;</td>
<td class="paramname"><em>fun</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">VOID *&#160;</td>
<td class="paramname"><em>val</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Call func immediately before Pin relinquishes control of the application through <a class="el" href="group__PIN__CONTROL.html#ga6277d16bf33ede39685a26a92fc3cbef">PIN_Detach()</a>.</p>
<p>At this stage no more instrumentation/analysis callbacks will be called</p>
<p>This function is called one time for the process. It may be called by any thread. Pin memory is not freed at this moment.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">fun</td><td>Call back function to execute before detaching </td></tr>
<tr><td class="paramname">val</td><td>Value to be passed to fun when it is called</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>PIN_CALLBACK A handle to a callback that can be used to further modify this callback's properties</dd></dl>
<dl class="section note"><dt>Note</dt><dd>The pin client lock is obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux, macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="gafd8d7788f12ec84f1c81074851ff716d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gafd8d7788f12ec84f1c81074851ff716d">&#9670;&nbsp;</a></span>PIN_AddDetachFunctionProbed()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a> LEVEL_PINCLIENT::PIN_AddDetachFunctionProbed </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__PIN__CONTROL.html#ga361f5aee528beb87f164a24ea821562a">DETACH_PROBED_CALLBACK</a>&#160;</td>
<td class="paramname"><em>fun</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">VOID *&#160;</td>
<td class="paramname"><em>val</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Register a notification function that is called immediately after Pin relinquishes control of the application through <a class="el" href="group__PIN__CONTROL.html#ga634584cd69b124a7edd58655010e295f">PIN_DetachProbed()</a>. There can be more than one Detach callback function.<br />
When this callback function is called, it is guaranteed that Pin removed all probes from the application code and that no other callback function will be called afterwards (except from additional Detach callback functions).<br />
</p><dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">fun</td><td>Call back function to execute before detaching </td></tr>
<tr><td class="paramname">val</td><td>Value to be passed to fun when it is called</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>PIN_CALLBACK A handle to a callback that can be used to further modify this callback's properties</dd></dl>
<dl class="section note"><dt>Note</dt><dd>The pin client lock is obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> Probe<br />
<b>O/S</b>: Windows, Linux<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga50e51f92c7ea2b6d8b271ecf71a7db65"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga50e51f92c7ea2b6d8b271ecf71a7db65">&#9670;&nbsp;</a></span>PIN_AddFetchFunction()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">VOID LEVEL_PINCLIENT::PIN_AddFetchFunction </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__PIN__CONTROL.html#gabd102b3a57c3d84b65c4d5af80539097">FETCH_CALLBACK</a>&#160;</td>
<td class="paramname"><em>fun</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">VOID *&#160;</td>
<td class="paramname"><em>val</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Called to register a function That will become the function that Pin calls to fetch application instructions. Pin sometimes attempt to fetch instructions from an invalid address, and the call-back needs to handle this correctly. If multiple functions are registered using this API, only the last one registered is used</p>
<p>Pin cannot automatically detect self-modifying code (SMC) when a tool uses this API. Therefore, such tools take over responsibility for detecting SMC and must explicitly regenerate all traces within a modified code range if such was detected using PIN_RemoveInstrumentationInRange.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fun</td><td>The tool's call-back function. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">val</td><td>The tool's call-back value.</td></tr>
</table>
</dd>
</dl>
<dl class="section note"><dt>Note</dt><dd>The pin client lock is obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux, Windows &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="gac167b8d28d255e53a0ac1f6e9edcd3ec"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gac167b8d28d255e53a0ac1f6e9edcd3ec">&#9670;&nbsp;</a></span>PIN_AddFiniFunction()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a> LEVEL_PINCLIENT::PIN_AddFiniFunction </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__PIN__CONTROL.html#gaba48bfb240e26cdcb7829cae9d3ed779">FINI_CALLBACK</a>&#160;</td>
<td class="paramname"><em>fun</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">VOID *&#160;</td>
<td class="paramname"><em>val</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Call func immediately before the application exits. The function is not an instrumentation function&ndash;it cannot insert instrumentation. There can be more than one Fini function.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">fun</td><td>Call back function is passed exit code and val </td></tr>
<tr><td class="paramname">val</td><td>Value to be passed to fun when it is called</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>PIN_CALLBACK A handle to a callback that can be used to further modify this callback's properties</dd></dl>
<dl class="section note"><dt>Note</dt><dd>The pin client lock is obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux, Windows &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga5f4e19c43f3de21d382c3c4e2442d961"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga5f4e19c43f3de21d382c3c4e2442d961">&#9670;&nbsp;</a></span>PIN_AddFollowChildProcessFunction()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a> LEVEL_PINCLIENT::PIN_AddFollowChildProcessFunction </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__CHILD__PROCESS__API.html#gaf1def25be0eafe4f4249392e7c67e72e">FOLLOW_CHILD_PROCESS_CALLBACK</a>&#160;</td>
<td class="paramname"><em>fun</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">VOID *&#160;</td>
<td class="paramname"><em>val</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Register a notification function that is called before a child/exec-ed process is starting to execute</p>
<p>NOTE: Only one callback can be registered</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fun</td><td>Call-back function </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">val</td><td>Value to pass to the function</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>PIN_CALLBACK A handle to a callback that can be used to further modify this callback's properties</dd></dl>
<dl class="section note"><dt>Note</dt><dd>The pin client lock is obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT &amp; Probe<br />
<b>O/S</b>: Windows, Linux, macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga7282900fb6160031936d8b63fecc4e21"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga7282900fb6160031936d8b63fecc4e21">&#9670;&nbsp;</a></span>PIN_AddForkFunction()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a> LEVEL_PINCLIENT::PIN_AddForkFunction </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__PIN__CONTROL.html#gab459bf0034704bf1aa7fa7e192b7dc08">FPOINT</a>&#160;</td>
<td class="paramname"><em>point</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__PIN__CONTROL.html#gacaa6554b9595fcbf5f5a80ded1e1bced">FORK_CALLBACK</a>&#160;</td>
<td class="paramname"><em>fun</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">VOID *&#160;</td>
<td class="paramname"><em>val</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Register a notification handler that is called when the application forks a new process.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">where</td><td>Tells when to make the call-back and tells whether the parent or child makes the call-back. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">fun</td><td>Call-back function to execute. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">v</td><td>Value passed as final parameter to call-back.</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>PIN_CALLBACK A handle to a callback that can be used to further modify this callback's properties</dd></dl>
<p>If the fork function fails, the FPOINT_AFTER_IN_PARENT function, if it exists, is still called.</p>
<dl class="section note"><dt>Note</dt><dd>The pin client is obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux, macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="gac25229eab5d0cd015f9d52046771a81f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gac25229eab5d0cd015f9d52046771a81f">&#9670;&nbsp;</a></span>PIN_AddForkFunctionProbed()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a> LEVEL_PINCLIENT::PIN_AddForkFunctionProbed </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__PIN__CONTROL.html#gab459bf0034704bf1aa7fa7e192b7dc08">FPOINT</a>&#160;</td>
<td class="paramname"><em>point</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__PIN__CONTROL.html#ga697b2b9d4aad145efbed077f6a5a5c90">FORK_PROBE_MODE_CALLBACK</a>&#160;</td>
<td class="paramname"><em>fun</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">VOID *&#160;</td>
<td class="paramname"><em>val</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Register a notification handler that is called when the application forks a new process. If vfork() is called in application, Pin replaces it with fork(). This replacement is needed to keep Pin/Tool state consistent and prevent memory overlap in callbacks following the fork/vfork. The function can only be used on Linux, and macOS*.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">where</td><td>Tells when to make the call-back and tells whether the parent or child makes the call-back. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">fun</td><td>Call-back function to execute. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">v</td><td>Value passed as final parameter to call-back.</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>PIN_CALLBACK A handle to a callback that can be used to further modify this callback's properties</dd></dl>
<p>If the fork function fails, the FPOINT_AFTER_IN_PARENT function, if it exists, is still called.</p>
<dl class="section note"><dt>Note</dt><dd>The pin client lock is obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> Probe<br />
<b>O/S</b>: Linux, and macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga60adbdd03078851f0e2611ab06e17c19"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga60adbdd03078851f0e2611ab06e17c19">&#9670;&nbsp;</a></span>PIN_AddInternalExceptionHandler()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a> LEVEL_PINCLIENT::PIN_AddInternalExceptionHandler </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__PIN__CONTROL.html#ga9578251834f6ec47ac1a5c99ded59fe9">INTERNAL_EXCEPTION_CALLBACK</a>&#160;</td>
<td class="paramname"><em>fun</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">VOID *&#160;</td>
<td class="paramname"><em>val</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Register a global (not per-thread) notification handler function that is called upon receipt of any unhandled internal exception in Pin or the tool. This handler does not catch exceptions that are generated by the application, nor does it catch exceptions that are handled by <a class="el" href="group__PIN__CONTROL.html#ga75d9372356e0cda2acb7f5851d328575">PIN_TryStart()</a> / <a class="el" href="group__PIN__CONTROL.html#ga4b5c7f34928a2594509ba69baf404129">PIN_TryEnd()</a>. The handler is active for all the application's threads, it should be called in tool's main() before <a class="el" href="group__PIN__CONTROL.html#gaded401aeb030a76ee3396137b06ad808">PIN_StartProgram()</a>. If it is called after <a class="el" href="group__PIN__CONTROL.html#gaded401aeb030a76ee3396137b06ad808">PIN_StartProgram()</a> is called, it will be ignored. The user can register up to MAX_IEH_CALLBACKS global notification functions.</p>
<dl class="section note"><dt>Note</dt><dd>This function should be used for permanent global call-back registration (as opposed to <a class="el" href="group__PIN__CONTROL.html#ga75d9372356e0cda2acb7f5851d328575">PIN_TryStart()</a> / <a class="el" href="group__PIN__CONTROL.html#ga4b5c7f34928a2594509ba69baf404129">PIN_TryEnd()</a> pair which should be used for function scope registration).</dd></dl>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fun</td><td>Handler function to execute upon receipt of internal exception in pin/tool. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">val</td><td>Value to pass to the function.</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>PIN_CALLBACK A handle to a callback that can be used to further modify this callback's properties</dd></dl>
<dl class="section note"><dt>Note</dt><dd>The pin client lock is obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Windows<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga6d9a4cd860d8168ce1dab07da404752e"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga6d9a4cd860d8168ce1dab07da404752e">&#9670;&nbsp;</a></span>PIN_AddMemoryAddressTransFunction()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">VOID LEVEL_PINCLIENT::PIN_AddMemoryAddressTransFunction </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__PIN__CONTROL.html#ga59a53cc4fdf602553ab60f7ee4ca4c00">MEMORY_ADDR_TRANS_CALLBACK</a>&#160;</td>
<td class="paramname"><em>fun</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">VOID *&#160;</td>
<td class="paramname"><em>val</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Register a callback for modifying memory address arguments that are passed to analysis routines. See <a class="el" href="group__PIN__CONTROL.html#ga59a53cc4fdf602553ab60f7ee4ca4c00">MEMORY_ADDR_TRANS_CALLBACK</a> for usage details. <br />
Only one such callback may be registered. <br />
</p><dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">fun</td><td>Call back function is passed the thread id, address, size, read </td></tr>
<tr><td class="paramname">val</td><td>Value to be passed to fun when it is called</td></tr>
</table>
</dd>
</dl>
<dl class="section note"><dt>Note</dt><dd>The pin client lock is obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT <br />
<b>O/S</b>: Linux, Windows &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga897b98855a1853146f9d291687f41946"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga897b98855a1853146f9d291687f41946">&#9670;&nbsp;</a></span>PIN_AddOutOfMemoryFunction()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">VOID LEVEL_PINCLIENT::PIN_AddOutOfMemoryFunction </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__PIN__CONTROL.html#gad38f03cb81217ec22ce4d5415097cf99">OUT_OF_MEMORY_CALLBACK</a>&#160;</td>
<td class="paramname"><em>fun</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">VOID *&#160;</td>
<td class="paramname"><em>val</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Register a notification function that is called when pin/tool is out of memory.<br />
Try to reduce memory consumption when this notification function is called.<br />
Any implicit or explicit usage of malloc()/realloc() etc. in this notification function might cause an infinite recursion.<br />
The call to the notification function is NOT serialized by pin. The user can't assume anything about the locks state while the notification is delivered (as out of memory condition can occur anywhere). Avoid dead-locks by careful design of the notification function.<br />
A tool can register only one notification function.<br />
A new notification function registration overwrites any previous registration.<br />
To disable the notification function, pass a NULL function pointer.<br />
</p><dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">fun</td><td>Call back function is passed the size of the failing allocation </td></tr>
<tr><td class="paramname">val</td><td>Value to be passed to fun when it is called</td></tr>
</table>
</dd>
</dl>
<dl class="section note"><dt>Note</dt><dd>The pin client lock is obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT &amp; PROBE<br />
<b>O/S</b>: Linux, Windows &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga3ca849f6b9c098afb7769e0845cc52c1"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga3ca849f6b9c098afb7769e0845cc52c1">&#9670;&nbsp;</a></span>PIN_AddPrepareForFiniFunction()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a> LEVEL_PINCLIENT::PIN_AddPrepareForFiniFunction </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__PIN__CONTROL.html#gad158b812f88e6cd2d61036b3acae44b4">PREPARE_FOR_FINI_CALLBACK</a>&#160;</td>
<td class="paramname"><em>fun</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">VOID *&#160;</td>
<td class="paramname"><em>val</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Register a function to be called when the application is about to exit. The registered function will be executed in a thread that initiated the exit and currently does not hold any thread synchronization lock in Pin. It means that this callback function can be executed concurrently with other Pin callbacks and APIs.<br />
All callbacks registered by this function will be executed before any callback registered by the <a class="el" href="group__PIN__CONTROL.html#gac167b8d28d255e53a0ac1f6e9edcd3ec">PIN_AddFiniFunction()</a> function.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">fun</td><td>Callback function to be registered </td></tr>
<tr><td class="paramname">val</td><td>Value to be passed to fun when it is called</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>PIN_CALLBACK A handle to a callback that can be used to further modify this callback's properties</dd></dl>
<dl class="section note"><dt>Note</dt><dd>Function registered by this API after application exit is started, may not be executed.</dd>
<dd>
The pin client lock is obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux, Windows &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga697a1abfcdcc139915c008190aba9dcb"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga697a1abfcdcc139915c008190aba9dcb">&#9670;&nbsp;</a></span>PIN_AddThreadAttachFunction()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a> LEVEL_PINCLIENT::PIN_AddThreadAttachFunction </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__PIN__CONTROL.html#gaa4b59600ac32ad5dd0601bac3aa5aff1">THREAD_ATTACH_CALLBACK</a>&#160;</td>
<td class="paramname"><em>fun</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">VOID *&#160;</td>
<td class="paramname"><em>val</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>This API is useful when Pin is run in JIT mode and attaches to a running process. Tools may use this API to register a notification that is called by each application thread.</p>
<p>After Pin attaches to the process, Pin first notifies the tool of any images that are loaded (see <a class="el" href="group__IMG__BASIC__API.html#ga494869187b5d94d7dd346bc9ff49642f">IMG_AddInstrumentFunction()</a>) and then notifies the tool that initialization is complete (see <a class="el" href="group__PIN__CONTROL.html#ga4516c650e020cd12a5425b08588d2ae2">PIN_AddApplicationStartFunction()</a>). After that, each thread in the application calls the notification set up by <a class="el" href="group__PIN__CONTROL.html#ga697a1abfcdcc139915c008190aba9dcb">PIN_AddThreadAttachFunction()</a>. After each thread returns from this notification, it resumes execution in the application code.</p>
<p>Note, this notification happens only for threads that exist in the process at the time that Pin attaches.</p>
<p>It does not happen for the following threads:</p><ol type="1">
<li>Threads that are created in the process after Pin is already attached.</li>
<li>Internal threads spawned by Pin tool when Pin re-attaches to the application.</li>
</ol>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fun</td><td>Call-back function to execute for the attached thread. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">val</td><td>Value to pass to the function.</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>PIN_CALLBACK A handle to a callback that can be used to further modify this callback's properties</dd></dl>
<dl class="section note"><dt>Note</dt><dd>The pin client lock is obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga6bdae30ea6adc711a3ae04aed47bc222"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga6bdae30ea6adc711a3ae04aed47bc222">&#9670;&nbsp;</a></span>PIN_AddThreadAttachProbedFunction()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a> LEVEL_PINCLIENT::PIN_AddThreadAttachProbedFunction </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__PIN__CONTROL.html#gaa754d61b3a52358306370958274e2013">THREAD_ATTACH_PROBED_CALLBACK</a>&#160;</td>
<td class="paramname"><em>fun</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">VOID *&#160;</td>
<td class="paramname"><em>val</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>This API is useful when Pin is run in probe mode and attaches to a running process. Tools may use this API to register a notification that is called by each application thread.</p>
<p>After Pin attaches to the process, Pin first notifies the tool of any images that are loaded (see <a class="el" href="group__IMG__BASIC__API.html#ga494869187b5d94d7dd346bc9ff49642f">IMG_AddInstrumentFunction()</a>) and then notifies the tool that initialization is complete (see <a class="el" href="group__PIN__CONTROL.html#ga4516c650e020cd12a5425b08588d2ae2">PIN_AddApplicationStartFunction()</a>). After that, each thread in the application calls the notification set up by <a class="el" href="group__PIN__CONTROL.html#ga6bdae30ea6adc711a3ae04aed47bc222">PIN_AddThreadAttachProbedFunction()</a>. After each thread returns from this notification, it resumes execution in the application code.</p>
<p>Note, this notification happens only for threads that exist in the process at the time that Pin attaches. It does not happen for threads that are created in the process after Pin is already attached.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fun</td><td>Call-back function to execute for the attached thread. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">val</td><td>Value to pass to the function.</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>PIN_CALLBACK A handle to a callback that can be used to further modify this callback's properties</dd></dl>
<dl class="section note"><dt>Note</dt><dd>The pin client lock is obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> Probe<br />
<b>O/S</b>: Linux &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga7f157496433d50573d2f025beca83e5a"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga7f157496433d50573d2f025beca83e5a">&#9670;&nbsp;</a></span>PIN_AddThreadDetachFunction()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a> LEVEL_PINCLIENT::PIN_AddThreadDetachFunction </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__PIN__CONTROL.html#ga399c9fcfab421902d1f9b797cc9189b1">THREAD_DETACH_CALLBACK</a>&#160;</td>
<td class="paramname"><em>fun</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">VOID *&#160;</td>
<td class="paramname"><em>val</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>This API is useful when Pin runs in JIT mode and detaches from a running process. Tools may use this API to register a notification that is called by each application thread before Pin detaches from the thread. This notification is given in the thread native context.</p>
<p>Note, this notification happens only for application threads that exist in the process at the time that Pin detaches. It does not happen for the following threads:</p><ol type="1">
<li>Threads that are created in the process after Pin is already detached.</li>
<li>Internal threads spawned by Pin tool.</li>
</ol>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fun</td><td>Call-back function to execute by the detaching thread. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">val</td><td>Value to pass to the function.</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>PIN_CALLBACK A handle to a callback that can be used to further modify this callback's properties</dd></dl>
<dl class="section note"><dt>Note</dt><dd>The pin client lock is obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="gae579102abbf9c663827c82b867db63ad"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gae579102abbf9c663827c82b867db63ad">&#9670;&nbsp;</a></span>PIN_AddThreadDetachProbedFunction()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a> LEVEL_PINCLIENT::PIN_AddThreadDetachProbedFunction </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__PIN__CONTROL.html#gaad9e083b98d96b87afa850f33d92f9a3">THREAD_DETACH_PROBED_CALLBACK</a>&#160;</td>
<td class="paramname"><em>fun</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">VOID *&#160;</td>
<td class="paramname"><em>val</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>This API is useful when Pin runs in probe mode and detaches from a running process. Tools may use this API to register a notification that is called by each application thread before any probes removal. This notification is given in the thread native context.</p>
<p>Note, this notification happens only for threads that exist in the process at the time that Pin detaches. It does not happen for threads that are created in the process after Pin is already detached.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fun</td><td>Call-back function to execute by the detaching thread. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">val</td><td>Value to pass to the function.</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>PIN_CALLBACK A handle to a callback that can be used to further modify this callback's properties</dd></dl>
<dl class="section note"><dt>Note</dt><dd>The pin client lock is obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> Probe<br />
<b>O/S</b>: Linux &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="gae79d468cc5e19b450603f07f3397203d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gae79d468cc5e19b450603f07f3397203d">&#9670;&nbsp;</a></span>PIN_AddThreadFiniFunction()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a> LEVEL_PINCLIENT::PIN_AddThreadFiniFunction </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__PIN__CONTROL.html#gaa56617d8763d8e0f90db638d7bf6bd39">THREAD_FINI_CALLBACK</a>&#160;</td>
<td class="paramname"><em>fun</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">VOID *&#160;</td>
<td class="paramname"><em>val</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Register a notification function that is called when an application thread terminates. The call-back happens even for the application's root (initial) thread.</p>
<p>The notification call-back will often happen on the physical thread that is exiting, but under some circumstances it will be called on a different physical thread.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fun</td><td>Call-back function to execute for the terminating thread. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">val</td><td>Value to pass to the function.</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>PIN_CALLBACK A handle to a callback that can be used to further modify this callback's properties</dd></dl>
<dl class="section note"><dt>Note</dt><dd>The pin client lock is obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux, Windows &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga93431bb0680a22395327ac7d8bb0c14c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga93431bb0680a22395327ac7d8bb0c14c">&#9670;&nbsp;</a></span>PIN_AddThreadStartFunction()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__PIN__CALLBACKS.html#ga3ba1895c602cd5b2863b7b75840187a4">PIN_CALLBACK</a> LEVEL_PINCLIENT::PIN_AddThreadStartFunction </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__PIN__CONTROL.html#ga53886d52f0a0c1dd12d8e938dc530365">THREAD_START_CALLBACK</a>&#160;</td>
<td class="paramname"><em>fun</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">VOID *&#160;</td>
<td class="paramname"><em>val</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Register a notification function that is called when a thread starts executing in the application. The call-back happens even for the application's root (initial) thread.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">fun</td><td>Call-back function to execute for the new thread. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">val</td><td>Value to pass to the function.</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>PIN_CALLBACK A handle to a callback that can be used to further modify this callback's properties</dd></dl>
<dl class="section note"><dt>Note</dt><dd>The pin client lock is obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux, Windows &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga4940c04f3fe39a87090c6872b9ba7e5a"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga4940c04f3fe39a87090c6872b9ba7e5a">&#9670;&nbsp;</a></span>PIN_Attach()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__PIN__CONTROL.html#gaf9a18d894714ae57264a2302638fc4b3">ATTACH_STATUS</a> LEVEL_PINCLIENT::PIN_Attach </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__PIN__CONTROL.html#ga9736b66161bfa0f18752e0d484862f85">ATTACH_CALLBACK</a>&#160;</td>
<td class="paramname"><em>fun</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">VOID *&#160;</td>
<td class="paramname"><em>val</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Initiate Pin attach request in JIT mode. If Pin was not detached (using <a class="el" href="group__PIN__CONTROL.html#ga634584cd69b124a7edd58655010e295f">PIN_DetachProbed()</a>) this function will be ignored.<br />
The given notification function will be called immediately after Pin regains control of the application. It is expected that in the scope of this callback, the tool will register callbacks (e.g. <a class="el" href="group__IMG__BASIC__API.html#ga494869187b5d94d7dd346bc9ff49642f">IMG_AddInstrumentFunction()</a>) and will reconfigure itself (if needed). In order to change tool's KNOB value, use <a class="el" href="group__KNOB__BASIC.html">KNOB: Basics</a></p>
<dl class="section note"><dt>Note</dt><dd>Pin's state can't be reconfigured in the scope of the callback function (don't use <a class="el" href="group__PIN__CONTROL.html#ga783d3bd40c3fb2ca51b1f9af31a70c9c">PIN_Init()</a>, <a class="el" href="group__PIN__CONTROL.html#ga8cf4aca0b0bdbc7fc0ae965883d8e3c2">PIN_InitSymbols()</a>, <a class="el" href="group__PIN__CONTROL.html#ga01a31bf221500b0ca0b97fb64cc62247">PIN_StartProgramProbed()</a> etc.)</dd></dl>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">fun</td><td>Call back function to execute when starting to attach </td></tr>
<tr><td class="paramname">val</td><td>Value to be passed to fun when it is called</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>status of attach request (ATTACH_STATUS)</dd></dl>
<dl class="section note"><dt>Note</dt><dd>The vm and pin client locks are obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Windows, Linux<br />
<b>CPU:</b> IA32, Intel64<br />
</dd></dl>
</div>
</div>
<a id="ga5630fbebba55f0b78adb96adccc8daf8"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga5630fbebba55f0b78adb96adccc8daf8">&#9670;&nbsp;</a></span>PIN_AttachProbed()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__PIN__CONTROL.html#gaf9a18d894714ae57264a2302638fc4b3">ATTACH_STATUS</a> LEVEL_PINCLIENT::PIN_AttachProbed </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__PIN__CONTROL.html#gaa0a95b60754d6948bd2993e009667fbe">ATTACH_PROBED_CALLBACK</a>&#160;</td>
<td class="paramname"><em>fun</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">VOID *&#160;</td>
<td class="paramname"><em>val</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Initiate Pin attach request in probe mode. If Pin was not detached (using <a class="el" href="group__PIN__CONTROL.html#ga634584cd69b124a7edd58655010e295f">PIN_DetachProbed()</a>) this function will be ignored.<br />
The given notification function will be called immediately after Pin regain control of the application. It is expected that in the scope of this callback, the tool will register callbacks (e.g. <a class="el" href="group__IMG__BASIC__API.html#ga494869187b5d94d7dd346bc9ff49642f">IMG_AddInstrumentFunction()</a>) and will reconfigure itself (if needed). In order to change tool's KNOB value, use <a class="el" href="group__KNOB__BASIC.html">KNOB: Basics</a></p>
<dl class="section note"><dt>Note</dt><dd>Pin's state can't be reconfigured in the scope of the callback function (don't use <a class="el" href="group__PIN__CONTROL.html#ga783d3bd40c3fb2ca51b1f9af31a70c9c">PIN_Init()</a>, <a class="el" href="group__PIN__CONTROL.html#ga8cf4aca0b0bdbc7fc0ae965883d8e3c2">PIN_InitSymbols()</a>, <a class="el" href="group__PIN__CONTROL.html#ga01a31bf221500b0ca0b97fb64cc62247">PIN_StartProgramProbed()</a> etc.)</dd></dl>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">fun</td><td>Call back function to execute when starting to attach </td></tr>
<tr><td class="paramname">val</td><td>Value to be passed to fun when it is called</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>status of attach request (ATTACH_STATUS)</dd></dl>
<dl class="section note"><dt>Note</dt><dd>The vm and pin client locks are obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> Probe<br />
<b>O/S</b>: Windows, Linux<br />
<b>CPU:</b> IA32, Intel64<br />
</dd></dl>
</div>
</div>
<a id="ga5ae5853e6600a23f9c552cba784870cc"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga5ae5853e6600a23f9c552cba784870cc">&#9670;&nbsp;</a></span>PIN_CallApplicationFunction()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">VOID LEVEL_PINCLIENT::PIN_CallApplicationFunction </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="group__CONTEXT__API.html#ga73f8f88949aaecf53a6d23f56399c676">CONTEXT</a> *&#160;</td>
<td class="paramname"><em>ctxt</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__PIN__THREAD__API.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a>&#160;</td>
<td class="paramname"><em>tid</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__PROTO__API.html#gacfd9f3c8dc22310ce9b9152e8c61b17c">CALLINGSTD_TYPE</a>&#160;</td>
<td class="paramname"><em>cstype</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">AFUNPTR&#160;</td>
<td class="paramname"><em>origFunPtr</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structCALL__APPLICATION__FUNCTION__PARAM.html">CALL_APPLICATION_FUNCTION_PARAM</a> *&#160;</td>
<td class="paramname"><em>param</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">&#160;</td>
<td class="paramname"><em>...</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>This API allows a tool to call a function inside the application. The function is executed under control of Pin's JIT compiler, and the application code is instrumented normally. Tools should not make direct calls to application functions when Pin is in JIT mode.</p>
<p><a class="el" href="group__PIN__CONTROL.html#ga5ae5853e6600a23f9c552cba784870cc">PIN_CallApplicationFunction()</a> can be called from a replacement routine or an analysis routine, but not from a call-back. Note that this API can result in recursive execution in the tool since the called application function is also instrumented.</p>
<p>One usage model for this API is to "wrap" an application function, executing analysis code before the function is called and after it returns. To do this, use <a class="el" href="group__RTN__BASIC__API.html#ga2dcaf2242c7a62151d89c01e2f04f8c0">RTN_ReplaceSignature()</a> to replace the application function, use <a class="el" href="group__INST__ARGS.html#gga089c27ca15e9ff139dd3a3f8a6f8451da0425900c8991df5d840dd6d9f9b03295">IARG_ORIG_FUNCPTR</a> to pass the original function pointer to the replacement routine, and use <a class="el" href="group__INST__ARGS.html#gga089c27ca15e9ff139dd3a3f8a6f8451dad3e65d643a63acb09d12b8538434ca45">IARG_CONST_CONTEXT</a> to pass the register state. You can then call back on the original function from your replacement routine with <a class="el" href="group__PIN__CONTROL.html#ga5ae5853e6600a23f9c552cba784870cc">PIN_CallApplicationFunction()</a>. Note, however, that the overhead of <a class="el" href="group__PIN__CONTROL.html#ga5ae5853e6600a23f9c552cba784870cc">PIN_CallApplicationFunction()</a> can be high, so it is more efficient to use *_InsertCall() instead if possible.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">ctxt</td><td>The application register state to use when calling the function. Pin changes the register state in order to pass arguments to the function, but the <em>ctxt</em> parameter isn't changed. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">tid</td><td>The Pin id of the current thread (see <a class="el" href="group__INST__ARGS.html#gga089c27ca15e9ff139dd3a3f8a6f8451daadb6e5681193cc8435b9e57d13acf5d4">IARG_THREAD_ID</a>). </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">cstype</td><td>The calling standard used for calling this function (CALLINGSTD_DEFAULT recommended). </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">origFunPtr</td><td>The entry point of the application function. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">param</td><td>Additional parameters to define the exact behavior of this function invocation (or NULL for using the defaults). See <a class="el" href="structCALL__APPLICATION__FUNCTION__PARAM.html">CALL_APPLICATION_FUNCTION_PARAM</a> . </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">...</td><td>List of function argument type and size.</td></tr>
</table>
</dd>
</dl>
<p>See <a class="el" href="group__PROTO__API.html#gacb4faa1f3649fce55756313c6259519f">PIN_PARG</a> for the recommended method of passing function arguments. <a class="el" href="group__PROTO__API.html#gaeebb4a42707b704ebf214a06a6bf4e62">PIN_PARG_END()</a> must end the argument list, even if the function has no arguments. If the application function has a return value, it must appear first in the argument list.</p>
<dl class="section note"><dt>Note</dt><dd>The vm lock is obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT only<br />
<b>O/S</b>: Linux and Windows<br />
<b>CPU:</b> IA-32 and Intel(R) 64 architectures<br />
</dd></dl>
</div>
</div>
<a id="ga97c4af33bb0a330a0967c80c61fcd1c4"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga97c4af33bb0a330a0967c80c61fcd1c4">&#9670;&nbsp;</a></span>PIN_CheckReadAccess()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">BOOL LEVEL_PINCLIENT::PIN_CheckReadAccess </td>
<td>(</td>
<td class="paramtype">VOID *&#160;</td>
<td class="paramname"><em>addr</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Given an address, this API checks whether the memory page which contains this address has a read access protection.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">addr</td><td>memory address</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>True if the memory page which contains the given address has a read access protection, false otherwise.</dd></dl>
<dl class="section note"><dt>Note</dt><dd><a class="el" href="group__PIN__CONTROL.html#ga97c4af33bb0a330a0967c80c61fcd1c4">PIN_CheckReadAccess()</a> should not be called before the application has been started. For instance, it cannot be called in an Image load callback. Unexpected results will occur.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux, Windows &amp; macOS*<br />
<b>CPU:</b> IA-32 and Intel(R) 64 architectures<br />
</dd></dl>
</div>
</div>
<a id="gab1c7bfe02dcbcc4415ef03a7267a1b11"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gab1c7bfe02dcbcc4415ef03a7267a1b11">&#9670;&nbsp;</a></span>PIN_CheckWriteAccess()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">BOOL LEVEL_PINCLIENT::PIN_CheckWriteAccess </td>
<td>(</td>
<td class="paramtype">VOID *&#160;</td>
<td class="paramname"><em>addr</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Given an address, this API checks whether the memory page which contains this address has a write access protection.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">addr</td><td>memory address</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>True if the memory page which contains the given address has a write access protection, false otherwise.</dd></dl>
<dl class="section note"><dt>Note</dt><dd><a class="el" href="group__PIN__CONTROL.html#gab1c7bfe02dcbcc4415ef03a7267a1b11">PIN_CheckWriteAccess()</a> should not be called before the application has been started. For instance, it cannot be called in an Image load callback. Unexpected results will occur.</dd>
<dd>
PIN_CheckWriteAccess assume that if a memory page has a write access protection it also has a read</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux, Windows &amp; macOS*<br />
<b>CPU:</b> IA-32 and Intel(R) 64 architectures<br />
</dd></dl>
</div>
</div>
<a id="gabf3035f1cd239935bb4b9d45b39be266"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gabf3035f1cd239935bb4b9d45b39be266">&#9670;&nbsp;</a></span>PIN_CreateDefaultConfigurationInfo()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__PIN__CONTROL.html#gadfef9e89968c6491114d7ceae51ab61b">PIN_CONFIGURATION_INFO</a> LEVEL_PINCLIENT::PIN_CreateDefaultConfigurationInfo </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Creates an instance of PIN_CONFIGURATION_INFO with default values. This instance can be passed to <a class="el" href="group__PIN__CONTROL.html#gaded401aeb030a76ee3396137b06ad808">PIN_StartProgram()</a> in order to take effect on Pin.</p>
<p>The default values are:</p><ul>
<li>Callback types which are allowed to run concurrently - None (PIN_CALLBACK_TYPE_NONE)</li>
</ul>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux, Windows &amp; macOS*<br />
<b>CPU:</b> IA-32 and Intel(R) 64 architectures<br />
</dd></dl>
</div>
</div>
<a id="ga6277d16bf33ede39685a26a92fc3cbef"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga6277d16bf33ede39685a26a92fc3cbef">&#9670;&nbsp;</a></span>PIN_Detach()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">VOID LEVEL_PINCLIENT::PIN_Detach </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Pin relinquishes control of the application and the original un-instrumented code is executed.</p>
<p>On Linux, the function may be invoked from analysis, instrumentation or callback routines. It may be executed by any thread, including threads spawned by the Pintool which are invisible to the Pin VM.</p>
<p>On Windows and macOS*, the function must be invoked from an analysis routine. Invoking the function from instrumentation routines could cause Pin to misbehave. See Tests/detach.C for an example of its use.</p>
<p>The request for detach is considered by Pin as asynchronous. This means that Pin will perform the detach procedure at a point which it considers convenient to do so. From the user's perspective, instrumentation, analysis or callback routines might still be executed after calling <a class="el" href="group__PIN__CONTROL.html#ga6277d16bf33ede39685a26a92fc3cbef">PIN_Detach()</a>. In practice, <a class="el" href="group__PIN__CONTROL.html#ga6277d16bf33ede39685a26a92fc3cbef">PIN_Detach()</a> simply registers the request to the Pin VM and exits immediately i.e. the function does not wait for detach to complete.</p>
<p>Once Pin starts the detach procedure, it can't be blocked, and will not run forever. It is not possible to detach one thread. All threads will run natively after <a class="el" href="group__PIN__CONTROL.html#ga6277d16bf33ede39685a26a92fc3cbef">PIN_Detach()</a>. During detach, Pin doesn't free memory used for Pin objects. This memory will be used during re-attach.</p>
<p>During the detach procedure Pin runs an auxiliary process, which communicates with the running application process via debug interface. The auxiliary process is temporary and will exit immediately when the detach procedure is completed. For the user, this means that a debugger cannot be attached to the application process during detach.</p>
<p>Use <a class="el" href="group__PIN__CONTROL.html#gafc04e55a26e3b74cdebb8c6a1bf5503b">PIN_AddDetachFunction()</a> to receive a notification just prior to detach. The callback will be received after all the threads are stopped inside the VM and no more instrumentation functions, analysis routines or callbacks will be called.<br />
Note: at this point, the auxiliary process mentioned above is still attached to the application process.</p>
<dl class="section note"><dt>Note</dt><dd>The vm and client locks are obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux, Windows, &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga634584cd69b124a7edd58655010e295f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga634584cd69b124a7edd58655010e295f">&#9670;&nbsp;</a></span>PIN_DetachProbed()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">VOID LEVEL_PINCLIENT::PIN_DetachProbed </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Initiate Pin detach request in probe mode. In the scope of this operation, Pin removes all probes set by Pin &amp; tool, The user can get a notification when the detach operation has been completed (via callback registration using <a class="el" href="group__PIN__CONTROL.html#gafd8d7788f12ec84f1c81074851ff716d">PIN_AddDetachFunctionProbed()</a>). On Linux, the user can get additional per-thread callbacks just prior to probes removal. (via callback registration using <a class="el" href="group__PIN__CONTROL.html#gae579102abbf9c663827c82b867db63ad">PIN_AddThreadDetachProbedFunction()</a>).These callbacks will be given for each thread in its native context. If Pin has already detached (using <a class="el" href="group__PIN__CONTROL.html#ga634584cd69b124a7edd58655010e295f">PIN_DetachProbed()</a>), or if Pin has not fully started yet (the notification function registered by <a class="el" href="group__PIN__CONTROL.html#ga4516c650e020cd12a5425b08588d2ae2">PIN_AddApplicationStartFunction()</a> was not yet delivered to the tool), this function will be ignored.<br />
</p><dl class="section note"><dt>Note</dt><dd>Even though Pin removes all probes, replacement functions can still be active (for example, if the replacement function is still located on the call stack of one of the threads). It is the tool responsibility to handle these scenarios.<br />
</dd>
<dd>
The vm and pin client locks are obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> Probe<br />
<b>O/S</b>: Linux, Windows, &amp; macOS*<br />
<b>CPU:</b> IA32, Intel64<br />
</dd></dl>
</div>
</div>
<a id="ga29ad6213c90cfee4a67640798c0c2501"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga29ad6213c90cfee4a67640798c0c2501">&#9670;&nbsp;</a></span>PIN_FetchCode()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">size_t LEVEL_PINCLIENT::PIN_FetchCode </td>
<td>(</td>
<td class="paramtype">void *&#160;</td>
<td class="paramname"><em>copyBuf</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const VOID *&#160;</td>
<td class="paramname"><em>address</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">size_t&#160;</td>
<td class="paramname"><em>maxSize</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">EXCEPTION_INFO *&#160;</td>
<td class="paramname"><em>pExceptInfo</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>A function to fetch the code raw bytes.</p>
<p>This function should be used when the tool needs the raw bytes of instructions and the tool is using a code fetcher function that translates the original code address to an actual code address.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[out]</td><td class="paramname">copyBuf</td><td>destination buffer </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">address</td><td>address to copy from </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">maxSize</td><td>number of bytes to copy </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">pExceptInfo</td><td>pointer to the structure that receives the exception information</td></tr>
</table>
</dd>
</dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux, Windows &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga0df38f14792706f4377486473c0bb382"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga0df38f14792706f4377486473c0bb382">&#9670;&nbsp;</a></span>PIN_GetAuxVectorValue()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">ADDRINT LEVEL_PINCLIENT::PIN_GetAuxVectorValue </td>
<td>(</td>
<td class="paramtype">ADDRINT&#160;</td>
<td class="paramname"><em>type</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">bool *&#160;</td>
<td class="paramname"><em>found</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Given an aux vector entry type, returns the entry's value.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">type</td><td>The type of the desired auxv entry. </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">found</td><td>True if the entry was found, false otherwise.</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>The value of the aux vector entry, undefined if .</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT/Probe<br />
<b>O/S</b>: Linux <b>CPU:</b> IA-32 and Intel(R) 64 architectures<br />
</dd></dl>
</div>
</div>
<a id="ga4494aa98db78e24a10caec922404200e"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga4494aa98db78e24a10caec922404200e">&#9670;&nbsp;</a></span>PIN_GetInitialThreadCount()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">UINT32 LEVEL_PINCLIENT::PIN_GetInitialThreadCount </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>This function is useful when the tool that use attach is doing some initial work that needs the number of threads at the time of the attach.</p>
<dl class="section return"><dt>Returns</dt><dd>Number of threads at the time of the attach, in all other cases it will return one. It is not implemented for Windows with attach.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT/Probe<br />
<b>O/S</b>: Linux<br />
<b>CPU:</b> IA-32 and Intel(R) 64 architectures<br />
</dd></dl>
</div>
</div>
<a id="ga8852a4e2eb765b1356069037bdf05f83"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga8852a4e2eb765b1356069037bdf05f83">&#9670;&nbsp;</a></span>PIN_GetMemoryAddressTransFunction()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__PIN__CONTROL.html#ga59a53cc4fdf602553ab60f7ee4ca4c00">MEMORY_ADDR_TRANS_CALLBACK</a> LEVEL_PINCLIENT::PIN_GetMemoryAddressTransFunction </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Get the Registered notification function that is called when tool needs to modify memory address in PIN.<br />
</p><dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">fun</td><td>Call back function has no parameters </td></tr>
<tr><td class="paramname">val</td><td>Value to be passed to fun when it is called </td></tr>
</table>
</dd>
</dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT &amp; PROBE<br />
<b>O/S</b>: Linux, Windows &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga783d3bd40c3fb2ca51b1f9af31a70c9c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga783d3bd40c3fb2ca51b1f9af31a70c9c">&#9670;&nbsp;</a></span>PIN_Init()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">BOOL LEVEL_PINCLIENT::PIN_Init </td>
<td>(</td>
<td class="paramtype">INT32&#160;</td>
<td class="paramname"><em>argc</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">CHAR **&#160;</td>
<td class="paramname"><em>argv</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Initialize Pin system. Must be called before <a class="el" href="group__PIN__CONTROL.html#gaded401aeb030a76ee3396137b06ad808">PIN_StartProgram</a> </p><dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">argc</td><td>argc value passed to main </td></tr>
<tr><td class="paramname">argv</td><td>argv value passed to main, encoded in UTF8 (a superset of ASCII)</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>true if an error was detected parsing the command line</dd></dl>
<dl class="section note"><dt>Note</dt><dd>The pin client lock is obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT &amp; Probe<br />
<b>O/S</b>: Linux, Windows &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga8cf4aca0b0bdbc7fc0ae965883d8e3c2"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga8cf4aca0b0bdbc7fc0ae965883d8e3c2">&#9670;&nbsp;</a></span>PIN_InitSymbols()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">VOID LEVEL_PINCLIENT::PIN_InitSymbols </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Initialize symbol table code. Pin does not read symbols unless this is called. Must be called before <a class="el" href="group__PIN__CONTROL.html#gaded401aeb030a76ee3396137b06ad808">PIN_StartProgram</a></p>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT &amp; Probe<br />
<b>O/S</b>: Linux, Windows &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="gac133406ab660e13f67dd64f27cdf67c6"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gac133406ab660e13f67dd64f27cdf67c6">&#9670;&nbsp;</a></span>PIN_InitSymbolsAlt()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">BOOL LEVEL_PINCLIENT::PIN_InitSymbolsAlt </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__PIN__CONTROL.html#ga139152abe353fdff0216a5519d261c73">SYMBOL_INFO_MODE</a>&#160;</td>
<td class="paramname"><em>mode</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Initialize symbol table code with an explicitly specified mode of symbol support. <br />
Pin does not read symbols unless this is called. <br />
Must be called before <a class="el" href="group__PIN__CONTROL.html#gaded401aeb030a76ee3396137b06ad808">PIN_StartProgram</a>. <br />
Alternative to <a class="el" href="group__PIN__CONTROL.html#ga8cf4aca0b0bdbc7fc0ae965883d8e3c2">PIN_InitSymbols()</a> on Windows &amp; Linux. <br />
On macOS* it is implemented as <a class="el" href="group__PIN__CONTROL.html#ga8cf4aca0b0bdbc7fc0ae965883d8e3c2">PIN_InitSymbols()</a> <br />
</p><dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">mode</td><td>Explicit mode of symbol support. Valid values: <br />
EXPORT_SYMBOLS Only symbols taken from export table are provided. Line information is not available (Windows only). <br />
DEBUG_SYMBOLS Currently treated the same as DEBUG_OR_EXPORT_SYMBOLS (Windows only). <br />
IFUNC_SYMBOLS IFUNC symbols (Linux only). <br />
DEBUG_OR_EXPORT_SYMBOLS First debug symbols if available, otherwise export symbols. This mode is set by <a class="el" href="group__PIN__CONTROL.html#ga8cf4aca0b0bdbc7fc0ae965883d8e3c2">PIN_InitSymbols()</a> (Windows only) <br />
This parameter is ignored on operating systems other than Windows &amp; Linux. <br />
</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>TRUE if the operation succeeded <br />
</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT &amp; Probe<br />
<b>O/S</b>: Windows, Linux &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga163322863f36bbbeef986c94d319eef0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga163322863f36bbbeef986c94d319eef0">&#9670;&nbsp;</a></span>PIN_InsertCallProbed()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">VOID LEVEL_PINCLIENT::PIN_InsertCallProbed </td>
<td>(</td>
<td class="paramtype">ADDRINT&#160;</td>
<td class="paramname"><em>addr</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">AFUNPTR&#160;</td>
<td class="paramname"><em>funptr</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">&#160;</td>
<td class="paramname"><em>...</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Insert a call to an analysis routine relative to a location. In this location we expect to find a safe instruction, i.e. an instruction which is large enough to be replaced entirely with a jump instruction (i.e. 5/7 bytes long), it is not a control flow instruction, and it doesn't have memory operand.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">address</td><td>the application address to instrument </td></tr>
<tr><td class="paramname">funptr</td><td>the analysis function </td></tr>
<tr><td class="paramname">...</td><td><a class="el" href="group__INST__ARGS.html#ga089c27ca15e9ff139dd3a3f8a6f8451d">IARG_TYPE</a>. The list must end with IARG_END.</td></tr>
</table>
</dd>
</dl>
<p><a class="el" href="group__PIN__CONTROL.html#ga01a31bf221500b0ca0b97fb64cc62247">PIN_StartProgramProbed()</a> must be used when using this API.</p>
<p>Some restrictions apply when using IARG_CONTEXT. See <a class="el" href="group__INST__ARGS.html">Instrumentation arguments</a> for more information. IARG_THREAD_ID is not supported.</p>
<dl class="section note"><dt>Note</dt><dd>The pin client lock is obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> Probe<br />
<b>O/S</b>: All<br />
<b>CPU:</b> IA-32 and Intel(R) 64 architectures<br />
</dd></dl>
</div>
</div>
<a id="ga240de32335a0aca3ceee37ad96b1dd12"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga240de32335a0aca3ceee37ad96b1dd12">&#9670;&nbsp;</a></span>PIN_InterceptSignal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">BOOL LEVEL_PINCLIENT::PIN_InterceptSignal </td>
<td>(</td>
<td class="paramtype">INT32&#160;</td>
<td class="paramname"><em>sig</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__PIN__CONTROL.html#ga6ee371f87beed6c47af068b0631dd823">INTERCEPT_SIGNAL_CALLBACK</a>&#160;</td>
<td class="paramname"><em>fun</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">VOID *&#160;</td>
<td class="paramname"><em>val</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Establish an interceptor function for signals delivered to the application. Tools should never call sigaction() directly to handle signals. The interceptor function is called whenever the application receives the requested signal, regardless of whether the application has a handler for that signal. The tool's handler can then decide whether the signal should be forwarded to the application.</p>
<p>There are two intended usage models for this API, which are both advanced features. If your tool merely needs to be notified of signals that are sent to the application, use <a class="el" href="group__PIN__CONTROL.html#ga786fd61c9be3c42a1a6deefc71dffadf">PIN_AddContextChangeFunction()</a> instead.</p>
<p>In one usage model, a tool can take over ownership of a signal in order to use the signal as an asynchronous communication mechanism to the outside world. For example, if a tool intercepts SIGUSR1, a user of the tool could send this signal and tell the tool to do something. In this usage model, the tool may want to call <a class="el" href="group__PIN__CONTROL.html#gac7795f34b4a267644e4d10b288c38d96">PIN_UnblockSignal()</a> so that it will receive the signal even if the application attempts to block it.</p>
<p>In the second usage model, the tool may need to "squash" certain signals that the application generates. For example, a tool that forces speculative execution in the application may want to intercept and squash exceptions generated in the speculative code.</p>
<p>A tool can set only one "intercept" handler for a particular signal, so a new handler overwrites any previous handler for the same signal. To disable a handler, pass a NULL function pointer.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">sig</td><td>The signal number to intercept, which may not be SIGKILL or SIGSTOP. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">fun</td><td>The tool's intercept function, or NULL. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">val</td><td>Value to pass to the intercept function.</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>TRUE on success (always FALSE on Windows).</dd></dl>
<dl class="section note"><dt>Note</dt><dd>The pin client lock is obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="gac671358905f7d4dac7d544b6048e3ee3"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gac671358905f7d4dac7d544b6048e3ee3">&#9670;&nbsp;</a></span>PIN_IsActionPending()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">BOOL LEVEL_PINCLIENT::PIN_IsActionPending </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__PIN__THREAD__API.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a>&#160;</td>
<td class="paramname"><em>tid</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>This function is useful when an analysis routine might block for an indefinite period of time. In such cases, the analysis code can periodically call <a class="el" href="group__PIN__CONTROL.html#gac671358905f7d4dac7d544b6048e3ee3">PIN_IsActionPending()</a> to see if the thread has some pending action that needs to be handled in the Pin VM. If so, the analysis routine should return back to the VM, either by returning or by calling <a class="el" href="group__CONTEXT__API.html#gaa836395fa2c09ed62f85d74b46970659">PIN_ExecuteAt()</a>.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">tid</td><td>The ID of the calling thread.</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>TRUE if the thread has a pending action in the Pin VM.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux<br />
<b>CPU:</b> IA-32 and Intel(R) 64 architectures<br />
</dd></dl>
</div>
</div>
<a id="gabb4b02d78ee780c3b70e86a86ff798cd"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gabb4b02d78ee780c3b70e86a86ff798cd">&#9670;&nbsp;</a></span>PIN_IsAttaching()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">BOOL LEVEL_PINCLIENT::PIN_IsAttaching </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<dl class="section return"><dt>Returns</dt><dd>TRUE if Pin is being attached to a running application process </dd></dl>
</div>
</div>
<a id="ga294137f03b1d950d0f1f95968979b490"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga294137f03b1d950d0f1f95968979b490">&#9670;&nbsp;</a></span>PIN_IsProbeMode()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">BOOL LEVEL_PINCLIENT::PIN_IsProbeMode </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<dl class="section return"><dt>Returns</dt><dd>Return TRUE if -probe on command line or if Tool started application calling <a class="el" href="group__PIN__CONTROL.html#ga01a31bf221500b0ca0b97fb64cc62247">PIN_StartProgramProbed()</a>.<br />
</dd></dl>
<dl class="section note"><dt>Note</dt><dd>Tool can run in Probe mode without specifying -probe on the command line. This switch is provided as a convenience. In that case, <a class="el" href="group__PIN__CONTROL.html#ga294137f03b1d950d0f1f95968979b490">PIN_IsProbeMode()</a> will return FALSE before <a class="el" href="group__PIN__CONTROL.html#ga01a31bf221500b0ca0b97fb64cc62247">PIN_StartProgramProbed()</a> was called (Since the default running mode is JIT).</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT &amp; Probe<br />
<b>O/S</b>: Linux, Windows &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga389d27155d820029712f396a2a824370"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga389d27155d820029712f396a2a824370">&#9670;&nbsp;</a></span>PIN_IsSafeForProbedInsertion()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">BOOL LEVEL_PINCLIENT::PIN_IsSafeForProbedInsertion </td>
<td>(</td>
<td class="paramtype">ADDRINT&#160;</td>
<td class="paramname"><em>addr</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Check if the given location is safe for probe insertion. This means that the location contains an instruction which is large enough to be replaced entirely with a jump instruction (i.e. 5/7 bytes long), it is not a control flow instruction, and it doesn't have memory operand.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">address</td><td>the application address to instrument </td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>TRUE/FALSE if the location is safe</dd></dl>
<p><a class="el" href="group__PIN__CONTROL.html#ga01a31bf221500b0ca0b97fb64cc62247">PIN_StartProgramProbed()</a> must be used when using this API.</p>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> Probe<br />
<b>O/S</b>: All<br />
<b>CPU:</b> IA-32 and Intel(R) 64 architectures<br />
</dd></dl>
</div>
</div>
<a id="gadf5abd51ee9b1d599c539a9e2784e9ef"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gadf5abd51ee9b1d599c539a9e2784e9ef">&#9670;&nbsp;</a></span>PIN_LockClient()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">VOID LEVEL_PINCLIENT::PIN_LockClient </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Some Pin API functions may only be called when the thread is holding this lock. See also <a class="el" href="group__PIN__CONTROL.html#gaa6239dd852b5236f75413209aceb7a79">PIN_UnlockClient</a>. The client lock is recursive, so can be claimed again by a thread if it already holds it. PIN_LockClient and PIN_UnlockClient calls must be matched, since the lock implementation maintains a depth count.<br />
This function can be used in any thread, including internal threads spawned by the tool.</p>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT &amp; Probe<br />
<b>O/S</b>: Linux, Windows &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="gafc1635c2b2550236a66dcba25f9cc8a7"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gafc1635c2b2550236a66dcba25f9cc8a7">&#9670;&nbsp;</a></span>PIN_RemoveFiniFunctions()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">VOID LEVEL_PINCLIENT::PIN_RemoveFiniFunctions </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Invalidates all the Fini callback functions registered via <a class="el" href="group__PIN__CONTROL.html#gac167b8d28d255e53a0ac1f6e9edcd3ec">PIN_AddFiniFunction</a>; Fini callbacks will no longer be called before the application exits.</p>
<p>Must be called prior to invoking <a class="el" href="group__PIN__CONTROL.html#ga6277d16bf33ede39685a26a92fc3cbef">PIN_Detach</a> if the tool has previously registered Fini callbacks and libc.so is not yet loaded into memory yet for a dynamically linked binary.</p>
<dl class="section note"><dt>Note</dt><dd>The pin client lock is obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux, Windows &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga7f5784c3b9431086f3b5b750912ca0c2"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga7f5784c3b9431086f3b5b750912ca0c2">&#9670;&nbsp;</a></span>PIN_RemoveInstrumentation()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">VOID LEVEL_PINCLIENT::PIN_RemoveInstrumentation </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>All instrumentation is removed. When application code is executed the instrumentation routines will be called to reinstrument all code. Similarly, any ahead-of-time instrumentation will be reapplied if the relevant code is re-executed.</p>
<dl class="section note"><dt>Note</dt><dd>The vm lock is obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux, Windows &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="gaf896499ed7402ef4e34baaa64626e0bd"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gaf896499ed7402ef4e34baaa64626e0bd">&#9670;&nbsp;</a></span>PIN_RemoveInstrumentationInRange()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">VOID LEVEL_PINCLIENT::PIN_RemoveInstrumentationInRange </td>
<td>(</td>
<td class="paramtype">ADDRINT&#160;</td>
<td class="paramname"><em>start</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">ADDRINT&#160;</td>
<td class="paramname"><em>end</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Removes all instrumentation from the given range [start,end]. If the application reaches this range again, the code will be reinstrumented. Can be called from an analysis function or a callback. Note: Some code beyond the start and end margins may be reinstrumented as well.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">start</td><td>The starting address of the range </td></tr>
<tr><td class="paramname">end</td><td>The ending address (inclusive) of the range</td></tr>
</table>
</dd>
</dl>
<dl class="section note"><dt>Note</dt><dd>The vm lock is obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux, Windows &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga98669d2f5629027689d60bd852ffa0eb"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga98669d2f5629027689d60bd852ffa0eb">&#9670;&nbsp;</a></span>PIN_SafeCopy()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">size_t LEVEL_PINCLIENT::PIN_SafeCopy </td>
<td>(</td>
<td class="paramtype">VOID *&#160;</td>
<td class="paramname"><em>dst</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const VOID *&#160;</td>
<td class="paramname"><em>src</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">size_t&#160;</td>
<td class="paramname"><em>size</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Copy the specified number of bytes from a source memory region to a destination memory region. The function guarantees safe return to the caller even if the source or destination regions are inaccessible (entirely or partially).</p>
<p>Tools should use this function to ensure safe access to the original content of the application's memory. For example, on Windows, Pin replaces certain TEB fields when running analysis routines in the tool. If the tool accesses these fields directly, it would see the values assigned by Pin rather than the original ones. On the contrary, <a class="el" href="group__PIN__CONTROL.html#ga98669d2f5629027689d60bd852ffa0eb">PIN_SafeCopy()</a> always reads and modifies the original application's values of these fields.</p>
<p>This function can be used in any thread, including any internal thread spawned by the tool.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[out]</td><td class="paramname">dst</td><td>destination region </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">src</td><td>region to copy from </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">size</td><td>number of bytes to copy</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Number of bytes successfully copied from the source to the destination region.</dd></dl>
<dl class="section note"><dt>Note</dt><dd><a class="el" href="group__PIN__CONTROL.html#ga98669d2f5629027689d60bd852ffa0eb">PIN_SafeCopy()</a> should not be called before the application has been started. For instance, it cannot be called in an Image load callback. Unexpected results will occur.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux, Windows<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga271a2d60a060ddd0c13d6599afe8c0e2"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga271a2d60a060ddd0c13d6599afe8c0e2">&#9670;&nbsp;</a></span>PIN_SafeCopyEx()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">size_t LEVEL_PINCLIENT::PIN_SafeCopyEx </td>
<td>(</td>
<td class="paramtype">VOID *&#160;</td>
<td class="paramname"><em>dst</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const VOID *&#160;</td>
<td class="paramname"><em>src</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">size_t&#160;</td>
<td class="paramname"><em>size</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">EXCEPTION_INFO *&#160;</td>
<td class="paramname"><em>pExceptInfo</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Copy the specified number of bytes from a source memory region to a destination memory region. The function guarantees safe return to the caller even if the source or destination regions are inaccessible (entirely or partially).</p>
<p>In addition to the <a class="el" href="group__PIN__CONTROL.html#ga98669d2f5629027689d60bd852ffa0eb">PIN_SafeCopy</a> functionality, this function allows the tool to obtain detailed exception information in case of failure.</p>
<p>This function can be used in any thread, including any internal thread spawned by the tool.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[out]</td><td class="paramname">dst</td><td>destination region </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">src</td><td>region to copy from </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">size</td><td>number of bytes to copy </td></tr>
<tr><td class="paramdir">[out]</td><td class="paramname">pExceptInfo</td><td>pointer to the structure that receives the exception information in case of failure.</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>Number of bytes successfully copied from the source to the destination region. If the function fails to copy all bytes, it provides detailed description of the failure in the <em></em> &lt;pExceptInfo&gt; structure.</dd></dl>
<dl class="section note"><dt>Note</dt><dd>The exception address in the returned exception information always has zero value. If the tool wants to raise this exception on behalf of the application, it should use PIN_SetExceptionAddress function to set an appropriate exception address before passing the exception information to the <a class="el" href="group__EXCEPTION__API.html#ga656279818bb8972fbdac576b57854561">PIN_RaiseException</a> function.</dd>
<dd>
<a class="el" href="group__PIN__CONTROL.html#ga271a2d60a060ddd0c13d6599afe8c0e2">PIN_SafeCopyEx()</a> should not be called before the application has been started. For instance, it cannot be called in an Image load callback. Unexpected results will occur.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux, Windows<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga48dd43d356a2b768c7c0d3cbc4e1fee6"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga48dd43d356a2b768c7c0d3cbc4e1fee6">&#9670;&nbsp;</a></span>PIN_SetAllowedConcurrentCallbacks()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">VOID LEVEL_PINCLIENT::PIN_SetAllowedConcurrentCallbacks </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__PIN__CONTROL.html#gadfef9e89968c6491114d7ceae51ab61b">PIN_CONFIGURATION_INFO</a>&#160;</td>
<td class="paramname"><em>options</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__PIN__CONTROL.html#ga4e114852e46d5d839d6e71e242709777">PIN_CALLBACK_TYPE</a>&#160;</td>
<td class="paramname"><em>callbackType</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Enables/disables concurrent delivery of certain callbacks in a specific PIN_CONFIGURATION_INFO instance.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">options</td><td>The <a class="el" href="group__PIN__CONTROL.html#gadfef9e89968c6491114d7ceae51ab61b">PIN_CONFIGURATION_INFO</a> instance to modify. </td></tr>
<tr><td class="paramname">callbackType</td><td>Specifies which Pin callbacks are allowed to be delivered concurrently:<br />
<br />
In the case where a callback should be delivered to several threads at a given moment, delivering a callback concurrently means that each thread is free to deliver its the respective callbacks without waiting for the other threads. This means that Pin doesn't acquire any exclusive internal lock in order to deliver a concurrent callback<br />
<br />
In constrast, delivering a callback in a serialized way means that, in a given moment, only one threads is allowed to deliver any type of callback. Serializing the callback might hurt the performance of your Pin tool, but it will protect the tool against possibly race conditions in your tool. When a callback is considered "serialized", Pin will acquire an exclusive internal lock before delivering the callback to the tool.</td></tr>
</table>
</dd>
</dl>
<dl class="section note"><dt>Note</dt><dd>In order for this option to take effect the <a class="el" href="group__PIN__CONTROL.html#gadfef9e89968c6491114d7ceae51ab61b">PIN_CONFIGURATION_INFO</a> must be passed to <a class="el" href="group__PIN__CONTROL.html#gaded401aeb030a76ee3396137b06ad808">PIN_StartProgram()</a>.</dd>
<dd>
Currently, other types of callbacks (which don't have a respective enum entry in <a class="el" href="group__PIN__CONTROL.html#ga4e114852e46d5d839d6e71e242709777">PIN_CALLBACK_TYPE</a>) are serialized by Pin with no option to change that.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux<br />
<b>CPU:</b> IA-32 and Intel(R) 64 architectures<br />
</dd></dl>
</div>
</div>
<a id="gaec69b96ad1f34e000f56a06abfd1311b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gaec69b96ad1f34e000f56a06abfd1311b">&#9670;&nbsp;</a></span>PIN_SetSmcSupport()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">VOID LEVEL_PINCLIENT::PIN_SetSmcSupport </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__PIN__CONTROL.html#ga0244f9b4e34e4eed7d483fa6ec7b70f0">SMC_ENABLE_DISABLE_TYPE</a>&#160;</td>
<td class="paramname"><em>enable_disable</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Enable/Disable Pin's support of self modifying code When enabled, Pin will detect self modification of code and will deliver a callback, if one is registered, when such an event happens. When disabled and if SMC occurs, the SMC will not be detected and the original code will continue to execute. This function takes precedence over the specification of smc_support in the invocation line. This function must be called before PIN_StartProgram.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">enable</td><td>SMC_ENABLE, or SMC_DISABLE</td></tr>
</table>
</dd>
</dl>
<p>SMC support is enabled by default</p>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Windows, Linux &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="gaded401aeb030a76ee3396137b06ad808"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gaded401aeb030a76ee3396137b06ad808">&#9670;&nbsp;</a></span>PIN_StartProgram()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">VOID LEVEL_PINCLIENT::PIN_StartProgram </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__PIN__CONTROL.html#gadfef9e89968c6491114d7ceae51ab61b">PIN_CONFIGURATION_INFO</a>&#160;</td>
<td class="paramname"><em>options</em> = <code><a class="el" href="group__PIN__CONTROL.html#gabf3035f1cd239935bb4b9d45b39be266">PIN_CreateDefaultConfigurationInfo</a>()</code></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Starts executing the application, when Pin is in JIT mode, which is the default. Note that <a class="el" href="group__PIN__CONTROL.html#ga783d3bd40c3fb2ca51b1f9af31a70c9c">PIN_Init()</a> must be called before <a class="el" href="group__PIN__CONTROL.html#gaded401aeb030a76ee3396137b06ad808">PIN_StartProgram()</a>.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramname">options</td><td>Pin global configuration to use in this run of Pin. These configuration options are set only once (during the call of <a class="el" href="group__PIN__CONTROL.html#gaded401aeb030a76ee3396137b06ad808">PIN_StartProgram()</a>), and they are affecting the entire execution of Pin.</td></tr>
</table>
</dd>
</dl>
<dl class="section note"><dt>Note</dt><dd>The <a class="el" href="group__PIN__CONTROL.html#gaded401aeb030a76ee3396137b06ad808">PIN_StartProgram()</a> function never returns. It also unwinds the tool's stack, so any local (stack based) variables are lost.</dd>
<dd>
The vm and pin client locks are obtained during the call of this API.</dd></dl>
<p>See also: <a class="el" href="group__PIN__CONTROL.html#gabf3035f1cd239935bb4b9d45b39be266">PIN_CreateDefaultConfigurationInfo()</a>.</p>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux, Windows &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga01a31bf221500b0ca0b97fb64cc62247"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga01a31bf221500b0ca0b97fb64cc62247">&#9670;&nbsp;</a></span>PIN_StartProgramProbed()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">VOID LEVEL_PINCLIENT::PIN_StartProgramProbed </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Starts executing the application, when Pin is in Probe mode. Note that <a class="el" href="group__PIN__CONTROL.html#ga783d3bd40c3fb2ca51b1f9af31a70c9c">PIN_Init()</a> must be called before <a class="el" href="group__PIN__CONTROL.html#ga01a31bf221500b0ca0b97fb64cc62247">PIN_StartProgramProbed()</a>.</p>
<p>The <a class="el" href="group__PIN__CONTROL.html#ga01a31bf221500b0ca0b97fb64cc62247">PIN_StartProgramProbed()</a> function never returns. It also unwinds the tool's stack, so any local (stack based) variables are lost.</p>
<dl class="section note"><dt>Note</dt><dd>The vm and pin client locks are obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> Probe<br />
<b>O/S</b>: Linux, Windows &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="gac266390e4b69a624a88adcda64ac86c8"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gac266390e4b69a624a88adcda64ac86c8">&#9670;&nbsp;</a></span>PIN_ToolFullPath()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">const CHAR* LEVEL_PINCLIENT::PIN_ToolFullPath </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Returns full path of main Pin tool binary image, encoded in UTF8 (superset of ASCII).</p>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT &amp; Probe<br />
<b>O/S</b>: Windows, Linux<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga4b5c7f34928a2594509ba69baf404129"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga4b5c7f34928a2594509ba69baf404129">&#9670;&nbsp;</a></span>PIN_TryEnd()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">VOID LEVEL_PINCLIENT::PIN_TryEnd </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__PIN__THREAD__API.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a>&#160;</td>
<td class="paramname"><em>tid</em></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Unregister the last registered notification function (registered via <a class="el" href="group__PIN__CONTROL.html#ga75d9372356e0cda2acb7f5851d328575">PIN_TryStart()</a>) from the context of the calling thread. This function should be called in the same function scope as the previously registered <a class="el" href="group__PIN__CONTROL.html#ga75d9372356e0cda2acb7f5851d328575">PIN_TryStart()</a>.<br />
This function can be used in any thread, including any internal thread spawned by the tool.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">tid</td><td>Id of the calling thread.</td></tr>
</table>
</dd>
</dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Windows, Linux<br />
<b>CPU:</b> IA-32 and Intel(R) 64 architectures<br />
</dd></dl>
</div>
</div>
<a id="ga75d9372356e0cda2acb7f5851d328575"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga75d9372356e0cda2acb7f5851d328575">&#9670;&nbsp;</a></span>PIN_TryStart()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">VOID LEVEL_PINCLIENT::PIN_TryStart </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__PIN__THREAD__API.html#ga645289be59039349ad77ad2fa7b0e2f3">THREADID</a>&#160;</td>
<td class="paramname"><em>tid</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__PIN__CONTROL.html#ga9578251834f6ec47ac1a5c99ded59fe9">INTERNAL_EXCEPTION_CALLBACK</a>&#160;</td>
<td class="paramname"><em>fun</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">VOID *&#160;</td>
<td class="paramname"><em>val</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Register a per-thread notification handler function that is called upon receipt of an internal exception in pin or the tool in the context of the calling thread. Use <a class="el" href="group__PIN__CONTROL.html#ga4b5c7f34928a2594509ba69baf404129">PIN_TryEnd()</a> in order to remove the registered handler from the context of the calling thread (do it in the same function scope). The user can register up to MAX_IEH_CALLBACKS per-thread notification functions.<br />
This function can be used in any thread, including any internal thread spawned by the tool.</p>
<dl class="section note"><dt>Note</dt><dd>It is unsupported to call <a class="el" href="group__PIN__CONTROL.html#ga5ae5853e6600a23f9c552cba784870cc">PIN_CallApplicationFunction()</a> in the scope of <a class="el" href="group__PIN__CONTROL.html#ga75d9372356e0cda2acb7f5851d328575">PIN_TryStart()</a> / <a class="el" href="group__PIN__CONTROL.html#ga4b5c7f34928a2594509ba69baf404129">PIN_TryEnd()</a> pair.<br />
</dd></dl>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">tid</td><td>Id of the calling thread. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">fun</td><td>Handler function to execute upon receipt of internal exception in pin/tool. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">val</td><td>Value to pass to the handler function.</td></tr>
</table>
</dd>
</dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Windows, Linux<br />
<b>CPU:</b> IA-32 and Intel(R) 64 architectures<br />
</dd></dl>
</div>
</div>
<a id="gac7795f34b4a267644e4d10b288c38d96"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gac7795f34b4a267644e4d10b288c38d96">&#9670;&nbsp;</a></span>PIN_UnblockSignal()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">BOOL LEVEL_PINCLIENT::PIN_UnblockSignal </td>
<td>(</td>
<td class="paramtype">INT32&#160;</td>
<td class="paramname"><em>sig</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">BOOL&#160;</td>
<td class="paramname"><em>enable</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div><div class="memdoc">
<p>This API is normally used in conjunction with <a class="el" href="group__PIN__CONTROL.html#ga240de32335a0aca3ceee37ad96b1dd12">PIN_InterceptSignal()</a> to prevent the application from blocking a signal that the tool intercepts. This is useful if the tool wants to ensure that the application will not prevent the tool from receiving the intercepted signal.</p>
<p>When this API is called before <a class="el" href="group__PIN__CONTROL.html#gaded401aeb030a76ee3396137b06ad808">PIN_StartProgram()</a>, it affects all threads in the application. However, if it is called after <a class="el" href="group__PIN__CONTROL.html#gaded401aeb030a76ee3396137b06ad808">PIN_StartProgram()</a>, it only affects the calling thread. If the application spawns a thread, the child thread inherits the signal blocking state from its parent.</p>
<p>Tools should take care when using this API because it can adversely affect the application if it also uses the signal <em>sig</em>.</p>
<dl class="params"><dt>Parameters</dt><dd>
<table class="params">
<tr><td class="paramdir">[in]</td><td class="paramname">sig</td><td>The signal number, which may not be SIGKILL or SIGSTOP. </td></tr>
<tr><td class="paramdir">[in]</td><td class="paramname">enable</td><td>If TRUE, the application is prevented from blocking <em>sig</em>. If FALSE, the application may block or unblock <em>sig</em> at will.</td></tr>
</table>
</dd>
</dl>
<dl class="section return"><dt>Returns</dt><dd>TRUE on success (always FALSE on Windows).</dd></dl>
<dl class="section note"><dt>Note</dt><dd>The pin client lock is obtained during the call of this API.</dd></dl>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="gaa6239dd852b5236f75413209aceb7a79"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gaa6239dd852b5236f75413209aceb7a79">&#9670;&nbsp;</a></span>PIN_UnlockClient()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">VOID LEVEL_PINCLIENT::PIN_UnlockClient </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Some Pin API functions may be called only when the thread is holding this lock. See also <a class="el" href="group__PIN__CONTROL.html#gadf5abd51ee9b1d599c539a9e2784e9ef">PIN_LockClient</a>.<br />
This function can be used in any thread, including any internal thread spawned by the tool.</p>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT &amp; Probe<br />
<b>O/S</b>: Linux, Windows &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
<a id="ga1c358b4853587c9556c8d464c1bae643"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ga1c358b4853587c9556c8d464c1bae643">&#9670;&nbsp;</a></span>PIN_Version()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">const std::string&amp; LEVEL_PINCLIENT::PIN_Version </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Returns a fully descriptive Pin version string, including the Intel copyright notice. The returned version is the Pin version that the tool was linked with. </p>
</div>
</div>
<a id="gab047eba18942e83814934eda278de607"></a>
<h2 class="memtitle"><span class="permalink"><a href="#gab047eba18942e83814934eda278de607">&#9670;&nbsp;</a></span>PIN_VmFullPath()</h2>
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">CHAR* LEVEL_PINCLIENT::PIN_VmFullPath </td>
<td>(</td>
<td class="paramname"></td><td>)</td>
<td></td>
</tr>
</table>
</div><div class="memdoc">
<p>Returns full path of Pin binary invoked, encoded in UTF8 (superset of ASCII), this is supported for Linux (only for locales encoded in UTF8).</p>
<dl class="section user"><dt>Availability:</dt><dd><b>Mode:</b> JIT<br />
<b>O/S</b>: Linux &amp; macOS*<br />
<b>CPU:</b> All<br />
</dd></dl>
</div>
</div>
</div><!-- contents -->
<!-- start footer part -->
<hr class="footer"/><address class="footer"><small>
Generated by &#160;<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/>
</a> 1.8.13
</small></address>
</body>
</html>