public static CorJitInfoHook Hook(ICorJitInfo *comp, IntPtr ftn, CORINFO_EH_CLAUSE *clauses) { const int slotNum = 8; IntPtr * vfTbl = comp->vfptr; const int SLOT_NUM = 0x9E; var newVfTbl = (IntPtr *)Marshal.AllocHGlobal(SLOT_NUM * IntPtr.Size); for (int i = 0; i < SLOT_NUM; i++) { newVfTbl[i] = vfTbl[i]; } var ret = new CorJitInfoHook { ftn = ftn, info = comp, clauses = clauses, newVfTbl = newVfTbl, oldVfTbl = vfTbl }; ret.n_getEHinfo = ret.hookEHInfo; ret.o_getEHinfo = (getEHinfo)Marshal.GetDelegateForFunctionPointer(vfTbl[slotNum], typeof(getEHinfo)); newVfTbl[slotNum] = Marshal.GetFunctionPointerForDelegate(ret.n_getEHinfo); comp->vfptr = newVfTbl; return(ret); }
public unsafe static CorJitInfoHook Hook(ICorJitInfo *comp, IntPtr ftn, CORINFO_EH_CLAUSE *clauses) { IntPtr *vfptr = comp->vfptr; IntPtr *ptr = (IntPtr *)(void *)Marshal.AllocHGlobal(158 * IntPtr.Size); for (int i = 0; i < 158; i++) { ptr[i] = vfptr[i]; } CorJitInfoHook corJitInfoHook = new CorJitInfoHook { ftn = ftn, info = comp, clauses = clauses, newVfTbl = ptr, oldVfTbl = vfptr }; corJitInfoHook.n_getEHinfo = corJitInfoHook.hookEHInfo; corJitInfoHook.o_getEHinfo = (getEHinfo)Marshal.GetDelegateForFunctionPointer(vfptr[8], typeof(getEHinfo)); ptr[8] = Marshal.GetFunctionPointerForDelegate(corJitInfoHook.n_getEHinfo); comp->vfptr = ptr; return(corJitInfoHook); }
static uint HookHandler(IntPtr self, ICorJitInfo *comp, CORINFO_METHOD_INFO *info, uint flags, byte **nativeEntry, uint *nativeSizeOfCode) { if (info != null && info->scope == moduleHnd && info->ILCode[0] == 0x14) { uint token; if (ver5) { var getMethodDef = (getMethodDefFromMethod)Marshal.GetDelegateForFunctionPointer(comp->vfptr[0x64], typeof(getMethodDefFromMethod)); token = getMethodDef((IntPtr)comp, info->ftn); } else { ICorClassInfo *clsInfo = ICorStaticInfo.ICorClassInfo(ICorDynamicInfo.ICorStaticInfo(ICorJitInfo.ICorDynamicInfo(comp))); int gmdSlot = 12 + (ver4 ? 2 : 1); var getMethodDef = (getMethodDefFromMethod)Marshal.GetDelegateForFunctionPointer(clsInfo->vfptr[gmdSlot], typeof(getMethodDefFromMethod)); token = getMethodDef((IntPtr)clsInfo, info->ftn); } uint lo = 0, hi = len; uint?offset = null; while (hi >= lo) { uint mid = lo + ((hi - lo) >> 1); uint midTok = *(ptr + (mid << 1)); if (midTok == token) { offset = *(ptr + (mid << 1) + 1); break; } if (midTok < token) { lo = mid + 1; } else { hi = mid - 1; } } if (offset == null) { return(originalDelegate(self, comp, info, flags, nativeEntry, nativeSizeOfCode)); } uint *dataPtr = ptr + (uint)offset; uint dataLen = *dataPtr++; var newPtr = (uint *)Marshal.AllocHGlobal((int)dataLen << 2); try { var data = (MethodData *)newPtr; uint *copyData = newPtr; uint state = token * (uint)Mutation.KeyI0; uint counter = state; for (uint i = 0; i < dataLen; i++) { *copyData = *dataPtr++ ^ state; state += (*copyData++) ^ counter; counter ^= (state >> 5) | (state << 27); } info->ILCodeSize = data->ILCodeSize; if (ver4) { *((uint *)(info + 1) + 0) = data->MaxStack; *((uint *)(info + 1) + 1) = data->EHCount; *((uint *)(info + 1) + 2) = data->Options; } else { *((ushort *)(info + 1) + 0) = (ushort)data->MaxStack; *((ushort *)(info + 1) + 1) = (ushort)data->EHCount; *((uint *)(info + 1) + 1) = data->Options; } var body = (byte *)(data + 1); info->ILCode = body; body += info->ILCodeSize; if (data->LocalVars != 0) { ExtractLocalVars(info, data->LocalVars, body); body += data->LocalVars; } var ehPtr = (CORINFO_EH_CLAUSE *)body; uint ret; if (ver5) { CorJitInfoHook hook = CorJitInfoHook.Hook(comp, info->ftn, ehPtr); ret = originalDelegate(self, comp, info, flags, nativeEntry, nativeSizeOfCode); hook.Dispose(); } else { CorMethodInfoHook hook = CorMethodInfoHook.Hook(comp, info->ftn, ehPtr); ret = originalDelegate(self, comp, info, flags, nativeEntry, nativeSizeOfCode); hook.Dispose(); } return(ret); } finally { Marshal.FreeHGlobal((IntPtr)newPtr); } } return(originalDelegate(self, comp, info, flags, nativeEntry, nativeSizeOfCode)); }
public static CorJitInfoHook Hook(ICorJitInfo* comp, IntPtr ftn, CORINFO_EH_CLAUSE* clauses) { const int slotNum = 8; IntPtr* vfTbl = comp->vfptr; const int SLOT_NUM = 0x9E; var newVfTbl = (IntPtr*)Marshal.AllocHGlobal(SLOT_NUM * IntPtr.Size); for (int i = 0; i < SLOT_NUM; i++) newVfTbl[i] = vfTbl[i]; var ret = new CorJitInfoHook { ftn = ftn, info = comp, clauses = clauses, newVfTbl = newVfTbl, oldVfTbl = vfTbl }; ret.n_getEHinfo = ret.hookEHInfo; ret.o_getEHinfo = (getEHinfo)Marshal.GetDelegateForFunctionPointer(vfTbl[slotNum], typeof(getEHinfo)); newVfTbl[slotNum] = Marshal.GetFunctionPointerForDelegate(ret.n_getEHinfo); comp->vfptr = newVfTbl; return ret; }