【问题标题】:How does GetStdHandle() knows what my process is?GetStdHandle() 如何知道我的流程是什么?
【发布时间】:2015-02-17 09:34:08
【问题描述】:

当我调用GetStdHandle()(或对我的进程执行某些操作的其他函数)时,例如:

HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);

GetStdHandle()会返回我进程的STDOUT句柄,但是这个函数怎么知道我的进程是什么,我的意思是我没有给它进程id作为参数。

【问题讨论】:

  • 每个进程都有一个与之关联的PEB,基本上这个函数只是从PEB返回那个值。
  • STDIN句柄是调用进程的全局变量。该函数只是返回当前值。该值是在进程启动时建立的,除非您的代码调用SetStdHandle() 来覆盖它。
  • 因为操作系统知道它当前正在运行什么进程,它会happily give you a handle to it if you ask
  • @JoachimPileborg:您链接到的文档说:“返回值是当前进程的伪句柄。伪句柄是一个特殊的常量,目前(HANDLE)-1 ”。所以它实际上并没有向调用进程返回一个真正的句柄。只是一个虚假的值,它向较低级别的 API 发出信号,以便在需要时解析实际的进程句柄。

标签: c++ winapi


【解决方案1】:

好吧,让我们假设您需要传递进程 ID。你会怎么做呢?

DWORD my_id = GetCurrentProcessId();
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE, my_id);

显然,如果我们要多次调用它,我们可以通过将其放入辅助函数中来节省一些重复的工作:

HANDLE MyGetStdHandle(DWORD nStdHandle)
{
  DWORD my_id = GetCurrentProcessId();
  return GetStdHandle(STD_OUTPUT_HANDLE, my_id);
}

但见鬼,很多人会需要这个功能。或许我们应该把它放到一个库中……或者一个 API 中……事实上,让我们将它添加到 Windows API 中并调用它 GetStdHandle()。

他们做了什么。

(好吧,它实际上并不是这样工作的,但我认为它说明了这一点。Windows API 必须知道您从哪个进程调用它,否则它不会能够做任何事情。)

【讨论】:

  • 但是GetCurrentProcessId() 怎么知道我的流程是什么? (也许这个功能应该在我的问题中)。
  • 根据乔纳森的评论,实际实现可能使用了 PEB。但原则上不需要。 Windows 控制着 CPU;在当前时间片开始时,它决定让 CPU 运行您程序中的代码,并且它有该决定的记录(根据 Joachim 的评论)。
  • (作为比较,像 DOS 一样,当应用程序运行时操作系统控制 CPU,则更简单:是 只有一个标准输出句柄,因为一次只能运行一个应用程序。这也意味着没有进程 ID。)
猜你喜欢
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多