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
)
68 NTSTATUS Status
= STATUS_SUCCESS
;
70 if (Class
< ClassListEntries
)
72 if (!(ClassList
[Class
].Flags
& ICIF_QUERY
))
74 Status
= STATUS_INVALID_INFO_CLASS
;
76 else if (ClassList
[Class
].RequiredSizeQUERY
> 0 &&
77 BufferLength
!= ClassList
[Class
].RequiredSizeQUERY
)
79 if (!(ClassList
[Class
].Flags
& ICIF_QUERY_SIZE_VARIABLE
))
81 Status
= STATUS_INFO_LENGTH_MISMATCH
;
85 if (NT_SUCCESS(Status
))
87 if (PreviousMode
!= KernelMode
)
95 ClassList
[Class
].AlignmentQUERY
);
98 if (ReturnLength
!= NULL
)
100 ProbeForWriteUlong(ReturnLength
);
102 if (ReturnLengthPtr
!= NULL
)
104 ProbeForWrite(ReturnLengthPtr
, sizeof(ULONG_PTR
), sizeof(ULONG_PTR
));
107 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER
)
109 Status
= _SEH2_GetExceptionCode();
116 Status
= STATUS_INVALID_INFO_CLASS
;