Windows NT 4.0 source code leak
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.

223 lines
4.9 KiB

4 years ago
  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. LPDWORD 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. SetLastError( RtlNtStatusToDosError( Status ) );
  40. return(FALSE);
  41. }
  42. TotalOffset = 0;
  43. ibCur = 0;
  44. cdwMax = cb / sizeof(DWORD);
  45. i = 0;
  46. for (;;) {
  47. PSYSTEM_PROCESS_INFORMATION pProcessInformation;
  48. pProcessInformation = (PSYSTEM_PROCESS_INFORMATION)
  49. ((BYTE *) pvProcessInformation + TotalOffset);
  50. if (i < cdwMax) {
  51. try {
  52. lpidProcess[i++] = (DWORD)pProcessInformation->UniqueProcessId;
  53. }
  54. except (EXCEPTION_EXECUTE_HANDLER) {
  55. LocalFree((HLOCAL) pvProcessInformation);
  56. SetLastError( RtlNtStatusToDosError( GetExceptionCode() ) );
  57. return(FALSE);
  58. }
  59. }
  60. ibCur = pProcessInformation->NextEntryOffset;
  61. TotalOffset += ibCur;
  62. if (ibCur == 0) {
  63. break;
  64. }
  65. };
  66. try {
  67. *lpcbNeeded = i * sizeof(DWORD);
  68. }
  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 VmCounters;
  97. // Try to feel if the ptr passed is NULL and if not,
  98. // is it long enough for us.
  99. try {
  100. ppsmemCounters->PeakPagefileUsage = 0;
  101. }
  102. except (EXCEPTION_EXECUTE_HANDLER) {
  103. SetLastError( RtlNtStatusToDosError( GetExceptionCode() ) );
  104. return(FALSE);
  105. }
  106. if (cb < sizeof(PROCESS_MEMORY_COUNTERS)) {
  107. SetLastError( ERROR_INSUFFICIENT_BUFFER );
  108. return(FALSE);
  109. }
  110. Status = NtQueryInformationProcess(
  111. hProcess,
  112. ProcessVmCounters,
  113. &VmCounters,
  114. sizeof(VM_COUNTERS),
  115. NULL
  116. );
  117. if ( !NT_SUCCESS(Status) )
  118. {
  119. SetLastError( RtlNtStatusToDosError( Status ) );
  120. return( FALSE );
  121. }
  122. ppsmemCounters->cb = sizeof(PROCESS_MEMORY_COUNTERS);
  123. ppsmemCounters->PageFaultCount = VmCounters.PageFaultCount;
  124. ppsmemCounters->PeakWorkingSetSize = VmCounters.PeakWorkingSetSize;
  125. ppsmemCounters->WorkingSetSize = VmCounters.WorkingSetSize;
  126. ppsmemCounters->QuotaPeakPagedPoolUsage = VmCounters.QuotaPeakPagedPoolUsage;
  127. ppsmemCounters->QuotaPagedPoolUsage = VmCounters.QuotaPagedPoolUsage;
  128. ppsmemCounters->QuotaPeakNonPagedPoolUsage= VmCounters.QuotaPeakNonPagedPoolUsage;
  129. ppsmemCounters->QuotaNonPagedPoolUsage = VmCounters.QuotaNonPagedPoolUsage;
  130. ppsmemCounters->PagefileUsage = VmCounters.PagefileUsage;
  131. ppsmemCounters->PeakPagefileUsage = VmCounters.PeakPagefileUsage;
  132. return(TRUE);
  133. }
  134. BOOL
  135. WINAPI
  136. InitializeProcessForWsWatch(
  137. HANDLE hProcess
  138. )
  139. {
  140. NTSTATUS Status;
  141. Status = NtSetInformationProcess(
  142. hProcess,
  143. ProcessWorkingSetWatch,
  144. NULL,
  145. 0
  146. );
  147. if ( NT_SUCCESS(Status) || Status == STATUS_PORT_ALREADY_SET || Status == STATUS_ACCESS_DENIED ) {
  148. return TRUE;
  149. }
  150. else {
  151. return FALSE;
  152. }
  153. }
  154. BOOL
  155. WINAPI
  156. GetWsChanges(
  157. HANDLE hProcess,
  158. PPSAPI_WS_WATCH_INFORMATION lpWatchInfo,
  159. DWORD cb
  160. )
  161. {
  162. NTSTATUS Status;
  163. Status = NtQueryInformationProcess(
  164. hProcess,
  165. ProcessWorkingSetWatch,
  166. (PVOID *)lpWatchInfo,
  167. cb,
  168. NULL
  169. );
  170. if ( NT_SUCCESS(Status) ) {
  171. return TRUE;
  172. }
  173. else {
  174. return FALSE;
  175. }
  176. }