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