public static void Run() { DMethodA MethodADelegate = new DMethodA(MethodA); DMethodB MethodBDelegate = new DMethodB(MethodB); GC.KeepAlive(MethodADelegate); GC.KeepAlive(MethodBDelegate); LHTestMethodA = Marshal.GetFunctionPointerForDelegate(MethodADelegate); LHTestMethodB = Marshal.GetFunctionPointerForDelegate(MethodBDelegate); // install hooks LocalHook[] MyHooks = new LocalHook[6]; Int32 Index = 0; LocalHook.BeginUpdate(true); { LocalHook.BeginUpdate(true); { LocalHook.BeginUpdate(true); { MyHooks[Index++] = LocalHook.Create( LHTestMethodA, LHTestHookA, Index); MyHooks[Index++] = LocalHook.Create( LHTestMethodB, LHTestHookB, Index); } LocalHook.CancelUpdate(); MyHooks[Index++] = LocalHook.Create( LHTestMethodA, LHTestHookA, Index); MyHooks[Index++] = LocalHook.Create( LHTestMethodB, LHTestHookB, Index); } LocalHook.CancelUpdate(); MyHooks[Index++] = LocalHook.Create( LHTestMethodA, LHTestHookA, Index); MyHooks[Index++] = LocalHook.Create( LHTestMethodB, LHTestHookB, Index); } LocalHook.EndUpdate(); // we want to intercept all threads... MyHooks[4].ThreadACL.SetExclusiveACL(null); MyHooks[5].ThreadACL.SetExclusiveACL(null); LHTestMethodADelegate = (DMethodA)Marshal.GetDelegateForFunctionPointer(LHTestMethodA, typeof(DMethodA)); LHTestMethodBDelegate = (DMethodB)Marshal.GetDelegateForFunctionPointer(LHTestMethodB, typeof(DMethodB)); /* * This is just to make sure that all related objects are referenced. * At the beginning there were several objects like delegates that have * been collected during execution! The NET-Framework will produce bugchecks * in such cases... */ GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); IntPtr t = Marshal.GetFunctionPointerForDelegate(LHTestHookA); Int64 t1 = System.Diagnostics.Stopwatch.GetTimestamp(); for (int i = 0; i < LHTestThreadCount; i++) { new Thread(new ThreadStart(LHTestThread)).Start(); } LHTestCompleted.WaitOne(); t1 = ((System.Diagnostics.Stopwatch.GetTimestamp() - t1) * 1000) / System.Diagnostics.Stopwatch.Frequency; // verify results if ((LHTestCounterMA != LHTestCounterMAH) || (LHTestCounterMAH != LHTestCounterMB) || (LHTestCounterMB != LHTestCounterMBH) || (LHTestCounterMB != LHTestThreadCount * 10000)) { throw new Exception("LocalHook test failed."); } Console.WriteLine("Localhook test passed in {0} ms.", t1); }