确定进程是否从快捷方式开始

时间:2016-07-15 04:26:49

标签: c winapi

是否可以确定是否使用快捷方式启动了另一个进程/窗口?目的是然后读取获取启动设置的快捷方式:启动文件夹,以管理员身份运行等。也许有办法找出程序的催化剂/调用者(用户/应用程序w管理员权限/快捷方式) ?

我知道使用Windows驱动程序工具包determine it。虽然在其他方面发展起来相当棘手。

1 个答案:

答案 0 :(得分:7)

  

是否可以确定是否使用快捷方式启动了另一个进程/窗口?

是的,但不容易。

正如an answera similar question中所述,进程可以通过调用GetStartupInfo()并检查STARTF_TITLEISLINKNAME标志来查明自身是否由快捷方式启动。这在MSDN上记录:

GetStartupInfo function

  

检索创建调用进程时指定的STARTUPINFO结构的内容。

STARTUPINFO structure

  

dwFlags中
  在进程创建窗口时确定是否使用某些STARTUPINFO成员的位域。该成员可以是以下一个或多个值。

     

...
  STARTF_TITLEISLINKNAME
  0x00000800
   lpTitle成员包含用户为启动此过程而调用的快捷方式文件(.lnk)的路径。当调用指向已启动应用程序的.lnk文件时,通常由shell设置。大多数应用程序不需要设置此值。

获得.lnk文件的路径后,您可以根据需要使用IShellLink界面对其进行解析(有关详细信息,请参阅Shell Links)。

现在,即便如此,你不能直接检索另一个进程的STARTUPINFO结构。但是,您可以通过将代码注入目标进程(使用CreateRemoteThread()SetWindowsHookEx())来检索间接,然后让代码调用GetStartupInfo()并进行通信使用您选择的IPC mechanismWM_COPYDATA,命名管道,邮件槽,套接字,COM,RPC等)将所需信息返回到您的流程。

或者,有一种非官方的方式(受操作系统版本限制)可以获得许多相同的STARTUPINFO字段值,包括.lnk文件名,而无需将任何代码注入目标进程。使用NtQueryInformationProcess()获取指向目标进程的PEB 1 结构的指针,该结构具有ProcessParameters字段,该字段是指向RTL_USER_PROCESS_PARAMETERS <的指针sup> 1 结构,其中包含WindowTitle字段(包含来自STARTUPINFO的值的其他字段)。您可以使用OpenProcess()获取HANDLE目标流程(您可以使用GetWindowThreadProcessId()获取HWND的流程ID),然后使用ReadProcessMemory()根据需要阅读PEBRTL_USER_PROCESS_PARAMETERS结构的内容。

1 :MSDN未记录PEBRTL_USER_PROCESS_PARAMETERS结构的大部分内容,但记录在http://undocumented.ntinternals.net上{{3} }和here)。