VC++ 获取指定进程ID的父进程ID。(Windows 32k平台)

源实现:

        // https://learn.microsoft.com/en-us/windows/win32/api/winternl/nf-winternl-ntqueryinformationprocess
        typedef struct KERNEL_PROCESS_BASIC_INFORMATION
        {
            NTSTATUS ExitStatus;
            PPEB PebBaseAddress;
            ULONG_PTR AffinityMask;
            KPRIORITY BasePriority;
            ULONG_PTR UniqueProcessId;
            ULONG_PTR InheritedFromUniqueProcessId;
        } KERNEL_PROCESS_BASIC_INFORMATION, * KERNEL_PPROCESS_BASIC_INFORMATION;

        int Win32Native::GetInheritedFromUniqueProcessId(int process_id) noexcept
        {
            typedef NTSTATUS(WINAPI* NtQueryInformationProcess_Proc)(HANDLE, UINT, PVOID, ULONG, PULONG);

            DWORD dwInheritedFromUniqueProcessId = 0;
            HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, process_id);
            if (NULL != hProcess)
            {
                KERNEL_PROCESS_BASIC_INFORMATION pbi;
                ZeroMemory(&pbi, sizeof(pbi));

                static NtQueryInformationProcess_Proc NtQueryInformationProcess = (NtQueryInformationProcess_Proc)GetProcAddress("ntdll.dll", "NtQueryInformationProcess");
                if (NULL != NtQueryInformationProcess)
                {
                    NTSTATUS status = NtQueryInformationProcess(hProcess, 0, &pbi, sizeof(pbi), NULL);
                    if (status == 0)
                    {
                        dwInheritedFromUniqueProcessId = (DWORD)pbi.InheritedFromUniqueProcessId;
                    }
                }

                CloseHandle(hProcess);
            }
            return dwInheritedFromUniqueProcessId;
        }
        void* Win32Native::GetProcAddress(const char* moduleName, const char* functionName) noexcept
        {
            if (NULL != moduleName && *moduleName == '\x0')
            {
                moduleName = NULL;
            }

            HMODULE hModule = GetModuleHandleA(moduleName);
            if (NULL == hModule)
            {
                hModule = LoadLibraryA(moduleName);
                if (NULL == hModule)
                {
                    return NULL;
                }
            }

            if (NULL == functionName || *functionName == '\x0')
            {
                return NULL;
            }

            return ::GetProcAddress(hModule, functionName);
        }

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值