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.

353 lines
8.5 KiB

  1. #include <nt.h>
  2. #include <ntrtl.h>
  3. #include <nturtl.h>
  4. #include <windows.h>
  5. #include "psapi.h"
  6. #include <stddef.h>
  7. BOOL
  8. WINAPI
  9. EnumProcesses(
  10. DWORD * lpidProcess,
  11. DWORD cb,
  12. LPDWORD lpcbNeeded
  13. )
  14. {
  15. DWORD cbProcessInformation;
  16. LPVOID pvProcessInformation;
  17. NTSTATUS Status;
  18. DWORD ibCur, i;
  19. DWORD cdwMax;
  20. DWORD TotalOffset;
  21. cbProcessInformation = 32768;
  22. Retry:
  23. pvProcessInformation = LocalAlloc(LMEM_FIXED, cbProcessInformation);
  24. if (pvProcessInformation == NULL) {
  25. return(FALSE);
  26. }
  27. Status = NtQuerySystemInformation(
  28. SystemProcessInformation,
  29. pvProcessInformation,
  30. cbProcessInformation,
  31. NULL
  32. );
  33. if ( Status == STATUS_INFO_LENGTH_MISMATCH ) {
  34. LocalFree((HLOCAL) pvProcessInformation);
  35. cbProcessInformation += 32768;
  36. goto Retry;
  37. }
  38. if ( !NT_SUCCESS(Status) ) {
  39. LocalFree((HLOCAL) pvProcessInformation);
  40. SetLastError( RtlNtStatusToDosError( Status ) );
  41. return(FALSE);
  42. }
  43. TotalOffset = 0;
  44. ibCur = 0;
  45. cdwMax = cb / sizeof(DWORD);
  46. i = 0;
  47. for (;;) {
  48. PSYSTEM_PROCESS_INFORMATION pProcessInformation;
  49. pProcessInformation = (PSYSTEM_PROCESS_INFORMATION)
  50. ((BYTE *) pvProcessInformation + TotalOffset);
  51. if (i < cdwMax) {
  52. try {
  53. lpidProcess[i] = HandleToUlong(pProcessInformation->UniqueProcessId);
  54. } except (EXCEPTION_EXECUTE_HANDLER) {
  55. LocalFree((HLOCAL) pvProcessInformation);
  56. SetLastError( RtlNtStatusToDosError( GetExceptionCode() ) );
  57. return(FALSE);
  58. }
  59. i++;
  60. }
  61. ibCur = pProcessInformation->NextEntryOffset;
  62. TotalOffset += ibCur;
  63. if (ibCur == 0) {
  64. break;
  65. }
  66. };
  67. try {
  68. *lpcbNeeded = i * sizeof(DWORD);
  69. } except (EXCEPTION_EXECUTE_HANDLER) {
  70. LocalFree((HLOCAL) pvProcessInformation);
  71. SetLastError( RtlNtStatusToDosError( GetExceptionCode() ) );
  72. return(FALSE);
  73. }
  74. LocalFree((HLOCAL) pvProcessInformation);
  75. return(TRUE);
  76. }
  77. BOOL
  78. WINAPI
  79. GetProcessMemoryInfo (
  80. HANDLE hProcess,
  81. PPROCESS_MEMORY_COUNTERS ppsmemCounters,
  82. DWORD cb
  83. )
  84. /*++
  85. Routine Description:
  86. This function returns all the PSVM_COUNTERS for a process.
  87. Arguments:
  88. hProcess - Handle for the process being queried.
  89. ppsmemCounters - Points to buffer that will receive the PROCESS_MEMORY_COUNTERS.
  90. cb - size of ppsmemCounters
  91. Return Value:
  92. The return value is TRUE or FALSE.
  93. --*/
  94. {
  95. NTSTATUS Status;
  96. VM_COUNTERS_EX VmCounters;
  97. BOOL fEx;
  98. // Try to feel if the ptr passed is NULL and if not,
  99. // is it long enough for us.
  100. try {
  101. ppsmemCounters->PeakPagefileUsage = 0;
  102. }
  103. except (EXCEPTION_EXECUTE_HANDLER) {
  104. SetLastError( RtlNtStatusToDosError( GetExceptionCode() ) );
  105. return(FALSE);
  106. }
  107. if (cb < sizeof(PROCESS_MEMORY_COUNTERS)) {
  108. SetLastError( ERROR_INSUFFICIENT_BUFFER );
  109. return(FALSE);
  110. } else if (cb < sizeof(PROCESS_MEMORY_COUNTERS_EX)) {
  111. fEx = FALSE;
  112. } else {
  113. fEx = TRUE;
  114. }
  115. Status = NtQueryInformationProcess(
  116. hProcess,
  117. ProcessVmCounters,
  118. &VmCounters,
  119. sizeof(VmCounters),
  120. NULL
  121. );
  122. if ( !NT_SUCCESS(Status) )
  123. {
  124. SetLastError( RtlNtStatusToDosError( Status ) );
  125. return( FALSE );
  126. }
  127. if (fEx) {
  128. ppsmemCounters->cb = sizeof(PROCESS_MEMORY_COUNTERS_EX);
  129. } else {
  130. ppsmemCounters->cb = sizeof(PROCESS_MEMORY_COUNTERS);
  131. }
  132. ppsmemCounters->PageFaultCount = VmCounters.PageFaultCount;
  133. ppsmemCounters->PeakWorkingSetSize = VmCounters.PeakWorkingSetSize;
  134. ppsmemCounters->WorkingSetSize = VmCounters.WorkingSetSize;
  135. ppsmemCounters->QuotaPeakPagedPoolUsage = VmCounters.QuotaPeakPagedPoolUsage;
  136. ppsmemCounters->QuotaPagedPoolUsage = VmCounters.QuotaPagedPoolUsage;
  137. ppsmemCounters->QuotaPeakNonPagedPoolUsage = VmCounters.QuotaPeakNonPagedPoolUsage;
  138. ppsmemCounters->QuotaNonPagedPoolUsage = VmCounters.QuotaNonPagedPoolUsage;
  139. ppsmemCounters->PagefileUsage = VmCounters.PagefileUsage;
  140. ppsmemCounters->PeakPagefileUsage = VmCounters.PeakPagefileUsage;
  141. if (fEx) {
  142. ((PPROCESS_MEMORY_COUNTERS_EX)ppsmemCounters)->PrivateUsage = VmCounters.PrivateUsage;
  143. }
  144. return(TRUE);
  145. }
  146. BOOL
  147. WINAPI
  148. InitializeProcessForWsWatch(
  149. HANDLE hProcess
  150. )
  151. {
  152. NTSTATUS Status;
  153. Status = NtSetInformationProcess(
  154. hProcess,
  155. ProcessWorkingSetWatch,
  156. NULL,
  157. 0
  158. );
  159. if ( NT_SUCCESS(Status) || Status == STATUS_PORT_ALREADY_SET || Status == STATUS_ACCESS_DENIED ) {
  160. return TRUE;
  161. }
  162. else {
  163. SetLastError( RtlNtStatusToDosError( Status ) );
  164. return FALSE;
  165. }
  166. }
  167. BOOL
  168. WINAPI
  169. GetWsChanges(
  170. HANDLE hProcess,
  171. PPSAPI_WS_WATCH_INFORMATION lpWatchInfo,
  172. DWORD cb
  173. )
  174. {
  175. NTSTATUS Status;
  176. Status = NtQueryInformationProcess(
  177. hProcess,
  178. ProcessWorkingSetWatch,
  179. (PVOID *)lpWatchInfo,
  180. cb,
  181. NULL
  182. );
  183. if ( NT_SUCCESS(Status) ) {
  184. return TRUE;
  185. }
  186. else {
  187. SetLastError( RtlNtStatusToDosError( Status ) );
  188. return FALSE;
  189. }
  190. }
  191. DWORD
  192. WINAPI
  193. GetProcessImageFileNameW(
  194. HANDLE hProcess,
  195. LPWSTR lpImageFileName,
  196. DWORD nSize
  197. )
  198. {
  199. PUNICODE_STRING Buffer;
  200. ULONG BufferSize,
  201. ReturnLength;
  202. NTSTATUS Status;
  203. BufferSize = sizeof(UNICODE_STRING) + nSize * 2;
  204. Buffer = LocalAlloc(LMEM_FIXED, BufferSize);
  205. if (! Buffer) {
  206. ReturnLength = 0;
  207. goto cleanup;
  208. }
  209. Status = NtQueryInformationProcess(hProcess,
  210. ProcessImageFileName,
  211. Buffer,
  212. BufferSize,
  213. NULL);
  214. if (Status == STATUS_INFO_LENGTH_MISMATCH) {
  215. Status = STATUS_BUFFER_TOO_SMALL;
  216. }
  217. if (! NT_SUCCESS(Status)) {
  218. SetLastError( RtlNtStatusToDosError( Status ) );
  219. ReturnLength = 0;
  220. goto cleanup_buffer;
  221. }
  222. RtlCopyMemory(lpImageFileName,
  223. Buffer->Buffer,
  224. Buffer->Length);
  225. ReturnLength = Buffer->Length >> 1;
  226. if (ReturnLength < nSize) {
  227. lpImageFileName[ReturnLength] = UNICODE_NULL;
  228. }
  229. cleanup_buffer:
  230. LocalFree((HLOCAL) Buffer);
  231. cleanup:
  232. return ReturnLength;
  233. }
  234. DWORD
  235. WINAPI
  236. GetProcessImageFileNameA(
  237. HANDLE hProcess,
  238. LPSTR lpImageFileName,
  239. DWORD nSize
  240. )
  241. {
  242. PUNICODE_STRING Buffer;
  243. ULONG BufferSize,
  244. ReturnLength;
  245. NTSTATUS Status;
  246. BufferSize = sizeof(UNICODE_STRING) + nSize * 2;
  247. Buffer = LocalAlloc(LMEM_FIXED, BufferSize);
  248. if (! Buffer) {
  249. ReturnLength = 0;
  250. goto cleanup;
  251. }
  252. Status = NtQueryInformationProcess(hProcess,
  253. ProcessImageFileName,
  254. Buffer,
  255. BufferSize,
  256. NULL);
  257. if (Status == STATUS_INFO_LENGTH_MISMATCH) {
  258. Status = STATUS_BUFFER_TOO_SMALL;
  259. }
  260. if (! NT_SUCCESS(Status)) {
  261. SetLastError( RtlNtStatusToDosError( Status ) );
  262. ReturnLength = 0;
  263. goto cleanup_buffer;
  264. }
  265. ReturnLength = WideCharToMultiByte(CP_ACP,
  266. 0,
  267. Buffer->Buffer,
  268. Buffer->Length,
  269. lpImageFileName,
  270. nSize,
  271. NULL,
  272. NULL);
  273. if (ReturnLength) {
  274. //
  275. // WideCharToMultiByte includes the trailing NULL in its
  276. // count; we do not.
  277. //
  278. --ReturnLength;
  279. }
  280. cleanup_buffer:
  281. LocalFree((HLOCAL) Buffer);
  282. cleanup:
  283. return ReturnLength;
  284. }