admin 发表于 2024-2-21 11:53:47

windows驱动内核通过PID获取进程路径 GetDosPathByProcessId





NTSTATUS GetDosPathByProcessId(ULONG pid, OUT PVOID pBuffer)
{
    /*
    1.根据PID获取进程句柄
    2.使用ZwQueryInformationProcess 传入HANDLE 使用27号功能获取路径
    */
    HANDLE hProcess = 0;
    CLIENT_ID cid;
    OBJECT_ATTRIBUTES obj;
    NTSTATUS ntStatus;
    ULONG RetLength = 0;
   
    UNICODE_STRING uRetStrNtPath;

    if (ZwQueryInformationProcess == NULL)
      return STATUS_UNSUCCESSFUL;

    cid.UniqueProcess =(HANDLE)pid;
    cid.UniqueThread = 0;
    InitializeObjectAttributes(&obj, 0, OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE, 0, 0);
    ntStatus = ZwOpenProcess(&hProcess, PROCESS_ALL_ACCESS, &obj, &cid);
    if (!NT_SUCCESS(ntStatus))
      return STATUS_UNSUCCESSFUL;
    //使用27 号功能遍历
   
    ntStatus = ZwQueryInformationProcess(hProcess, ProcessImageFileName, NULL, 0, &RetLength);
    if (STATUS_INFO_LENGTH_MISMATCH != ntStatus)
      return STATUS_UNSUCCESSFUL;

    //申请内存继续获取.
    pBuffer = ExAllocatePoolWithTag(PagedPool, RetLength, 'niBI');
    if (NULL == pBuffer)
      return STATUS_UNSUCCESSFUL;
    //重新调用获取.
   
    ntStatus = ZwQueryInformationProcess(hProcess, ProcessImageFileName, pBuffer, RetLength, &RetLength);
    if (!NT_SUCCESS(ntStatus))
      return STATUS_UNSUCCESSFUL;
    //此时Puffer就已经是我们的路径了    进行该有的操作即可.
    return STATUS_SUCCESS;
}



页: [1]
查看完整版本: windows驱动内核通过PID获取进程路径 GetDosPathByProcessId