2009-10-03 24 views

Trả lời

6

Có một vài lựa chọn:

+1

trong trường hợp điều tra, có cách nào để xác định chuỗi nào được liệt kê tương ứng với một HANDLE mà bạn có không? – bdonlan

+0

Bạn vượt qua quá trình xử lý hiện tại của bạn để CreateToolhelp32Snapshot với cờ TH32CS_SNAPMODULE. Điều này sẽ chỉ liệt kê các luồng trong tiến trình của bạn. –

+1

Nhưng nó sẽ không cho phép bạn biết sự khác biệt giữa các chủ đề _within_ module của bạn, phải không? – bdonlan

3

Nếu bạn bằng cách nào đó có thể làm cho chuỗi đang được đề cập, hãy gọi GetCurrentThreadId và lưu trữ ở đâu đó, bạn có thể đọc kết quả.

+0

Điều này làm việc tốt nhất cho tôi, chỉ cần gọi đó là tạo và lưu trữ bằng threadhandle! cảm ơn –

3

Nếu chuỗi đang đề cập vào trạng thái chờ cảnh báo thường xuyên, bạn có thể gửi APC bằng QueueUserAPC; trình xử lý APC sau đó có thể gọi GetCurrentThreadId và truyền đạt kết quả cho người gọi bằng bất kỳ phương thức nào bạn thích.

Bạn cũng có thể thực hiện việc này với các chức năng NT không có giấy tờ. Sử dụng NtQueryInformationThread() trên lớp ThreadBasicInformation sẽ cung cấp cho bạn ID chủ đề trong số returned structure. Một ví dụ có thể được tìm thấy trong wine source. Tuy nhiên, tôi không chắc chắn các phiên bản của cửa sổ này có sẵn - hãy ghi nhớ các chức năng không có giấy tờ này có thể thay đổi bất cứ lúc nào, vì vậy tốt nhất là kiểm tra chúng trên các phiên bản cũ hơn của cửa sổ mà bạn quan tâm và chỉ cần sử dụng GetThreadId() nơi có sẵn.

Lưu ý rằng các hàm không có giấy tờ này chỉ có thể được truy cập bằng LoadLibrary() và GetProcAddress() trên NTDLL; họ không có thư viện nhập khẩu. According to MSDN, khai báo cho các cấu trúc dữ liệu có thể được tìm thấy trong Winternl.h, nhưng nếu không, chỉ cần xác định chúng mình dựa trên các liên kết ntinternals ở trên.

+0

Bất kỳ ai quan tâm đến đây là cách người ta có thể gọi 'NtQueryInformationThread': http://www.snip2code.com/Snippet/85443/GetProcessIdOfThread()-on-Windows-XP – c00000fd

Các vấn đề liên quan