首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 如何通过进程PID获得父进程PID?? [已结贴,结贴人:fmaliang]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-30 22:17:08 楼主
    如题,这个功能为什么没有一个api可以实现???
    不能用进程快照,因为涉及到隐藏进程!
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-30 22:19:541楼 得分:0
    http://data.csai.cn/View_6154.html
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-30 22:20:532楼 得分:20
    NTDLL.DLL中有一个函数叫NtQueryInformationProcess,用它可以将指定类型的进程信息拷贝到某个缓冲。其原型如下:
    NTSYSAPI
    NTSTATUS
    NTAPI
    NtQueryInformationProcess (
    IN HANDLE ProcessHandle, // 进程句柄
    IN PROCESSINFOCLASS InformationClass, // 信息类型
    OUT PVOID ProcessInformation, // 缓冲指针
    IN ULONG ProcessInformationLength, // 以字节为单位的缓冲大小
    OUT PULONG ReturnLength OPTIONAL // 写入缓冲的字节数
    );
    第一个参数是希望操作的进程句柄,这个句柄必须以PROCESS_QUERY_INFORMATION模式存取。为了取得一个句柄,我们必须用OpenProcess函数:
    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,dwProcessID);
    第二个参数是请求信息的类型,这个参数可以有许多个值,本文例子中将用ProcessBasicInformation (值为0)。
    因此,如果第二个参数是ProcessBasicInformation的话,则第三个参数必须为一个指针指向结构PROCESS_BASIC_INFORMATION:
    typedef struct
    {
    DWORD ExitStatus; // 接收进程终止状态
    DWORD PebBaseAddress; // 接收进程环境块地址
    DWORD AffinityMask; // 接收进程关联掩码
    DWORD BasePriority; // 接收进程的优先级类
    ULONG UniqueProcessId; // 接收进程ID
    ULONG InheritedFromUniqueProcessId; //接收父进程ID
    } PROCESS_BASIC_INFORMATION;


    这个结构的最后一个参数是InheritedFromUniqueProcessId,它就是我们所要的东西。


    DWORD dwParentPID;
    LONG status;
    PROCESS_BASIC_INFORMATION pbi;


    status = NtQueryInformationProcess( hProcess,
    ProcessBasicInformation,
    (PVOID)&pbi,
    sizeof(PROCESS_BASIC_INFORMATION),
    NULL );


    if (!status)
    dwParentPID = pbi.InheritedFromUniqueProcessId;


    这个改成VB的不难吧?
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-04-30 23:15:363楼 得分:0
    调试的时候出现“用户定义类型未定义”是怎么回事:
    Private Declare Function NtQueryInformationProcess Lib "NTDLL.DLL" (ByVal ProcessHandle As Long, ByVal ProcessInformationClass As PROCESSINFOCLASS, ByVal ProcessInformation As Long, ByVal ProcessInformationLength As Long, ByRef ReturnLength As Long) As Long
    ' 第一个参数是希望操作的进程句柄,这个句柄必须以PROCESS_QUERY_INFORMATION模式存取。为了取得一个句柄,我们必须用OpenProcess函数:
    'HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,dwProcessID);
    '第二个参数是请求信息的类型,这个参数可以有许多个值,本文例子中将用ProcessBasicInformation (值为0)。
    '因此,如果第二个参数是ProcessBasicInformation的话,则第三个参数必须为一个指针指向结构
    Private Type PROCESS_BASIC_INFORMATION
            ExitStatus  As Long    'NTSTATUS 接收进程终止状态
            PebBaseAddress  As Long    'PPEB 接收进程环境块地址
            AffinityMask  As Long    'ULONG_PTR 接收进程关联掩码
            BasePriority  As Long    'KPRIORITY 接收进程的优先级类
            UniqueProcessId  As Long    'ULONG_PTR 接收进程ID
            InheritedFromUniqueProcessId  As Long    'ULONG_PTR 接收父进程ID
    End Type
    'Private Const PROCESS_QUERY_INFORMATION      As Long = (&H400)

    'Dim objBasic    As PROCESS_BASIC_INFORMATION
    'ProcessBasicInformation  =  0
    'ntStatus  =  NtQueryInformationProcess(hProcessHandle,  ProcessBasicInformation,  VarPtr(objBasic),  Len(objBasic),  0)
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    世纪乐知(北京)网络技术有限公司 版权所有 京 ICP 证 020026 号
    Copyright © 2000-2007, CSDN.NET, All Rights Reserved