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