【问题标题】:SAFELY get path to running executable in windows API安全地获取在 Windows API 中运行可执行文件的路径
【发布时间】:2011-01-30 06:34:33
【问题描述】:

嘿, 我正在尝试获取与我的 exe 文件位于同一文件夹中的 dll 的路径。要走的路似乎是使用QueryFullProcessImageName()GetModuleFileName() 之一来获取运行可执行文件的路径,然后使用字符串操作使其成为所需库的路径。

不幸的是,这两个函数都没有提供提前找出所需大小缓冲区的方法。我已经尝试为 nSize 参数传入零,但这并没有达到预期的效果。

这样做的最佳实践方式是什么?

【问题讨论】:

  • 我确实看到了,但我愿意使用 GetModuleFileName 以外的 API(也尝试过 QueryFullProcessNameGetProcessImageFileName
  • 所有这些 API(除了获取模块文件名)最终都涉及调用 NtQueryInformationProcess 甚至 NtQuerySystemInformation (SystemProcessIdInformation)。如果 Win32 API 不够好,请直接调用 NtQueryInformationProcess。不过,内核到用户的 API 不会为您分配缓冲区。

标签: c++ windows


【解决方案1】:

在实践中,您可以使用 Windows API MAX_PATH 作为缓冲区大小,可能会添加 1 以提高安全性。

理论上Windows 路径可以大得多。我记得MAX_PATH 大约是 270 左右,而在 NTFS 文件系统中,路径最多(大约)32767 个字符。但是,对于这么大的大小,它必须作为 Unicode 处理,而且重要的是,Windows Explorer 不支持这么大的路径,因此在实践中这不是问题。

再次在实践中,如果您遇到如此大的路径,显然无法删除,那么您可以使用 Unicode 命名(有一个特殊前缀可用于长路径)和/或等效的短名称(DOS 8.3 名称),和/或定义逻辑驱动器以缩短路径,以便可以删除目录/文件。

干杯,

【讨论】:

  • 如果 Windows 资源管理器不支持更长的路径,我想我的可执行文件在超过 270 个字符的地方结束的可能性有点低,然后大声笑。谢谢
  • MAX_PATH 定义为 260 个字符。没有理由添加 1。在此处阅读更多信息:msdn.microsoft.com/en-us/library/aa365247.aspx
  • 对此我要小心一点——我遇到过并使用过长于 MAX_PATH 的路径。它经常出现,以至于我已经编写了完整的备份/恢复/删除/等。对于具有较长路径的目录结构而言。
【解决方案2】:

GetModuleFilename 返回复制到缓冲区的字符数。如果它小于缓冲区的大小,那就没问题了。如果它等于缓冲区的大小,请分配一个更大的缓冲区,然后重试。

【讨论】:

  • 但是考虑到 API 本身必须知道路径有多长,不断循环和调用它直到找到正确的长度似乎非常浪费......如果可能的话,我希望有更好的方法
  • @KJ Tsanaktsidis:只需使用MAX_PATH。但是,如果您希望能够支持任意大的路径(很傻,因为 Windows 资源管理器不支持它们),那么对于 Jerry 的“更大的缓冲区”,将先前的缓冲区大小增加一些因素,例如加倍。
  • 这也检查事后内存覆盖。如果缓冲区太小,此时内存已经被覆盖。这绝对不安全
  • @Ra,m Zarazua:不,它没有。您将最大大小传递给 GetModuleFilename,因此它不会超出缓冲区。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-22
  • 1970-01-01
相关资源
最近更新 更多