通过进程句柄(hProcess)获得PID
作者:admin 日期:2011-06-18
在CSDN的 这个帖子 见到了这个需求.
知道一个进程句柄,比如OpenProcess打开的句柄,想要得到这个进程的PID,可以使用一个XP SP1新增的API:
输入hProcess,返回PID.
注意这个函数只能在XP SP1及以上系统中才可以使用.
要增加通用性,可以使用NTDLL导出的NtQueryInformationProcess函数来完成:
使用示例:
知道一个进程句柄,比如OpenProcess打开的句柄,想要得到这个进程的PID,可以使用一个XP SP1新增的API:
复制内容到剪贴板
程序代码

Private Declare Function GetProcessId Lib "kernel32" (ByVal hProcess As Long) As Long
输入hProcess,返回PID.
注意这个函数只能在XP SP1及以上系统中才可以使用.
要增加通用性,可以使用NTDLL导出的NtQueryInformationProcess函数来完成:
复制内容到剪贴板
程序代码

'结构,常量及API声明
Private Const STATUS_SUCCESS As Long = &H0&
Private Type PROCESS_BASIC_INFORMATION
ExitStatus As Long
PebBaseAddress As Long
AffinityMask As Long
BasePriority As Long
UniqueProcessId As Long
InheritedFromUniqueProcessId As Long
End Type
Private Declare Function NtQueryInformationProcess Lib "ntdll" ( _
ByVal ProcessHandle As Long, _
ByVal ProcessInformationClass As Long, _
ByRef ProcessInformation As Any, _
ByVal lProcessInformationLength As Long, _
ByRef lReturnLength As Long) As Long
Private Const STATUS_SUCCESS As Long = &H0&
Private Type PROCESS_BASIC_INFORMATION
ExitStatus As Long
PebBaseAddress As Long
AffinityMask As Long
BasePriority As Long
UniqueProcessId As Long
InheritedFromUniqueProcessId As Long
End Type
Private Declare Function NtQueryInformationProcess Lib "ntdll" ( _
ByVal ProcessHandle As Long, _
ByVal ProcessInformationClass As Long, _
ByRef ProcessInformation As Any, _
ByVal lProcessInformationLength As Long, _
ByRef lReturnLength As Long) As Long
使用示例:
复制内容到剪贴板
程序代码

Dim PBI As PROCESS_BASIC_INFORMATION
If STATUS_SUCCESS = NtQueryInformationProcess(hProcess, 0, PBI, Len(PBI), ByVal 0) Then
MsgBox PBI.UniqueProcessId 'UniqueProcessId就是PID
End If
If STATUS_SUCCESS = NtQueryInformationProcess(hProcess, 0, PBI, Len(PBI), ByVal 0) Then
MsgBox PBI.UniqueProcessId 'UniqueProcessId就是PID
End If
评论: 0 | 引用: 0 | 查看次数: 576