ReactOS  0.4.15-dev-2534-geba00d1
profile.c
Go to the documentation of this file.
1 /*
2  * COPYRIGHT: See COPYING in the top level directory
3  * PROJECT: ReactOS Kernel
4  * FILE: ntoskrnl/ex/profile.c
5  * PURPOSE: Support for Executive Profile Objects
6  * PROGRAMMERS: Alex Ionescu (alex@relsoft.net)
7  * Thomas Weidenmueller
8  */
9 
10 /* INCLUDES *****************************************************************/
11 
12 #include <ntoskrnl.h>
13 #define NDEBUG
14 #include <debug.h>
15 
16 #define TAG_PROFILE 'forP'
17 
18 /* GLOBALS *******************************************************************/
19 
22 
24 {
29 };
30 
31 /* FUNCTIONS *****************************************************************/
32 
33 VOID
34 NTAPI
36 {
37  PEPROFILE Profile;
38  ULONG State;
39 
40  /* Typecast the Object */
41  Profile = ObjectBody;
42 
43  /* Check if there if the Profile was started */
44  if (Profile->LockedBufferAddress)
45  {
46  /* Stop the Profile */
47  State = KeStopProfile(Profile->ProfileObject);
48  ASSERT(State != FALSE);
49 
50  /* Unmap the Locked Buffer */
51  MmUnmapLockedPages(Profile->LockedBufferAddress, Profile->Mdl);
52  MmUnlockPages(Profile->Mdl);
53  IoFreeMdl(Profile->Mdl);
55  }
56 
57  /* Check if a Process is associated and reference it */
58  if (Profile->Process) ObDereferenceObject(Profile->Process);
59 }
60 
61 CODE_SEG("INIT")
62 BOOLEAN
63 NTAPI
65 {
66  OBJECT_TYPE_INITIALIZER ObjectTypeInitializer;
69  DPRINT("Creating Profile Object Type\n");
70 
71  /* Initialize the Mutex to lock the States */
73 
74  /* Create the Event Pair Object Type */
75  RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer));
76  RtlInitUnicodeString(&Name, L"Profile");
77  ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer);
78  ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(KPROFILE);
79  ObjectTypeInitializer.GenericMapping = ExpProfileMapping;
80  ObjectTypeInitializer.PoolType = NonPagedPool;
81  ObjectTypeInitializer.DeleteProcedure = ExpDeleteProfile;
82  ObjectTypeInitializer.ValidAccessMask = PROFILE_ALL_ACCESS;
83  ObjectTypeInitializer.InvalidAttributes = OBJ_OPENLINK;
84  Status = ObCreateObjectType(&Name, &ObjectTypeInitializer, NULL, &ExProfileObjectType);
85  if (!NT_SUCCESS(Status)) return FALSE;
86  return TRUE;
87 }
88 
90 NTAPI
91 NtCreateProfile(OUT PHANDLE ProfileHandle,
93  IN PVOID RangeBase,
94  IN SIZE_T RangeSize,
95  IN ULONG BucketSize,
96  IN PVOID Buffer,
98  IN KPROFILE_SOURCE ProfileSource,
100 {
101  HANDLE hProfile;
102  PEPROFILE Profile;
103  PEPROCESS pProcess;
107  ULONG Log2 = 0;
108  ULONG_PTR Segment = 0;
109  PAGED_CODE();
110 
111  /* Easy way out */
113 
114  /* Check if this is a low-memory profile */
115  if ((!BucketSize) && (RangeBase < (PVOID)(0x10000)))
116  {
117  /* Validate size */
118  if (BufferSize < sizeof(ULONG)) return STATUS_INVALID_PARAMETER_7;
119 
120  /* This will become a segmented profile object */
121  Segment = (ULONG_PTR)RangeBase;
122  RangeBase = 0;
123 
124  /* Recalculate the bucket size */
125  BucketSize = RangeSize / (BufferSize / sizeof(ULONG));
126 
127  /* Convert it to log2 */
128  BucketSize--;
129  while (BucketSize >>= 1) Log2++;
130  BucketSize += Log2 + 1;
131  }
132 
133  /* Validate bucket size */
134  if ((BucketSize > 31) || (BucketSize < 2))
135  {
136  DPRINT1("Bucket size invalid\n");
138  }
139 
140  /* Make sure that the buckets can map the range */
141  if ((RangeSize >> (BucketSize - 2)) > BufferSize)
142  {
143  DPRINT1("Bucket size too small\n");
145  }
146 
147  /* Make sure that the range isn't too gigantic */
148  if (((ULONG_PTR)RangeBase + RangeSize) < RangeSize)
149  {
150  DPRINT1("Range too big\n");
151  return STATUS_BUFFER_OVERFLOW;
152  }
153 
154  /* Check if we were called from user-mode */
155  if(PreviousMode != KernelMode)
156  {
157  /* Entry SEH */
158  _SEH2_TRY
159  {
160  /* Make sure that the handle pointer is valid */
161  ProbeForWriteHandle(ProfileHandle);
162 
163  /* Check if the buffer is valid */
165  BufferSize,
166  sizeof(ULONG));
167  }
169  {
170  /* Return the exception code */
172  }
173  _SEH2_END;
174  }
175 
176  /* Check if a process was specified */
177  if (Process)
178  {
179  /* Reference it */
183  PreviousMode,
184  (PVOID*)&pProcess,
185  NULL);
186  if (!NT_SUCCESS(Status)) return(Status);
187  }
188  else
189  {
190  /* Segmented profile objects cannot be used system-wide */
191  if (Segment) return STATUS_INVALID_PARAMETER;
192 
193  /* No process was specified, which means a System-Wide Profile */
194  pProcess = NULL;
195 
196  /* For this, we need to check the Privilege */
198  {
199  DPRINT1("NtCreateProfile: Caller requires the SeSystemProfilePrivilege privilege!\n");
201  }
202  }
203 
204  /* Create the object */
206  NULL,
207  0,
208  NULL,
209  NULL);
213  PreviousMode,
214  NULL,
215  sizeof(EPROFILE),
216  0,
217  sizeof(EPROFILE) + sizeof(KPROFILE),
218  (PVOID*)&Profile);
219  if (!NT_SUCCESS(Status))
220  {
221  /* Dereference the process object if it was specified */
222  if (pProcess) ObDereferenceObject(pProcess);
223 
224  /* Return Status */
225  return Status;
226  }
227 
228  /* Initialize it */
229  Profile->RangeBase = RangeBase;
230  Profile->RangeSize = RangeSize;
231  Profile->Buffer = Buffer;
232  Profile->BufferSize = BufferSize;
233  Profile->BucketSize = BucketSize;
234  Profile->LockedBufferAddress = NULL;
235  Profile->Segment = Segment;
236  Profile->ProfileSource = ProfileSource;
237  Profile->Affinity = Affinity;
238  Profile->Process = pProcess;
239 
240  /* Insert into the Object Tree */
241  Status = ObInsertObject ((PVOID)Profile,
242  NULL,
244  0,
245  NULL,
246  &hProfile);
247 
248  /* Check for Success */
249  if (!NT_SUCCESS(Status))
250  {
251  /* Dereference Process on failure */
252  if (pProcess) ObDereferenceObject(pProcess);
253  return Status;
254  }
255 
256  /* Enter SEH */
257  _SEH2_TRY
258  {
259  /* Copy the created handle back to the caller*/
260  *ProfileHandle = hProfile;
261  }
263  {
265  }
266  _SEH2_END;
267 
268  /* Return Status */
269  return Status;
270 }
271 
272 NTSTATUS
273 NTAPI
275  OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL)
276 {
278  LARGE_INTEGER PerfFrequency;
280 
281  /* Check if we were called from user-mode */
282  if (PreviousMode != KernelMode)
283  {
284  /* Entry SEH Block */
285  _SEH2_TRY
286  {
287  /* Make sure the counter and frequency are valid */
288  ProbeForWriteLargeInteger(PerformanceCounter);
289  if (PerformanceFrequency)
290  {
291  ProbeForWriteLargeInteger(PerformanceFrequency);
292  }
293  }
295  {
296  /* Return the exception code */
298  }
299  _SEH2_END;
300  }
301 
302  /* Enter a new SEH Block */
303  _SEH2_TRY
304  {
305  /* Query the Kernel */
306  *PerformanceCounter = KeQueryPerformanceCounter(&PerfFrequency);
307 
308  /* Return Frequency if requested */
309  if (PerformanceFrequency) *PerformanceFrequency = PerfFrequency;
310  }
312  {
313  /* Get the exception code */
315  }
316  _SEH2_END;
317 
318  /* Return status to caller */
319  return Status;
320 }
321 
322 NTSTATUS
323 NTAPI
324 NtStartProfile(IN HANDLE ProfileHandle)
325 {
326  PEPROFILE Profile;
329  PVOID TempLockedBufferAddress;
331  PAGED_CODE();
332 
333  /* Get the Object */
334  Status = ObReferenceObjectByHandle(ProfileHandle,
337  PreviousMode,
338  (PVOID*)&Profile,
339  NULL);
340  if (!NT_SUCCESS(Status)) return(Status);
341 
342  /* To avoid a Race, wait on the Mutex */
344  Executive,
345  KernelMode,
346  FALSE,
347  NULL);
348 
349  /* The Profile can still be enabled though, so handle that */
350  if (Profile->LockedBufferAddress)
351  {
352  /* Release our lock, dereference and return */
354  ObDereferenceObject(Profile);
356  }
357 
358  /* Allocate a Kernel Profile Object. */
360  sizeof(*ProfileObject),
361  TAG_PROFILE);
362  if (!ProfileObject)
363  {
364  /* Out of memory, fail */
366  ObDereferenceObject(Profile);
368  }
369 
370  /* Allocate the Mdl Structure */
371  Profile->Mdl = IoAllocateMdl(Profile->Buffer, Profile->BufferSize, FALSE, FALSE, NULL);
372 
373  /* Protect this in SEH as we might raise an exception */
374  _SEH2_TRY
375  {
376  /* Probe and Lock for Write Access */
378  }
380  {
381  /* Release our lock, free the buffer, dereference and return */
383  ObDereferenceObject(Profile);
386  }
387  _SEH2_END;
388 
389  /* Map the pages */
390  TempLockedBufferAddress = MmMapLockedPages(Profile->Mdl, KernelMode);
391 
392  /* Initialize the Kernel Profile Object */
393  Profile->ProfileObject = ProfileObject;
395  &Profile->Process->Pcb,
396  Profile->RangeBase,
397  Profile->RangeSize,
398  Profile->BucketSize,
399  Profile->ProfileSource,
400  Profile->Affinity);
401 
402  /* Start the Profiling */
403  KeStartProfile(ProfileObject, TempLockedBufferAddress);
404 
405  /* Now it's safe to save this */
406  Profile->LockedBufferAddress = TempLockedBufferAddress;
407 
408  /* Release mutex, dereference and return */
410  ObDereferenceObject(Profile);
411  return STATUS_SUCCESS;
412 }
413 
414 NTSTATUS
415 NTAPI
416 NtStopProfile(IN HANDLE ProfileHandle)
417 {
418  PEPROFILE Profile;
421  PAGED_CODE();
422 
423  /* Get the Object */
424  Status = ObReferenceObjectByHandle(ProfileHandle,
427  PreviousMode,
428  (PVOID*)&Profile,
429  NULL);
430  if (!NT_SUCCESS(Status)) return(Status);
431 
432  /* Get the Mutex */
434  Executive,
435  KernelMode,
436  FALSE,
437  NULL);
438 
439  /* Make sure the Profile Object is really Started */
440  if (!Profile->LockedBufferAddress)
441  {
443  goto Exit;
444  }
445 
446  /* Stop the Profile */
447  KeStopProfile(Profile->ProfileObject);
448 
449  /* Unlock the Buffer */
450  MmUnmapLockedPages(Profile->LockedBufferAddress, Profile->Mdl);
451  MmUnlockPages(Profile->Mdl);
452  IoFreeMdl(Profile->Mdl);
453  ExFreePoolWithTag(Profile->ProfileObject, TAG_PROFILE);
454 
455  /* Clear the Locked Buffer pointer, meaning the Object is Stopped */
456  Profile->LockedBufferAddress = NULL;
457 
458 Exit:
459  /* Release Mutex, Dereference and Return */
461  ObDereferenceObject(Profile);
462  return Status;
463 }
464 
465 NTSTATUS
466 NTAPI
469 {
471  ULONG ReturnInterval;
473  PAGED_CODE();
474 
475  /* Check if we were called from user-mode */
476  if (PreviousMode != KernelMode)
477  {
478  /* Enter SEH Block */
479  _SEH2_TRY
480  {
481  /* Validate interval */
483  }
485  {
486  /* Return the exception code */
488  }
489  _SEH2_END;
490  }
491 
492  /* Query the Interval */
493  ReturnInterval = (ULONG)KeQueryIntervalProfile(ProfileSource);
494 
495  /* Enter SEH block for return */
496  _SEH2_TRY
497  {
498  /* Return the data */
499  *Interval = ReturnInterval;
500  }
502  {
503  /* Get the exception code */
505  }
506  _SEH2_END;
507 
508  /* Return Success */
509  return Status;
510 }
511 
512 NTSTATUS
513 NTAPI
516 {
517  /* Let the Kernel do the job */
519 
520  /* Nothing can go wrong */
521  return STATUS_SUCCESS;
522 }
#define ProbeForWriteUlong(Ptr)
Definition: probe.h:36
#define OBJ_OPENLINK
Definition: winternl.h:230
KMUTEX ExpProfileMutex
Definition: profile.c:21
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:35
POBJECT_TYPE ExProfileObjectType
Definition: profile.c:20
#define IN
Definition: typedefs.h:39
#define STATUS_PRIVILEGE_NOT_HELD
Definition: DriverTester.h:9
NTSTATUS NTAPI ObCreateObjectType(IN PUNICODE_STRING TypeName, IN POBJECT_TYPE_INITIALIZER ObjectTypeInitializer, IN PVOID Reserved, OUT POBJECT_TYPE *ObjectType)
Definition: oblife.c:1048
LARGE_INTEGER NTAPI KeQueryPerformanceCounter(IN PLARGE_INTEGER PerformanceFreq)
Definition: timer.c:138
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define STANDARD_RIGHTS_WRITE
Definition: nt_native.h:66
#define PROCESS_QUERY_INFORMATION
Definition: pstypes.h:166
IN BOOLEAN OUT PSTR Buffer
Definition: progress.h:34
PVOID LockedBufferAddress
Definition: extypes.h:562
#define TRUE
Definition: types.h:120
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
LONG NTSTATUS
Definition: precomp.h:26
NTSTATUS NTAPI NtQueryPerformanceCounter(OUT PLARGE_INTEGER PerformanceCounter, OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL)
Definition: profile.c:274
_In_ ULONG _In_ ULONG State
Definition: potypes.h:516
BOOLEAN NTAPI SeSinglePrivilegeCheck(IN LUID PrivilegeValue, IN KPROCESSOR_MODE PreviousMode)
Definition: priv.c:520
VOID NTAPI MmUnlockPages(IN PMDL Mdl)
Definition: mdlsup.c:1439
KPROCESSOR_MODE NTAPI ExGetPreviousMode(VOID)
Definition: sysinfo.c:3066
NTSTATUS NTAPI NtCreateProfile(OUT PHANDLE ProfileHandle, IN HANDLE Process OPTIONAL, IN PVOID RangeBase, IN SIZE_T RangeSize, IN ULONG BucketSize, IN PVOID Buffer, IN ULONG BufferSize, IN KPROFILE_SOURCE ProfileSource, IN KAFFINITY Affinity)
Definition: profile.c:91
BOOLEAN NTAPI ExpInitializeProfileImplementation(VOID)
Definition: profile.c:64
const LUID SeSystemProfilePrivilege
Definition: priv.c:28
#define STANDARD_RIGHTS_EXECUTE
Definition: nt_native.h:67
LONG NTAPI KeReleaseMutex(IN PKMUTEX Mutex, IN BOOLEAN Wait)
Definition: mutex.c:189
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
Definition: wait.c:416
VOID NTAPI ProbeForWrite(IN PVOID Address, IN SIZE_T Length, IN ULONG Alignment)
Definition: exintrin.c:143
PVOID NTAPI MmMapLockedPages(IN PMDL Mdl, IN KPROCESSOR_MODE AccessMode)
Definition: mdlsup.c:822
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
_SEH2_TRY
Definition: create.c:4226
uint32_t ULONG_PTR
Definition: typedefs.h:65
NTSTATUS NTAPI ObReferenceObjectByHandle(IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL)
Definition: obref.c:494
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
#define FALSE
Definition: types.h:117
VOID NTAPI MmUnmapLockedPages(IN PVOID BaseAddress, IN PMDL Mdl)
Definition: mdlsup.c:841
VOID NTAPI ExpDeleteProfile(PVOID ObjectBody)
Definition: profile.c:35
struct NameRec_ * Name
Definition: cdprocs.h:459
unsigned char BOOLEAN
BOOLEAN NTAPI KeStopProfile(struct _KPROFILE *Profile)
enum _KPROFILE_SOURCE KPROFILE_SOURCE
ULONG NTAPI KeQueryIntervalProfile(KPROFILE_SOURCE ProfileSource)
NTSTATUS NTAPI NtStartProfile(IN HANDLE ProfileHandle)
Definition: profile.c:324
Definition: bufpool.h:45
CODE_SEG("INIT")
Definition: Interface.c:1810
_Inout_ PVOID Segment
Definition: exfuncs.h:1101
NTSTATUS NTAPI ObCreateObject(IN KPROCESSOR_MODE ProbeMode OPTIONAL, IN POBJECT_TYPE Type, IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, IN KPROCESSOR_MODE AccessMode, IN OUT PVOID ParseContext OPTIONAL, IN ULONG ObjectSize, IN ULONG PagedPoolCharge OPTIONAL, IN ULONG NonPagedPoolCharge OPTIONAL, OUT PVOID *Object)
Definition: oblife.c:952
#define STATUS_INVALID_PARAMETER_7
Definition: ntstatus.h:481
DWORD Interval
Definition: netstat.c:33
VOID NTAPI KeSetIntervalProfile(ULONG Interval, KPROFILE_SOURCE ProfileSource)
Status
Definition: gdiplustypes.h:24
_In_ KPROCESSOR_MODE PreviousMode
Definition: sefuncs.h:103
GENERIC_MAPPING ExpProfileMapping
Definition: profile.c:23
#define ASSERT(a)
Definition: mode.c:45
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:85
static void Exit(void)
Definition: sock.c:1331
#define ObDereferenceObject
Definition: obfuncs.h:203
_In_ ULONG _In_ ULONG _In_ ULONG _Out_ PKIRQL _Out_ PKAFFINITY Affinity
Definition: halfuncs.h:170
#define ProbeForWriteHandle(Ptr)
Definition: probe.h:43
NTSTATUS NTAPI NtSetIntervalProfile(IN ULONG Interval, IN KPROFILE_SOURCE Source)
Definition: profile.c:514
CCHAR KPROCESSOR_MODE
Definition: ketypes.h:7
#define TAG_PROFILE
Definition: profile.c:16
VOID NTAPI IoFreeMdl(PMDL Mdl)
Definition: iomdl.c:146
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
VOID NTAPI KeInitializeMutex(IN PKMUTEX Mutex, IN ULONG Level)
Definition: mutex.c:67
static const WCHAR L[]
Definition: oid.c:1250
NTSTATUS NTAPI NtQueryIntervalProfile(IN KPROFILE_SOURCE ProfileSource, OUT PULONG Interval)
Definition: profile.c:467
PVOID *typedef PHANDLE
Definition: ntsecpkg.h:454
BOOLEAN NTAPI KeStartProfile(struct _KPROFILE *Profile, PVOID Buffer)
#define STANDARD_RIGHTS_READ
Definition: nt_native.h:65
NTSTATUS NTAPI NtStopProfile(IN HANDLE ProfileHandle)
Definition: profile.c:416
VOID NTAPI KeInitializeProfile(struct _KPROFILE *Profile, struct _KPROCESS *Process, PVOID ImageBase, SIZE_T ImageSize, ULONG BucketSize, KPROFILE_SOURCE ProfileSource, KAFFINITY Affinity)
PMDL NTAPI IoAllocateMdl(IN PVOID VirtualAddress, IN ULONG Length, IN BOOLEAN SecondaryBuffer, IN BOOLEAN ChargeQuota, IN PIRP Irp)
Definition: iomdl.c:22
PKPROFILE ProfileObject
Definition: extypes.h:561
ULONG_PTR SIZE_T
Definition: typedefs.h:80
_SEH2_END
Definition: create.c:4400
NTSTATUS NTAPI ObInsertObject(IN PVOID Object, IN PACCESS_STATE AccessState OPTIONAL, IN ACCESS_MASK DesiredAccess, IN ULONG ObjectPointerBias, OUT PVOID *NewObject OPTIONAL, OUT PHANDLE Handle)
Definition: obhandle.c:2931
LONG NTAPI ExSystemExceptionFilter(VOID)
Definition: harderr.c:351
GENERIC_MAPPING GenericMapping
Definition: obtypes.h:358
#define STATUS_BUFFER_OVERFLOW
Definition: shellext.h:66
VOID NTAPI MmProbeAndLockPages(IN PMDL Mdl, IN KPROCESSOR_MODE AccessMode, IN LOCK_OPERATION Operation)
Definition: mdlsup.c:935
ULONG_PTR KAFFINITY
Definition: compat.h:85
PEPROCESS Process
Definition: extypes.h:555
#define STATUS_PROFILING_NOT_STOPPED
Definition: ntstatus.h:420
unsigned int * PULONG
Definition: retypes.h:1
#define NULL
Definition: types.h:112
#define DPRINT1
Definition: precomp.h:8
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
Definition: fsrtlfuncs.h:219
#define OUT
Definition: typedefs.h:40
unsigned int ULONG
Definition: retypes.h:1
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define ULONG_PTR
Definition: config.h:101
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
Definition: ndis.h:3167
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:40
#define STATUS_SUCCESS
Definition: shellext.h:65
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:165
#define _SEH2_YIELD(__stmt)
Definition: pseh2_64.h:168
#define DPRINT
Definition: sndvol32.h:71
#define PROFILE_ALL_ACCESS
Definition: extypes.h:131
OB_DELETE_METHOD DeleteProcedure
Definition: obtypes.h:369
struct _KPROFILE KPROFILE
POBJECT_TYPE PsProcessType
Definition: process.c:20
ULONG DefaultNonPagedPoolCharge
Definition: obtypes.h:365
#define PROFILE_CONTROL
Definition: extypes.h:130
PMDL Mdl
Definition: extypes.h:563
#define ProbeForWriteLargeInteger(Ptr)
Definition: probe.h:46
#define BufferSize
Definition: mmc.h:75
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
Definition: wdfmemory.h:251
#define STATUS_PROFILING_NOT_STARTED
Definition: ntstatus.h:419
#define PAGED_CODE()
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68