Вы должны использовать собственный API и GetProcAddress
, чтобы найти адрес NtQueryInformationProcess
.
typedef struct _PROCESS_BASIC_INFORMATION
{
NTSTATUS ExitStatus;
PPEB PebBaseAddress;
ULONG_PTR AffinityMask;
KPRIORITY BasePriority;
HANDLE UniqueProcessId;
HANDLE InheritedFromUniqueProcessId;
} PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION;
NTSYSCALLAPI
NTSTATUS
NTAPI
NtQueryInformationProcess(
__in HANDLE ProcessHandle,
__in PROCESS_INFORMATION_CLASS ProcessInformationClass,
__out_bcount(ProcessInformationLength) PVOID ProcessInformation,
__in ULONG ProcessInformationLength,
__out_opt PULONG ReturnLength
);
PROCESS_BASIC_INFORMATION basicInfo;
NtQueryInformationProcess(NtCurrentProcess(), ProcessBasicInformation, &basicInfo, sizeof(basicInfo), NULL);
// My parent PID (*) is in basicInfo.InheritedFromUniqueProcessId
Чтобы получить PID дедушки, откройте родительский процесс с помощью родительского PID и вызовите NtQueryInformationProcess
снова на родительском процессе.
Примечание * - Строго говоря, родительский процесс (процесс, который создал дочерний процесс) фактически не записывается.InheritedFromUniqueProcessId
просто дает вам процесс, от которого унаследованы атрибуты.Но это очень редкая проблема.
В качестве альтернативы, если вам не нравится собственный API, используйте CreateToolhelp32Snapshot с TH32CS_SNAPPROCESS
, который дает необходимую информацию, за исключениемпридется искать по списку.