| 42 | |
| 43 | _IRQL_requires_max_(PASSIVE_LEVEL) |
| 44 | NTSTATUS OpenThread(HANDLE ThreadId, OUT PHANDLE hThread, ACCESS_MASK AccessMask, ULONG Attributes) |
| 45 | { |
| 46 | CLIENT_ID ClientId; |
| 47 | ClientId.UniqueProcess = 0; |
| 48 | ClientId.UniqueThread = ThreadId; |
| 49 | |
| 50 | OBJECT_ATTRIBUTES ObjectAttributes; |
| 51 | InitializeObjectAttributes(&ObjectAttributes, NULL, Attributes, NULL, NULL); |
| 52 | |
| 53 | using _ZwOpenThread = NTSTATUS(NTAPI*)(OUT PHANDLE hThread, IN ACCESS_MASK AccessMask, IN POBJECT_ATTRIBUTES ObjectAttributes, IN PCLIENT_ID ClientId); |
| 54 | |
| 55 | auto ZwOpenThread = static_cast<_ZwOpenThread>(Importer::GetKernelProcAddress(L"ZwOpenThread")); |
| 56 | if (!ZwOpenThread) |
| 57 | return STATUS_NOT_IMPLEMENTED; |
| 58 | |
| 59 | return ZwOpenThread(hThread, AccessMask, &ObjectAttributes, &ClientId); |
| 60 | } |
| 61 | |
| 62 | _IRQL_requires_max_(PASSIVE_LEVEL) |
| 63 | NTSTATUS OpenThreadByPointer(PETHREAD Thread, OUT PHANDLE hThread, ACCESS_MASK AccessMask, ULONG Attributes, KPROCESSOR_MODE ProcessorMode) |
no test coverage detected