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