[NTOSKRNL]
[reactos.git] / ntoskrnl / include / internal / probe.h
1 #pragma once
2
3 #include <reactos/probe.h>
4
5 static
6 __inline
7 NTSTATUS
8 DefaultSetInfoBufferCheck(ULONG Class,
9 const INFORMATION_CLASS_INFO *ClassList,
10 ULONG ClassListEntries,
11 PVOID Buffer,
12 ULONG BufferLength,
13 KPROCESSOR_MODE PreviousMode)
14 {
15 NTSTATUS Status = STATUS_SUCCESS;
16
17 if (Class < ClassListEntries)
18 {
19 if (!(ClassList[Class].Flags & ICIF_SET))
20 {
21 Status = STATUS_INVALID_INFO_CLASS;
22 }
23 else if (ClassList[Class].RequiredSizeSET > 0 &&
24 BufferLength != ClassList[Class].RequiredSizeSET)
25 {
26 if (!(ClassList[Class].Flags & ICIF_SET_SIZE_VARIABLE))
27 {
28 Status = STATUS_INFO_LENGTH_MISMATCH;
29 }
30 }
31
32 if (NT_SUCCESS(Status))
33 {
34 if (PreviousMode != KernelMode)
35 {
36 _SEH2_TRY
37 {
38 ProbeForRead(Buffer,
39 BufferLength,
40 ClassList[Class].AlignmentSET);
41 }
42 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
43 {
44 Status = _SEH2_GetExceptionCode();
45 }
46 _SEH2_END;
47 }
48 }
49 }
50 else
51 Status = STATUS_INVALID_INFO_CLASS;
52
53 return Status;
54 }
55
56 static
57 __inline
58 NTSTATUS
59 DefaultQueryInfoBufferCheck(ULONG Class,
60 const INFORMATION_CLASS_INFO *ClassList,
61 ULONG ClassListEntries,
62 PVOID Buffer,
63 ULONG BufferLength,
64 PULONG ReturnLength,
65 PULONG_PTR ReturnLengthPtr,
66 KPROCESSOR_MODE PreviousMode)
67 {
68 NTSTATUS Status = STATUS_SUCCESS;
69
70 if (Class < ClassListEntries)
71 {
72 if (!(ClassList[Class].Flags & ICIF_QUERY))
73 {
74 Status = STATUS_INVALID_INFO_CLASS;
75 }
76 else if (ClassList[Class].RequiredSizeQUERY > 0 &&
77 BufferLength != ClassList[Class].RequiredSizeQUERY)
78 {
79 if (!(ClassList[Class].Flags & ICIF_QUERY_SIZE_VARIABLE))
80 {
81 Status = STATUS_INFO_LENGTH_MISMATCH;
82 }
83 }
84
85 if (NT_SUCCESS(Status))
86 {
87 if (PreviousMode != KernelMode)
88 {
89 _SEH2_TRY
90 {
91 if (Buffer != NULL)
92 {
93 ProbeForWrite(Buffer,
94 BufferLength,
95 ClassList[Class].AlignmentQUERY);
96 }
97
98 if (ReturnLength != NULL)
99 {
100 ProbeForWriteUlong(ReturnLength);
101 }
102 if (ReturnLengthPtr != NULL)
103 {
104 ProbeForWrite(ReturnLengthPtr, sizeof(ULONG_PTR), sizeof(ULONG_PTR));
105 }
106 }
107 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
108 {
109 Status = _SEH2_GetExceptionCode();
110 }
111 _SEH2_END;
112 }
113 }
114 }
115 else
116 Status = STATUS_INVALID_INFO_CLASS;
117
118 return Status;
119 }