3 #include <reactos/probe.h>
8 DefaultSetInfoBufferCheck(ULONG Class
,
9 const INFORMATION_CLASS_INFO
*ClassList
,
10 ULONG ClassListEntries
,
13 KPROCESSOR_MODE PreviousMode
)
15 NTSTATUS Status
= STATUS_SUCCESS
;
17 if (Class
< ClassListEntries
)
19 if (!(ClassList
[Class
].Flags
& ICIF_SET
))
21 Status
= STATUS_INVALID_INFO_CLASS
;
23 else if (ClassList
[Class
].RequiredSizeSET
> 0 &&
24 BufferLength
!= ClassList
[Class
].RequiredSizeSET
)
26 if (!(ClassList
[Class
].Flags
& ICIF_SET_SIZE_VARIABLE
))
28 Status
= STATUS_INFO_LENGTH_MISMATCH
;
32 if (NT_SUCCESS(Status
))
34 if (PreviousMode
!= KernelMode
)
40 ClassList
[Class
].AlignmentSET
);
42 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
44 Status
= _SEH2_GetExceptionCode();
51 Status
= STATUS_INVALID_INFO_CLASS
;
59 DefaultQueryInfoBufferCheck(ULONG Class
,
60 const INFORMATION_CLASS_INFO
*ClassList
,
61 ULONG ClassListEntries
,
65 PULONG_PTR ReturnLengthPtr
,
66 KPROCESSOR_MODE PreviousMode
,
67 BOOLEAN CompleteProbing
)
69 NTSTATUS Status
= STATUS_SUCCESS
;
71 if (Class
< ClassListEntries
)
73 if (!(ClassList
[Class
].Flags
& ICIF_QUERY
))
75 Status
= STATUS_INVALID_INFO_CLASS
;
77 else if (ClassList
[Class
].RequiredSizeQUERY
> 0 &&
78 BufferLength
!= ClassList
[Class
].RequiredSizeQUERY
)
80 if (!(ClassList
[Class
].Flags
& ICIF_QUERY_SIZE_VARIABLE
))
82 Status
= STATUS_INFO_LENGTH_MISMATCH
;
86 if (NT_SUCCESS(Status
))
88 if (PreviousMode
!= KernelMode
)
98 ClassList
[Class
].AlignmentQUERY
);
102 ProbeForWrite(Buffer
,
104 ClassList
[Class
].AlignmentQUERY
);
108 if (ReturnLength
!= NULL
)
110 ProbeForWriteUlong(ReturnLength
);
112 if (ReturnLengthPtr
!= NULL
)
114 ProbeForWrite(ReturnLengthPtr
, sizeof(ULONG_PTR
), sizeof(ULONG_PTR
));
117 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
119 Status
= _SEH2_GetExceptionCode();
126 Status
= STATUS_INVALID_INFO_CLASS
;