В общем такие дела, необходимо определить, что кто-то открыл мой процесс. Могу ли я получить список всех хендлов в системе при помощи NtQuerySystemInformation с классом SystemHandleInformation, а затем отсеивая все хендлы являющиеся по типу хендлами "процесса" и получать для этих хендлов соответствующий им PID, если этот PID соответствует моему, значит меня кто-то открыл ? Или это так не работает ? Я пока что не разобрался где именно искать тип хендла, но по названию поля в структуре SYSTEM_HANDLE_TABLE_ENTRY_INFO это выглядит как ObjectTypeNumber, если рассуждаю неверно пните в нужную сторону
Ты можешь получить имя типа хэндла и на основе этого искать хэндлы процессов. Чтобы получить PID процесса, на который указывает хэндл, скопируй хэндл к себе через DuplicateHandle и получи PID через GetProcessId(hDuplicatedHandle). Пример определения имени типа хэндла: Код (C++): extern "C" NTSYSCALLAPI NTSTATUS NtQueryObject( IN OPTIONAL HANDLE Handle, IN OBJECT_INFORMATION_CLASS ObjectInformationClass, OUT OPTIONAL PVOID ObjectInformation, IN ULONG ObjectInformationLength, OUT OPTIONAL PULONG ReturnLength ); std::wstring getTypeName(const HANDLE handle) { std::vector<unsigned char> buf(64); ULONG returnedLength = 0; const NTSTATUS status = NtQueryObject(handle, OBJECT_INFORMATION_CLASS::ObjectTypeInformation, &buf[0], static_cast<ULONG>(buf.size()), &returnedLength); if (!NT_SUCCESS(status)) { if (status != STATUS_INFO_LENGTH_MISMATCH) { return {}; } buf.resize(returnedLength); const NTSTATUS retryStatus = NtQueryObject(handle, OBJECT_INFORMATION_CLASS::ObjectTypeInformation, &buf[0], static_cast<ULONG>(buf.size()), &returnedLength); if (!NT_SUCCESS(retryStatus)) { return {}; } } const auto* const info = reinterpret_cast<const PUBLIC_OBJECT_TYPE_INFORMATION*>(buf.data()); std::wstring name(info->TypeName.Buffer, info->TypeName.Length / sizeof(wchar_t)); if (name.back() == L'\0') { name.pop_back(); } return name; } int main() { HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessId()); const auto typeName = getTypeName(hProcess); // typeName == L"Process" } Как найдёшь хэндл с именем типа L"Process" - посмотри, какой у него индекс типа - такой же индекс будет у всех хэндлов этого типа (чтобы не дёргать на каждый хэндл NtQueryObject).