句柄再谈

windows核心编程曾经提到过句柄表示的其实不是内核所在的地址
我们通过句柄的值就可以知道该句柄在句柄表中的位置,进而通过句柄表中这个位置的信息来对真正的内核对象进行操作
所以如果重复使用OpenProcess或者OpenThread打开相同的进程或者线程,每次得到的值都是不一样的
这就好比一张表,第一次我用OpenProcess打开了一个进程内核对象,在表的第1个位置插入了一个句柄,该句柄的值表示句柄表的1的位置
然后,我再用OpenProcess打开相同的一个进程内核对象,又在第二个位置插入了一个句柄,该句柄的值表示句柄2的位置………….
可以说句柄的值的含义不是确定的,可能在不同的操作系统中也不一样,但是一定是和句柄表中的位置是相关的,所以反复打开同一个内核对象,在句柄表中的位置不一样,句柄的值当然不一样
我再附上一个例子

#include 
#include 
#include 
using namespace std;
typedef HANDLE (WINAPI * OPENTHREADFUN)(DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwThreadId);  
int main()
{

    HANDLE hThread1,hThread2,hThread3,hThread4;
    HMODULE hKernel32 = ::GetModuleHandle(TEXT("kernel32.dll"));   
    OPENTHREADFUN pFun = (OPENTHREADFUN)GetProcAddress(hKernel32,TEXT("OpenThread")); 
    DWORD id=GetCurrentThreadId();
    hThread1=pFun(THREAD_ALL_ACCESS,FALSE,id);
    hThread2=pFun(THREAD_ALL_ACCESS,FALSE,id);
    hThread3=pFun(THREAD_ALL_ACCESS,FALSE,id);
    hThread4=pFun(THREAD_ALL_ACCESS,FALSE,id);
    //打开主线程内核对象4次
    cout<<"hThread1:"<"hThread2:"<"hThread3:"<"hThread4:"<if(hThread1)
        CloseHandle(hThread1);
    if(hThread2)
        CloseHandle(hThread2);
    if(hThread3)
        CloseHandle(hThread3);
    if(hThread4)
        CloseHandle(hThread4);
    system("pause");
    return 0;
}

测试结果:
句柄再谈_第1张图片

你可能感兴趣的:(句柄再谈)