Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

478 lines
17 KiB

  1. // *********************************************************************************
  2. //
  3. // Copyright (c) Microsoft Corporation
  4. //
  5. // Module Name:
  6. //
  7. // TaskKill.h
  8. //
  9. // Abstract:
  10. //
  11. // macros and function prototypes of TaskKill.cpp
  12. //
  13. // Author:
  14. //
  15. // Sunil G.V.N. Murali ([email protected]) 26-Nov-2000
  16. //
  17. // Revision History:
  18. //
  19. // Sunil G.V.N. Murali ([email protected]) 26-Nov-2000 : Created It.
  20. //
  21. // *********************************************************************************
  22. #ifndef _TASKKILL_H
  23. #define _TASKKILL_H
  24. // resource header file
  25. #include "resource.h"
  26. //
  27. // NOTE: THIS MODULE WILL WRITTEN IN SUCH A FASHION THAT IT WORKS ONLY
  28. // IN UNICODE BUILD COMPILATION
  29. //
  30. #ifndef UNICODE
  31. #error Must compile only in unicode build environment
  32. #endif
  33. //
  34. // general purpose macros
  35. //
  36. #define DISPLAY_GET_REASON() ShowMessageEx( stderr, 2, FALSE, L"%1 %2", \
  37. TAG_ERROR, GetReason() )
  38. #define EXIT_PROCESS( exitcode ) \
  39. ReleaseGlobals(); \
  40. return (exitcode); \
  41. 1
  42. #define RELEASE_MEMORY_EX( block ) \
  43. if ( (block) != NULL ) \
  44. { \
  45. FreeMemory( ( LPVOID * ) &( block )); \
  46. } \
  47. 1
  48. #define DESTROY_ARRAY( array ) \
  49. if ( (array) != NULL ) \
  50. { \
  51. DestroyDynamicArray( &(array) ); \
  52. (array) = NULL; \
  53. } \
  54. 1
  55. //
  56. // winstation related structures ( extract from winsta.h - internal file )
  57. //
  58. //
  59. // structures
  60. typedef struct _CITRIX_PROCESS_INFORMATION {
  61. ULONG MagicNumber;
  62. ULONG LogonId;
  63. PVOID ProcessSid;
  64. ULONG Pad;
  65. } CITRIX_PROCESS_INFORMATION, * PCITRIX_PROCESS_INFORMATION;
  66. // ...
  67. typedef struct _TS_UNICODE_STRING {
  68. USHORT Length;
  69. USHORT MaximumLength;
  70. PWSTR Buffer;
  71. } TS_UNICODE_STRING;
  72. // CAUTION:
  73. // TS_SYSTEM_PROCESS_INFORMATION is duplicated from ntexapi.h, and slightly modified.
  74. // (not nice, but necessary because the Midl compiler doesn't like PVOID !)
  75. typedef struct _TS_SYSTEM_PROCESS_INFORMATION {
  76. ULONG NextEntryOffset;
  77. ULONG NumberOfThreads;
  78. LARGE_INTEGER SpareLi1;
  79. LARGE_INTEGER SpareLi2;
  80. LARGE_INTEGER SpareLi3;
  81. LARGE_INTEGER CreateTime;
  82. LARGE_INTEGER UserTime;
  83. LARGE_INTEGER KernelTime;
  84. TS_UNICODE_STRING ImageName;
  85. LONG BasePriority; // KPRIORITY in ntexapi.h
  86. DWORD UniqueProcessId; // HANDLE in ntexapi.h
  87. DWORD InheritedFromUniqueProcessId; // HANDLE in ntexapi.h
  88. ULONG HandleCount;
  89. ULONG SessionId;
  90. ULONG SpareUl3;
  91. SIZE_T PeakVirtualSize;
  92. SIZE_T VirtualSize;
  93. ULONG PageFaultCount;
  94. ULONG PeakWorkingSetSize;
  95. ULONG WorkingSetSize;
  96. SIZE_T QuotaPeakPagedPoolUsage;
  97. SIZE_T QuotaPagedPoolUsage;
  98. SIZE_T QuotaPeakNonPagedPoolUsage;
  99. SIZE_T QuotaNonPagedPoolUsage;
  100. SIZE_T PagefileUsage;
  101. SIZE_T PeakPagefileUsage;
  102. SIZE_T PrivatePageCount;
  103. } TS_SYSTEM_PROCESS_INFORMATION, *PTS_SYSTEM_PROCESS_INFORMATION;
  104. // ...
  105. typedef struct _TS_ALL_PROCESSES_INFO {
  106. PTS_SYSTEM_PROCESS_INFORMATION pspiProcessInfo;
  107. DWORD SizeOfSid;
  108. PBYTE pSid;
  109. } TS_ALL_PROCESSES_INFO, *PTS_ALL_PROCESSES_INFO;
  110. // defines
  111. #define SERVERNAME_CURRENT ((HANDLE)NULL)
  112. #define GAP_LEVEL_BASIC 0
  113. #define CITRIX_PROCESS_INFO_MAGIC 0x23495452
  114. #define WINSTA_DLLNAME L"Winsta.dll"
  115. #define FUNCNAME_WinStationFreeMemory "WinStationFreeMemory"
  116. #define FUNCNAME_WinStationCloseServer "WinStationCloseServer"
  117. #define FUNCNAME_WinStationOpenServerW "WinStationOpenServerW"
  118. #define FUNCNAME_WinStationEnumerateProcesses "WinStationEnumerateProcesses"
  119. #define FUNCNAME_WinStationFreeGAPMemory "WinStationFreeGAPMemory"
  120. #define FUNCNAME_WinStationGetAllProcesses "WinStationGetAllProcesses"
  121. #define SIZEOF_SYSTEM_THREAD_INFORMATION sizeof( struct SYSTEM_THREAD_INFORMATION )
  122. #define SIZEOF_SYSTEM_PROCESS_INFORMATION sizeof( struct SYSTEM_PROCESS_INFORMATION )
  123. //
  124. // function prototypes
  125. typedef BOOLEAN (WINAPI * FUNC_WinStationFreeMemory)( PVOID pBuffer );
  126. typedef BOOLEAN (WINAPI * FUNC_WinStationCloseServer)( HANDLE hServer );
  127. typedef HANDLE (WINAPI * FUNC_WinStationOpenServerW)( LPWSTR pwszServerName );
  128. typedef BOOLEAN (WINAPI * FUNC_WinStationEnumerateProcesses)( HANDLE hServer, PVOID *ppProcessBuffer );
  129. typedef BOOLEAN (WINAPI * FUNC_WinStationFreeGAPMemory)( ULONG Level,
  130. PVOID ProcessArray, ULONG ulCount );
  131. typedef BOOLEAN (WINAPI * FUNC_WinStationGetAllProcesses)( HANDLE hServer,
  132. ULONG Level, ULONG *pNumberOfProcesses,
  133. PVOID *ppProcessArray );
  134. //
  135. // constants / defines / enumerations
  136. //
  137. //
  138. // WMI related stuff
  139. // class name
  140. #define CLASS_PROCESS L"Win32_Process"
  141. // wmi query
  142. #define WMI_QUERY_TYPE L"WQL"
  143. #define WMI_SERVICE_QUERY L"SELECT Name FROM Win32_Service WHERE ProcessId = %d and State=\"Running\""
  144. #define WMI_MODULES_QUERY L"ASSOCIATORS OF {%s} WHERE ResultClass = CIM_DataFile"
  145. #define WMI_PROCESS_QUERY \
  146. L"SELECT " \
  147. L"__PATH, ProcessId, CSName, Caption, SessionId, ThreadCount, " \
  148. L"WorkingSetSize, KernelModeTime, UserModeTime, ParentProcessId " \
  149. L"FROM Win32_Process"
  150. // wmi query operators etc
  151. #define WMI_QUERY_FIRST_CLAUSE L"WHERE ("
  152. #define WMI_QUERY_SECOND_CLAUSE L"AND"
  153. // Win32_Process class properties
  154. #define WIN32_PROCESS_SYSPROPERTY_PATH L"__PATH"
  155. #define WIN32_PROCESS_PROPERTY_HANDLE L"Handle"
  156. #define WIN32_PROCESS_PROPERTY_COMPUTER L"CSName"
  157. #define WIN32_PROCESS_PROPERTY_IMAGENAME L"Caption"
  158. #define WIN32_PROCESS_PROPERTY_PROCESSID L"ProcessId"
  159. #define WIN32_PROCESS_PROPERTY_SESSION L"SessionId"
  160. #define WIN32_PROCESS_PROPERTY_THREADS L"ThreadCount"
  161. #define WIN32_PROCESS_PROPERTY_USERMODETIME L"UserModeTime"
  162. #define WIN32_PROCESS_PROPERTY_MEMUSAGE L"WorkingSetSize"
  163. #define WIN32_PROCESS_PROPERTY_KERNELMODETIME L"KernelModeTime"
  164. #define WIN32_PROCESS_PROPERTY_PARENTPROCESSID L"ParentProcessId"
  165. // Win32_Process class method(s)
  166. #define WIN32_PROCESS_METHOD_GETOWNER L"GetOwner"
  167. #define WIN32_PROCESS_METHOD_TERMINATE L"Terminate"
  168. // GetOwner method's return values
  169. #define GETOWNER_RETURNVALUE_USER L"User"
  170. #define GETOWNER_RETURNVALUE_DOMAIN L"Domain"
  171. // Terminate input values
  172. #define TERMINATE_INPARAM_REASON L"Reason"
  173. // function default return value
  174. #define WMI_RETURNVALUE L"ReturnValue"
  175. // Win32_Service related stuff
  176. #define WIN32_SERVICE_PROPERTY_NAME L"Name"
  177. // CIM_DataFile related stuff
  178. #define CIM_DATAFILE_PROPERTY_FILENAME L"FileName"
  179. #define CIM_DATAFILE_PROPERTY_EXTENSION L"Extension"
  180. //
  181. // other stuff
  182. #define VALUE_RUNNING GetResString( IDS_VALUE_RUNNING )
  183. #define VALUE_NOTRESPONDING GetResString( IDS_VALUE_NOTRESPONDING )
  184. #define VALUE_UNKNOWN GetResString( IDS_VALUE_UNKNOWN )
  185. #define PID_0_DOMAIN GetResString( IDS_PID_0_DOMAIN )
  186. #define PID_0_USERNAME GetResString( IDS_PID_0_USERNAME )
  187. // messages
  188. #define MSG_KILL_SUCCESS GetResString( IDS_MSG_KILL_SUCCESS )
  189. #define MSG_KILL_SUCCESS_QUEUED GetResString( IDS_MSG_KILL_SUCCESS_QUEUED )
  190. #define MSG_KILL_SUCCESS_EX GetResString( IDS_MSG_KILL_SUCCESS_EX )
  191. #define MSG_KILL_SUCCESS_QUEUED_EX GetResString( IDS_MSG_KILL_SUCCESS_QUEUED_EX )
  192. #define MSG_TREE_KILL_SUCCESS GetResString( IDS_MSG_TREE_KILL_SUCCESS )
  193. #define MSG_TREE_KILL_SUCCESS_QUEUED GetResString( IDS_MSG_TREE_KILL_SUCCESS_QUEUED )
  194. #define ERROR_TREE_KILL_FAILED GetResString( IDS_ERROR_TREE_KILL_FAILED )
  195. #define ERROR_TASK_HAS_CHILDS GetResString( IDS_ERROR_TASK_HAS_CHILDS )
  196. #define ERROR_KILL_FAILED GetResString( IDS_ERROR_KILL_FAILED )
  197. #define ERROR_KILL_FAILED_EX GetResString( IDS_ERROR_KILL_FAILED_EX )
  198. #define ERROR_PROCESS_NOTFOUND GetResString( IDS_ERROR_PROCESS_NOTFOUND )
  199. #define ERROR_NO_PROCESSES GetResString( IDS_ERROR_NO_PROCESSES )
  200. #define ERROR_UNABLE_TO_TERMINATE GetResString( IDS_ERROR_UNABLE_TO_TERMINATE )
  201. #define ERROR_CRITICAL_SYSTEM_PROCESS GetResString( IDS_ERROR_CRITICAL_SYSTEM_PROCESS )
  202. #define ERROR_CANNOT_KILL_SILENTLY GetResString( IDS_ERROR_CANNOT_KILL_SILENTLY )
  203. #define ERROR_CANNOT_KILL_ITSELF GetResString( IDS_ERROR_CANNOT_KILL_ITSELF )
  204. #define ERROR_COM_ERROR GetResString( IDS_ERROR_COM_ERROR )
  205. #define ERROR_USERNAME_BUT_NOMACHINE GetResString( IDS_ERROR_USERNAME_BUT_NOMACHINE )
  206. #define ERROR_PASSWORD_BUT_NOUSERNAME GetResString( IDS_ERROR_PASSWORD_BUT_NOUSERNAME )
  207. #define ERROR_USERNAME_EMPTY GetResString( IDS_ERROR_USERNAME_EMPTY )
  208. #define ERROR_SERVER_EMPTY GetResString( IDS_ERROR_SERVER_EMPTY )
  209. #define ERROR_WILDCARD_WITHOUT_FILTERS GetResString( IDS_ERROR_WILDCARD_WITHOUT_FILTERS )
  210. #define ERROR_PID_OR_IM_ONLY GetResString( IDS_ERROR_PID_OR_IM_ONLY )
  211. #define ERROR_NO_PID_AND_IM GetResString( IDS_ERROR_NO_PID_AND_IM )
  212. #define ERROR_STRING_FOR_PID GetResString( IDS_ERROR_STRING_FOR_PID )
  213. #define ERROR_INVALID_USAGE_REQUEST GetResString( IDS_ERROR_INVALID_USAGE_REQUEST )
  214. #define ERROR_PLATFORM_SHOULD_BE_X86 GetResString( IDS_ERROR_PLATFORM_SHOULD_BE_X86 )
  215. //
  216. // command line options and their indexes in the array
  217. #define MAX_OPTIONS 9
  218. // supported options ( do not localize )
  219. #define OPTION_USAGE L"?"
  220. #define OPTION_SERVER L"s"
  221. #define OPTION_USERNAME L"u"
  222. #define OPTION_PASSWORD L"p"
  223. #define OPTION_FORCE L"f"
  224. #define OPTION_FILTER L"fi"
  225. #define OPTION_PID L"pid"
  226. #define OPTION_IMAGENAME L"im"
  227. #define OPTION_TREE L"t"
  228. // indexes
  229. #define OI_USAGE 0
  230. #define OI_SERVER 1
  231. #define OI_USERNAME 2
  232. #define OI_PASSWORD 3
  233. #define OI_FORCE 4
  234. #define OI_FILTER 5
  235. #define OI_PID 6
  236. #define OI_IMAGENAME 7
  237. #define OI_TREE 8
  238. //
  239. // filter details
  240. #define MAX_FILTERS 10
  241. // supported filters
  242. #define FILTER_STATUS GetResString( IDS_FILTER_STATUS )
  243. #define FILTER_IMAGENAME GetResString( IDS_FILTER_IMAGENAME )
  244. #define FILTER_PID GetResString( IDS_FILTER_PID )
  245. #define FILTER_SESSION GetResString( IDS_FILTER_SESSION )
  246. #define FILTER_CPUTIME GetResString( IDS_FILTER_CPUTIME )
  247. #define FILTER_MEMUSAGE GetResString( IDS_FILTER_MEMUSAGE )
  248. #define FILTER_USERNAME GetResString( IDS_FILTER_USERNAME )
  249. #define FILTER_SERVICES GetResString( IDS_FILTER_SERVICES )
  250. #define FILTER_WINDOWTITLE GetResString( IDS_FILTER_WINDOWNAME )
  251. #define FILTER_MODULES GetResString( IDS_FILTER_MODULES )
  252. #define FI_STATUS 0
  253. #define FI_IMAGENAME 1
  254. #define FI_PID 2
  255. #define FI_SESSION 3
  256. #define FI_CPUTIME 4
  257. #define FI_MEMUSAGE 5
  258. #define FI_USERNAME 6
  259. #define FI_SERVICES 7
  260. #define FI_WINDOWTITLE 8
  261. #define FI_MODULES 9
  262. // values supported by 'status' filter
  263. #define FVALUES_STATUS GetResString( IDS_FVALUES_STATUS )
  264. // operators supported
  265. #define OPERATORS_STRING GetResString( IDS_OPERATORS_STRING )
  266. #define OPERATORS_NUMERIC GetResString( IDS_OPERATORS_NUMERIC )
  267. // max. columns ( information ) to be stored for one task
  268. #define MAX_TASKSINFO 18
  269. // task info indexes
  270. #define TASK_HOSTNAME 0
  271. #define TASK_IMAGENAME 1
  272. #define TASK_PID 2
  273. #define TASK_SESSIONNAME 3
  274. #define TASK_SESSION 4
  275. #define TASK_MEMUSAGE 5
  276. #define TASK_STATUS 6
  277. #define TASK_USERNAME 7
  278. #define TASK_CPUTIME 8
  279. #define TASK_WINDOWTITLE 9
  280. #define TASK_SERVICES 10
  281. #define TASK_MODULES 11
  282. // always hidden
  283. #define TASK_HWND 12
  284. #define TASK_WINSTA 13
  285. #define TASK_DESK 14
  286. #define TASK_CREATINGPROCESSID 15
  287. #define TASK_OBJPATH 16
  288. #define TASK_RANK 17
  289. #define NULL_STRING L"\0"
  290. //
  291. // CTaskKill
  292. //
  293. class CTaskKill
  294. {
  295. public:
  296. // enumerators
  297. enum
  298. {
  299. twiProcessId = 0,
  300. twiWinSta = 1,
  301. twiDesktop = 2,
  302. twiHandle = 3,
  303. twiTitle = 4,
  304. twiHungInfo = 5,
  305. twiCOUNT,
  306. };
  307. // constructor / destructor
  308. public:
  309. CTaskKill();
  310. ~CTaskKill();
  311. // data memebers
  312. private:
  313. // input arguments
  314. BOOL m_bTree; // -tr
  315. BOOL m_bForce; // -fo
  316. CHString m_strServer; // -s
  317. CHString m_strUserName; // -u
  318. CHString m_strPassword; // -p
  319. TARRAY m_arrFilters; // -fi
  320. TARRAY m_arrTasksToKill; // ( defaults = -im and -pid )
  321. // WMI Query
  322. CHString m_strQuery;
  323. // other(s)
  324. DWORD m_dwCurrentPid;
  325. BOOL m_bNeedPassword;
  326. BOOL m_bNeedModulesInfo;
  327. TARRAY m_arrFiltersEx; // parsed filters info
  328. TARRAY m_arrWindowTitles; // window titles
  329. BOOL m_bNeedServicesInfo; // determines whether services info has to gathered or not
  330. BOOL m_bNeedUserContextInfo; // determines whether userinfo has to gathered or not
  331. PTFILTERCONFIG m_pfilterConfigs; // filters config information
  332. // WMI / COM interfaces
  333. IWbemLocator* m_pWbemLocator;
  334. IWbemServices* m_pWbemServices;
  335. IEnumWbemClassObject* m_pWbemEnumObjects;
  336. IWbemClassObject* m_pWbemTerminateInParams;
  337. // WMI connectivity
  338. COAUTHIDENTITY* m_pAuthIdentity;
  339. // output data
  340. TARRAY m_arrRecord;
  341. DWORD m_dwProcessId;
  342. CHString m_strImageName;
  343. BOOL m_bTasksOptimized;
  344. BOOL m_bFiltersOptimized;
  345. // winstation related stuff
  346. CHString m_strUNCServer; // server name
  347. BOOL m_bIsHydra;
  348. HMODULE m_hWinstaLib;
  349. PBYTE m_pProcessInfo;
  350. ULONG m_ulNumberOfProcesses;
  351. BOOL m_bCloseConnection;
  352. // services related stuff
  353. DWORD m_dwServicesCount;
  354. LPENUM_SERVICE_STATUS_PROCESS m_pServicesInfo;
  355. // modules related stuff ( remote only )
  356. BOOL m_bUseRemote;
  357. PPERF_DATA_BLOCK m_pdb;
  358. //
  359. // functions
  360. FUNC_WinStationFreeMemory m_pfnWinStationFreeMemory;
  361. FUNC_WinStationOpenServerW m_pfnWinStationOpenServerW;
  362. FUNC_WinStationCloseServer m_pfnWinStationCloseServer;
  363. FUNC_WinStationFreeGAPMemory m_pfnWinStationFreeGAPMemory;
  364. FUNC_WinStationGetAllProcesses m_pfnWinStationGetAllProcesses;
  365. FUNC_WinStationEnumerateProcesses m_pfnWinStationEnumerateProcesses;
  366. public:
  367. BOOL m_bUsage; // -?
  368. BOOL m_bLocalSystem;
  369. // functions
  370. private:
  371. BOOL CanTerminate();
  372. BOOL Kill();
  373. BOOL KillProcessOnLocalSystem();
  374. BOOL ForciblyKillProcessOnLocalSystem();
  375. BOOL ForciblyKillProcessOnRemoteSystem();
  376. LONG MatchTaskToKill( DWORD& dwMatchedIndex );
  377. // helpers
  378. VOID DoOptimization();
  379. VOID SaveData( IWbemClassObject* pWmiObject );
  380. VOID SetMemUsage( IWbemClassObject* pWmiObject );
  381. VOID SetCPUTime( IWbemClassObject* pWmiObject );
  382. VOID SetUserContext( IWbemClassObject* pWmiObject );
  383. VOID SetWindowTitle( void );
  384. VOID SetServicesInfo( void );
  385. BOOL SetModulesInfo( void );
  386. // ...
  387. BOOL LoadTasksEx();
  388. BOOL LoadModulesInfo();
  389. BOOL LoadServicesInfo();
  390. BOOL GetModulesOnRemote( TARRAY arrModules );
  391. BOOL GetModulesOnRemoteEx( TARRAY arrModules );
  392. BOOL LoadModulesOnLocal( TARRAY arrModules );
  393. BOOL LoadUserNameFromWinsta( CHString& strDomain, CHString& strUserName );
  394. // winsta functions
  395. BOOLEAN WinStationFreeMemory( PVOID pBuffer );
  396. BOOLEAN WinStationCloseServer( HANDLE hServer );
  397. HANDLE WinStationOpenServerW( LPWSTR pwszServerName );
  398. BOOLEAN WinStationEnumerateProcesses( HANDLE hServer, PVOID *ppProcessBuffer );
  399. BOOLEAN WinStationFreeGAPMemory( ULONG Level, PVOID ProcessArray, ULONG ulCount );
  400. BOOLEAN WinStationGetAllProcesses( HANDLE hServer, ULONG Level,
  401. ULONG *pNumberOfProcesses, PVOID *ppProcessArray );
  402. public:
  403. VOID Usage();
  404. BOOL Initialize();
  405. VOID PrepareColumns();
  406. BOOL ValidateFilters();
  407. BOOL ProcessOptions( DWORD argc, LPCTSTR argv[] );
  408. // functionality related
  409. BOOL Connect();
  410. BOOL LoadTasks();
  411. BOOL EnableDebugPriv();
  412. BOOL DoTerminate( DWORD& dwTerminate );
  413. };
  414. //
  415. // public functions
  416. //
  417. #endif // _TASKLIST_H