1. 程式人生 > >Win API:之GetCurrentThread、GetCurrentThreadId、GetCurrentProcess、GetCurrentProcessId

Win API:之GetCurrentThread、GetCurrentThreadId、GetCurrentProcess、GetCurrentProcessId

ssh include 系統 out value gin ica exit generate

  Win API:之GetCurrentThread、GetCurrentThreadId、GetCurrentProcess、GetCurrentProcessId

 {返回當前線程的虛擬句柄} GetCurrentThread: THandle;
 {返回當前線程 ID} GetCurrentThreadId: DWORD;
 {返回當前進程的虛擬句柄} GetCurrentProcess: THandle;
 {返回當前進程 ID} GetCurrentProcessId: DWORD;

  提示:
  ID 是系統唯一的標識.
  所謂虛擬句柄, 就是該句柄只在調用進程的進程中有效, 也不能被繼承;


  如果用於其他進程需要用 DuplicateHandle 復制句柄;
  GetCurrentProcess 返回的虛擬句柄可以通過 OpenProcess 創建一個真實的句柄.

C++ Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include <iostream>
#include <Windows.h>
#include <process.h>
#include <tchar.h>
#include <strsafe.h>

#define BUF_SIZE 255

typedef struct MyData {
int nVal1;
int nVal2;
} MYDATA, *PMYDATA;

using namespace std;

DWORD WINAPI MyThread( LPVOID lpParam );


int
main(void)
{
HANDLE hProcess =
NULL;
DWORD dwProcessId =
0;
HANDLE hThread =
NULL;
DWORD dwThreadId =
0;
PMYDATA pData;

hProcess = GetCurrentProcess();
//進程偽句柄
cout << "The Current Process Pseudo Handle is " << hProcess << endl;
DuplicateHandle(GetCurrentProcess(),
GetCurrentProcess(),
GetCurrentProcess(),
&hProcess,
0,
FALSE,
DUPLICATE_SAME_ACCESS
);
cout <<
"The Current Process Real Handle is " << hProcess << endl;
dwProcessId = GetCurrentProcessId();
cout <<
"The Current Process Id is " << dwProcessId << endl;

// Allocate memory for thread data.
pData = (PMYDATA) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(MYDATA));

if( pData == NULL )
{
ExitProcess(
2);
}
// Generate unique data for each thread.
pData->nVal1 = 1;
pData->nVal2 =
100;
// Create Thread
hThread = CreateThread( NULL, // default security attributes
0, // use default stack size
MyThread, // thread function
pData, // argument to thread function
0, // use default creation flags
&dwThreadId); // returns the thread identifier

cin.get();
return 0;
}

DWORD WINAPI MyThread( LPVOID lpParam )
{
HANDLE hThread =
NULL;
DWORD dwThreadId =
0;
hThread = GetCurrentThread();
//線程偽句柄
cout << "The Current Thread Pseudo Handle is " << hThread << endl;
DuplicateHandle(GetCurrentProcess(),
GetCurrentThread(),
GetCurrentProcess(),
&hThread,
0,
FALSE,
DUPLICATE_SAME_ACCESS
);
cout <<
"The Current Thread Real Handle is " << hThread << endl;
dwThreadId = GetCurrentThreadId();
cout <<
"The Current Thread Id is " << dwThreadId << endl;

HANDLE hStdout;
PMYDATA pData;

TCHAR msgBuf[BUF_SIZE] = {
0};
size_t cchStringSize;
DWORD dwChars;

hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if( hStdout == INVALID_HANDLE_VALUE )
return 1;

// Cast the parameter to the correct data type.
pData = (PMYDATA)lpParam;

// Print the parameter values using thread-safe functions.
StringCchPrintf(msgBuf,
BUF_SIZE,
TEXT(
"Parameters = %d, %d\n"),
pData->nVal1,
pData->nVal2);
StringCchLength(msgBuf, BUF_SIZE, &cchStringSize);
WriteConsole(hStdout, msgBuf, cchStringSize, &dwChars,
NULL);

return 0;

}

技術分享

Win API:之GetCurrentThread、GetCurrentThreadId、GetCurrentProcess、GetCurrentProcessId