是否可以确定是否使用快捷方式启动了另一个进程/窗口?目的是读取该快捷方式以获取启动设置:启动文件夹、以管理员身份运行等。也许有一种方法可以找出程序的催化剂/调用者(具有管理员权限/快捷方式的用户/应用程序) ?
我知道使用 Windows 驱动程序工具包来确定它。尽管这在其他方面的开发相当棘手。
是否可以确定是否使用快捷方式启动了另一个进程/窗口?
是的,但并不容易。
如类似问题的回答中所述,进程可以通过调用 GetStartupInfo()
并检查
STARTF_TITLEISLINKNAME
标志来查明自身是否是通过快捷方式启动的。 MSDN 上有记录:
检索创建调用进程时指定的
STARTUPINFO
结构的内容。
dwFlags一旦获得一个位字段,用于确定进程创建窗口时是否使用某些
STARTUPINFO
成员。该成员可以是以下一个或多个值。...STARTF_TITLEISLINKNAME
0x00000800
lpTitle 成员包含用户调用以启动此进程的快捷方式文件 (.lnk) 的路径。这通常由 shell 在调用指向已启动应用程序的.lnk
文件时设置。大多数应用程序不需要设置此值。
.lnk
文件的路径,您就可以根据需要使用
IShellLink
接口解析它(有关更多详细信息,请参阅 Shell Links)。
现在,话虽如此,您无法直接检索STARTUPINFO
另一个进程的结构。 但是,您可以间接检索它。 一种方法是将代码注入目标进程(使用
或
SetWindowsHookEx()
),然后让该代码调用
GetStartupInfo()
并使用 IPC 机制将所需信息传回您的进程您选择的(
WM_COPYDATA
、命名管道、邮槽、套接字、COM、RPC 等)。或者,有一种非官方的方法(取决于操作系统版本)可以获取许多相同的 STARTUPINFO
字段值,包括
.lnk
文件名,而无需向目标进程注入任何代码。 使用 NtQueryInformationProcess()
获取指向目标进程的
PEB
1 结构的指针,该结构有一个 ProcessParameters
字段,该字段是指向 RTL_USER_PROCESS_PARAMETERS
1 结构的指针,该结构有一个WindowTitle
字段(包含来自 STARTUPINFO
的值的其他字段)。 您可以使用 OpenProcess()
获取目标进程的
HANDLE
(您可以使用 HWND
获取 GetWindowThreadProcessId()
的进程 ID),然后使用
ReadProcessMemory()
读取内容根据需要使用
PEB
和 RTL_USER_PROCESS_PARAMETERS
结构。1:PEB
和
RTL_USER_PROCESS_PARAMETERS
结构的大部分内容没有被MSDN记录,但在http://undocumented.ntinternals.net(here和here)上有记录。