一、NTCreateThreadEx函數的介紹
NTCreateThreadEx是一種Windows系統的API函數,它用於創建一個新的線程或者一個新的用戶模式和內核模式線程(2個線程對象)。NTCreateThreadEx函數比標準的CreateThread函數更加靈活,可以支持更多的線程創建選項。NTCreateThreadEx允許每一個線程對象綁定一個特定的安全描述符,並且可以在創建的時候指定線程的執行優先順序等等。
下面是 NTCreateThreadEx 函數的代碼示例:
NTSTATUS NTAPI NTCreateThreadEx(
PHANDLE hThread,
ACCESS_MASK DesiredAccess,
PVOID ObjectAttributes,
HANDLE ProcessHandle,
PVOID lpStartAddress,
PVOID lpParameter,
BOOL CreateSuspended,
ULONG StackZeroBits,
ULONG SizeOfStackCommit,
ULONG SizeOfStackReserve,
PVOID lpBytesBuffer);
二、NTCreateThreadEx API函數的使用方法
使用NTCreateThreadEx函數創建線程對象的步驟如下:
1. 準備好一個有效的線程句柄 hThread。
2. 設置進程句柄 ProcessHandle,以便創建的線程能夠訪問其地址空間。
3. 設置執行線程代碼的訪問許可權(DesiredAccess),該訪問許可權應該是THREAD_ALL_ACCESS,它會給新創建的線程賦予所有可能的許可權。
4. 設置線程對象的允許的最大堆棧大小。在堆棧大小到達此大小之前,操作系統不會分配實際堆棧空間。
5. 設定其它線程對象此時內存所需屬性,並傳遞給函數,比如線程的安全屬性等等。
6. 通過調用 NTCreateThreadEx 函數創建新線程。
7. 判斷線程是否成功創建並使用返回代碼(NTSTATUS)來表示成功或失敗。
下面是一個簡單的NTCreateThreadEx函數調用的代碼示例:
HANDLE hThread = NULL;
NTSTATUS status = NTCreateThreadEx(&hThread,
THREAD_ALL_ACCESS,
NULL,
GetCurrentProcess(),
MyThreadProc,
NULL,
FALSE,
0,
0,
0,
NULL);
三、NTCreateThreadEx API函數的優點
NTCreateThreadEx 函數相比於 CreateThread 函數有以下幾個優點:
1. 更加靈活:NTCreateThreadEx 允許創建者自由地指定線程的執行優先順序、線程堆棧大小和安全描述符等參數,而 CreateThread 函數只能使用默認值。
2. 支持用戶模式和內核模式線程:NTCreateThreadEx 可以同時創建一個用戶模式和一個內核模式的線程對象,而 CreateThread 函數僅能創建用戶模式線程對象。
3. 更加高效:NTCreateThreadEx 函數創建的線程對象不需要遵循 Win32 API 規範,減少了函數的調用過程,從而提高了線程創建的效率。
四、NTCreateThreadEx API函數的注意事項
以下是使用 NTCreateThreadEx 函數時需要注意的幾點:
1. 當您使用此函數時,您需要確保您知道您正在進行的操作和您必須謹慎使用該函數。
2. 多次調用該函數時,您需要使用 銷毀句柄 函數來關閉已創建的線程對象。
3. 這個函數對管理員和調試角色開放,如果您不在這兩個角色之一,請不要嘗試使用這個函數。
下面是一個基於NTCreateThreadEx函數的簡單線程演示示例:
#include <windows.h>
#include <winternl.h>
int main() {
HANDLE threads[10];
for (int i = 0; i < 10; ++i) {
DWORD tid;
ULONG size_of_stack = 0xc8000;
void* stack_commit = VirtualAlloc(NULL, size_of_stack, MEM_COMMIT, PAGE_READWRITE);
NTSTATUS res = STATUS_SUCCESS;
OBJECT_ATTRIBUTES obj_attr;
InitializeObjectAttributes(&obj_attr, NULL, 0, NULL, NULL);
CLIENT_ID cid;
cid.UniqueProcess = NULL;
cid.UniqueThread = NULL;
res = NTCreateThreadEx(&threads[i], (THREAD_ALL_ACCESS | THREAD_SET_INFORMATION | THREAD_GET_CONTEXT | THREAD_SUSPEND_RESUME), &obj_attr, GetCurrentProcess(), (LPTHREAD_START_ROUTINE)TestEntry, NULL, FALSE, 0, size_of_stack, size_of_stack, stack_commit, &cid);
}
}
原創文章,作者:APQC,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/146901.html
微信掃一掃
支付寶掃一掃