Winapi PID创建时间

Winapi PID创建时间,winapi,Winapi,我正在寻找一种方法来确定PID创建/最近声明的时间。我可以通过NtQuerySystemInformation获得它,但是仅仅为了获得PID声明的时间,它似乎很紧张。有没有什么快速的方法可以得到这些信息 我尝试了CreateToolhelp32Snapshot->Process32First,这种方法非常快,但它没有给我创建PID的时间 谢谢 这是我可以从NtQuerySystemInformation获得的信息。下面是这个结构,它给了我UniqueProcessId和CreateTime _

我正在寻找一种方法来确定PID创建/最近声明的时间。我可以通过
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;
}