| 统计 
    		    日志总数: 129评论总数: 123
 
 日志分类 日志归档 最近日志 最近评论 订阅 | 
  	         
    
        |   | 【技术资料】 | 阅读 38935 次 | 
 强制切换一个线程来执行指定的函数
        2013-08-05 12:33:20
     
        
        
     
		#include <stdio.h>    #define _WIN32_WINNT 0x0501    #include <windows.h>      volatile long th1_start = 0;    volatile long th1_continue = 0;    volatile long th2_finished = 0;      DWORD WINAPI thread_fun1(LPVOID arg)    {        InterlockedIncrement(&th1_start);          while(!th1_continue)        {            Sleep(1);        }          printf("fun 1: Hello!\n");        printf("fun 1: World!\n");          return 0;    }      void __declspec(naked) fun2()    {      __asm {           pushad       }        printf("fun 2: Hello!\n");        printf("fun 2: China!\n");          InterlockedIncrement(&th2_finished);          __asm {          popad;          ret;      }  }      int main()    {        HANDLE hThread = CreateThread(NULL, 0, thread_fun1, 0, 0, 0);          while(!th1_start)            Sleep(1);          SuspendThread(hThread);        CONTEXT ctx;        ctx.ContextFlags = CONTEXT_FULL;        GetThreadContext(hThread, &ctx);          ctx.Esp -= 4;      *(DWORD*)(DWORD_PTR)ctx.Esp = ctx.Eip;      ctx.Eip = (DWORD)(DWORD_PTR)fun2;         SetThreadContext(hThread, &ctx);        FlushInstructionCache(hThread, fun2, 5);      ResumeThread(hThread);          while(!th2_finished)        {            Sleep(1);        }          InterlockedIncrement(&th1_continue);          WaitForSingleObject(hThread, INFINITE);        system("pause");        return 0;    }
   
上面的代码实现了让本来在执行 thread_fun1 的线程强制切换来执行 fun2 中的代码. 并在 fun2 执行完后返回到原来的位置. ▲评论 |