Winapi PID创建时间
我正在寻找一种方法来确定PID创建/最近声明的时间。我可以通过Winapi PID创建时间,winapi,Winapi,我正在寻找一种方法来确定PID创建/最近声明的时间。我可以通过NtQuerySystemInformation获得它,但是仅仅为了获得PID声明的时间,它似乎很紧张。有没有什么快速的方法可以得到这些信息 我尝试了CreateToolhelp32Snapshot->Process32First,这种方法非常快,但它没有给我创建PID的时间 谢谢 这是我可以从NtQuerySystemInformation获得的信息。下面是这个结构,它给了我UniqueProcessId和CreateTime _
NtQuerySystemInformation
获得它,但是仅仅为了获得PID声明的时间,它似乎很紧张。有没有什么快速的方法可以得到这些信息
我尝试了CreateToolhelp32Snapshot
->Process32First
,这种方法非常快,但它没有给我创建PID的时间
谢谢
这是我可以从NtQuerySystemInformation获得的信息。下面是这个结构,它给了我UniqueProcessId
和CreateTime
_系统处理信息结构
ULONG NextEntryOffset
ULONG NumberOfThreads
LARGE_INTEGER WorkingSetPrivateSize
ULONG HardFaultCount
ULONG NumberOfThreadsHighWatermark
ULONGLONG CycleTime
LARGE_INTEGER CreateTime
LARGE_INTEGER UserTime
LARGE_INTEGER KernelTime
UNICODE_STRING ImageName
KPRIORITY BasePriority
HANDLE UniqueProcessId
HANDLE InheritedFromUniqueProcessId
ULONG HandleCount
ULONG SessionId
ULONG_PTR UniqueProcessKey
SIZE_T PeakVirtualSize
SIZE_T VirtualSize
ULONG PageFaultCount
SIZE_T PeakWorkingSetSize
SIZE_T WorkingSetSize
SIZE_T QuotaPeakPagedPoolUsage
SIZE_T QuotaPagedPoolUsage
SIZE_T QuotaPeakNonPagedPoolUsage
SIZE_T QuotaNonPagedPoolUsage
SIZE_T PagefileUsage
SIZE_T PeakPagefileUsage
SIZE_T PrivatePageCount
LARGE_INTEGER ReadOperationCount
LARGE_INTEGER WriteOperationCount
LARGE_INTEGER OtherOperationCount
LARGE_INTEGER ReadTransferCount
LARGE_INTEGER WriteTransferCount
LARGE_INTEGER OtherTransferCount
SYSTEM_THREAD_INFORMATION Threads [1]
给定一个进程ID,使用获取该进程的句柄
,然后使用查询其时间
BOOL GetProcessCreationTime(DWORD dwProcessId, LPFILETIME CreationTime)
{
BOOL bResult = FALSE;
HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION, FALSE, dwProcessId);
if (hProcess)
{
FILETIME Ignore;
bResult = GetProcessTimes(hProcess, CreationTime, &Ignore, &Ignore, &Ignore);
CloseHandle(hProcess);
}
return bResult;
}
请注意,这将只能在进程仍在运行时打开进程,或者在进程已终止但尚未完全关闭时打开进程
更新:如果要使用NtQuerySystemInformation()
而不是GetProcessTimes()
,它看起来更像这样:
BOOL GetProcessCreationTime(DWORD dwProcessId, LPFILETIME CreationTime)
{
typedef NTSTATUS (WINAPI *LPFN_NTQSI)(SYSTEM_INFORMATION_CLASS, PVOID, ULONG, PULONG);
static LPFN_NTQSI lpNtQuerySystemInformation = NULL;
if (!lpNtQuerySystemInformation)
{
lpNtQuerySystemInformation = (LPFN_NTQSI) GetProcAddress(GetModuleHandle(TEXT("ntdll.dll")), "NtQuerySystemInformation");
if (!lpNtQuerySystemInformation)
return FALSE;
}
_SYSTEM_PROCESS_INFORMATION *arr;
ULONG ulSize = 1024;
NTSTATUS status;
do
{
arr = (_SYSTEM_PROCESS_INFORMATION*) LocalAlloc(LMEM_FIXED, ulSize);
if (!arr)
return FALSE;
status = NtQuerySystemInformation(SystemProcessInformation, arr, ulSize, &ulSize);
if (NT_SUCCESS(status))
break;
LocalFree(arr);
if (status != STATUS_INFO_LENGTH_MISMATCH)
return FALSE;
ulSize *= 2;
}
while (true);
_SYSTEM_PROCESS_INFORMATION *process = arr;
do
{
if (GetProcessId(process->UniqueProcessId) == dwProcessId)
{
CreationTime->dwLowDateTime = process->CreateTime.LowPart;
CreationTime->dwHighDateTime = process->CreateTime.HighPart;
LocalFree(arr);
return TRUE;
}
if (process->NextEntryOffset == 0)
break;
process = (_SYSTEM_PROCESS_INFORMATION*) (((LPBYTE)process) + process->NextEntryOffset);
}
while (true);
LocalFree(arr);
return FALSE;
}
你有什么信息?GetProcessTimes()对你有用吗?谢谢@CodyGray我在帖子中添加了我得到的信息,我会立即搜索该函数。谢谢Remy,这是很多调用,我认为
NTQueryInformation
方法更有效不是吗?这是一个很好的答案,尽管我接受了。我知道了哪一个更有效,这有助于我做出选择。这仅仅是3个电话。使用NtQuerySystemInformation()
,您必须调用它一次以获取SYSTEM\u PROCESS\u INFORMATION
项数组的字节大小,然后您必须分配该数组并再次调用NtQuerySystemInformation()
,以填充该数组,然后必须在数组中循环查找目标进程ID,最后释放数组。这是更多的工作。更不用说,Nt…()
函数访问内部操作系统数据,这些数据可能会从一个操作系统版本更改为另一个操作系统版本。MSDN说:“NtQuerySystemInformation可能会在未来的Windows版本中被更改或不可用。”我在回答中添加了一个NtQuerySystemInformation()
示例,向您展示了它还有多少工作要做。非常感谢@Remy-哦,我忘了提到我需要所有当前的PID。我想使用CreateToolhelp32Snapshot
,因为它似乎比实时迭代要好,因为每次调用之间都有可能发生变化。我需要所有PID及其创建时间的完整列表,但我无法从快照中获取:(
BOOL GetProcessCreationTime(DWORD dwProcessId, LPFILETIME CreationTime)
{
typedef NTSTATUS (WINAPI *LPFN_NTQSI)(SYSTEM_INFORMATION_CLASS, PVOID, ULONG, PULONG);
static LPFN_NTQSI lpNtQuerySystemInformation = NULL;
if (!lpNtQuerySystemInformation)
{
lpNtQuerySystemInformation = (LPFN_NTQSI) GetProcAddress(GetModuleHandle(TEXT("ntdll.dll")), "NtQuerySystemInformation");
if (!lpNtQuerySystemInformation)
return FALSE;
}
_SYSTEM_PROCESS_INFORMATION *arr;
ULONG ulSize = 1024;
NTSTATUS status;
do
{
arr = (_SYSTEM_PROCESS_INFORMATION*) LocalAlloc(LMEM_FIXED, ulSize);
if (!arr)
return FALSE;
status = NtQuerySystemInformation(SystemProcessInformation, arr, ulSize, &ulSize);
if (NT_SUCCESS(status))
break;
LocalFree(arr);
if (status != STATUS_INFO_LENGTH_MISMATCH)
return FALSE;
ulSize *= 2;
}
while (true);
_SYSTEM_PROCESS_INFORMATION *process = arr;
do
{
if (GetProcessId(process->UniqueProcessId) == dwProcessId)
{
CreationTime->dwLowDateTime = process->CreateTime.LowPart;
CreationTime->dwHighDateTime = process->CreateTime.HighPart;
LocalFree(arr);
return TRUE;
}
if (process->NextEntryOffset == 0)
break;
process = (_SYSTEM_PROCESS_INFORMATION*) (((LPBYTE)process) + process->NextEntryOffset);
}
while (true);
LocalFree(arr);
return FALSE;
}