convert DefaultSetInfoBufferCheck and DefaultQueryInfoBufferCheck to
inlined functions
Modified: trunk/reactos/ntoskrnl/ex/event.c
Modified: trunk/reactos/ntoskrnl/ex/mutant.c
Modified: trunk/reactos/ntoskrnl/ex/sem.c
Modified: trunk/reactos/ntoskrnl/ex/timer.c
Modified: trunk/reactos/ntoskrnl/include/internal/ntoskrnl.h
Modified: trunk/reactos/ntoskrnl/include/internal/ob.h
Modified: trunk/reactos/ntoskrnl/io/iocomp.c
Modified: trunk/reactos/ntoskrnl/mm/section.c
Modified: trunk/reactos/ntoskrnl/ps/query.c
Modified: trunk/reactos/ntoskrnl/se/token.c
_____
Modified: trunk/reactos/ntoskrnl/ex/event.c
--- trunk/reactos/ntoskrnl/ex/event.c 2005-10-10 13:03:09 UTC (rev
18393)
+++ trunk/reactos/ntoskrnl/ex/event.c 2005-10-10 13:03:55 UTC (rev
18394)
@@ -311,13 +311,13 @@
DPRINT("NtQueryEvent(0x%p, 0x%x)\n", EventHandle,
EventInformationClass);
/* Check buffers and class validity */
- DefaultQueryInfoBufferCheck(EventInformationClass,
- ExEventInfoClass,
- EventInformation,
- EventInformationLength,
- ReturnLength,
- PreviousMode,
- &Status);
+ Status = DefaultQueryInfoBufferCheck(EventInformationClass,
+ ExEventInfoClass,
+ sizeof(ExEventInfoClass) /
sizeof(ExEventInfoClass[0]),
+ EventInformation,
+ EventInformationLength,
+ ReturnLength,
+ PreviousMode);
if(!NT_SUCCESS(Status)) {
/* Invalid buffers */
_____
Modified: trunk/reactos/ntoskrnl/ex/mutant.c
--- trunk/reactos/ntoskrnl/ex/mutant.c 2005-10-10 13:03:09 UTC (rev
18393)
+++ trunk/reactos/ntoskrnl/ex/mutant.c 2005-10-10 13:03:55 UTC (rev
18394)
@@ -227,13 +227,13 @@
PAGED_CODE();
/* Check buffers and parameters */
- DefaultQueryInfoBufferCheck(MutantInformationClass,
- ExMutantInfoClass,
- MutantInformation,
- MutantInformationLength,
- ResultLength,
- PreviousMode,
- &Status);
+ Status = DefaultQueryInfoBufferCheck(MutantInformationClass,
+ ExMutantInfoClass,
+ sizeof(ExMutantInfoClass) /
sizeof(ExMutantInfoClass[0]),
+ MutantInformation,
+ MutantInformationLength,
+ ResultLength,
+ PreviousMode);
if(!NT_SUCCESS(Status)) {
DPRINT("NtQueryMutant() failed, Status: 0x%x\n", Status);
_____
Modified: trunk/reactos/ntoskrnl/ex/sem.c
--- trunk/reactos/ntoskrnl/ex/sem.c 2005-10-10 13:03:09 UTC (rev
18393)
+++ trunk/reactos/ntoskrnl/ex/sem.c 2005-10-10 13:03:55 UTC (rev
18394)
@@ -215,13 +215,13 @@
PAGED_CODE();
/* Check buffers and class validity */
- DefaultQueryInfoBufferCheck(SemaphoreInformationClass,
- ExSemaphoreInfoClass,
- SemaphoreInformation,
- SemaphoreInformationLength,
- ReturnLength,
- PreviousMode,
- &Status);
+ Status = DefaultQueryInfoBufferCheck(SemaphoreInformationClass,
+ ExSemaphoreInfoClass,
+ sizeof(ExSemaphoreInfoClass) /
sizeof(ExSemaphoreInfoClass[0]),
+ SemaphoreInformation,
+ SemaphoreInformationLength,
+ ReturnLength,
+ PreviousMode);
if(!NT_SUCCESS(Status))
{
/* Invalid buffers */
_____
Modified: trunk/reactos/ntoskrnl/ex/timer.c
--- trunk/reactos/ntoskrnl/ex/timer.c 2005-10-10 13:03:09 UTC (rev
18393)
+++ trunk/reactos/ntoskrnl/ex/timer.c 2005-10-10 13:03:55 UTC (rev
18394)
@@ -545,13 +545,13 @@
DPRINT("NtQueryTimer(TimerHandle: 0x%p, Class: %d)\n", TimerHandle,
TimerInformationClass);
/* Check Validity */
- DefaultQueryInfoBufferCheck(TimerInformationClass,
- ExTimerInfoClass,
- TimerInformation,
- TimerInformationLength,
- ReturnLength,
- PreviousMode,
- &Status);
+ Status = DefaultQueryInfoBufferCheck(TimerInformationClass,
+ ExTimerInfoClass,
+ sizeof(ExTimerInfoClass) /
sizeof(ExTimerInfoClass[0]),
+ TimerInformation,
+ TimerInformationLength,
+ ReturnLength,
+ PreviousMode);
if(!NT_SUCCESS(Status))
{
DPRINT1("NtQueryTimer() failed, Status: 0x%x\n", Status);
_____
Modified: trunk/reactos/ntoskrnl/include/internal/ntoskrnl.h
--- trunk/reactos/ntoskrnl/include/internal/ntoskrnl.h 2005-10-10
13:03:09 UTC (rev 18393)
+++ trunk/reactos/ntoskrnl/include/internal/ntoskrnl.h 2005-10-10
13:03:55 UTC (rev 18394)
@@ -208,6 +208,138 @@
#define ProbeForReadUlargeInteger(Ptr)
((ULARGE_INTEGER)ProbeForReadGenericType(&(Ptr)->QuadPart, ULONGLONG,
0))
/*
+ * generic information class probing code
+ */
+
+#define ICIF_QUERY 0x1
+#define ICIF_SET 0x2
+#define ICIF_QUERY_SIZE_VARIABLE 0x4
+#define ICIF_SET_SIZE_VARIABLE 0x8
+#define ICIF_SIZE_VARIABLE (ICIF_QUERY_SIZE_VARIABLE |
ICIF_SET_SIZE_VARIABLE)
+
+typedef struct _INFORMATION_CLASS_INFO
+{
+ ULONG RequiredSizeQUERY;
+ ULONG RequiredSizeSET;
+ ULONG AlignmentSET;
+ ULONG AlignmentQUERY;
+ ULONG Flags;
+} INFORMATION_CLASS_INFO, *PINFORMATION_CLASS_INFO;
+
+#define ICI_SQ_SAME(Size, Alignment, Flags)
\
+ { Size, Size, Alignment, Alignment, Flags }
+
+#define ICI_SQ(SizeQuery, SizeSet, AlignmentQuery, AlignmentSet, Flags)
\
+ { SizeQuery, SizeSet, AlignmentQuery, AlignmentSet, Flags }
+
+static inline NTSTATUS
+DefaultSetInfoBufferCheck(UINT Class,
+ const INFORMATION_CLASS_INFO *ClassList,
+ UINT ClassListEntries,
+ PVOID Buffer,
+ ULONG BufferLength,
+ KPROCESSOR_MODE PreviousMode)
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+
+ if (Class >= 0 && Class < ClassListEntries)
+ {
+ if (!(ClassList[Class].Flags & ICIF_SET))
+ {
+ Status = STATUS_INVALID_INFO_CLASS;
+ }
+ else if (ClassList[Class].RequiredSizeSET > 0 &&
+ BufferLength != ClassList[Class].RequiredSizeSET)
+ {
+ if (!(ClassList[Class].Flags & ICIF_SET_SIZE_VARIABLE))
+ {
+ Status = STATUS_INFO_LENGTH_MISMATCH;
+ }
+ }
+
+ if (NT_SUCCESS(Status))
+ {
+ if (PreviousMode != KernelMode)
+ {
+ _SEH_TRY
+ {
+ ProbeForRead(Buffer,
+ BufferLength,
+ ClassList[Class].AlignmentSET);
+ }
+ _SEH_HANDLE
+ {
+ Status = _SEH_GetExceptionCode();
+ }
+ _SEH_END;
+ }
+ }
+ }
+ else
+ Status = STATUS_INVALID_INFO_CLASS;
+
+ return Status;
+}
+
+static inline NTSTATUS
+DefaultQueryInfoBufferCheck(UINT Class,
+ const INFORMATION_CLASS_INFO *ClassList,
+ UINT ClassListEntries,
+ PVOID Buffer,
+ ULONG BufferLength,
+ PULONG ReturnLength,
+ KPROCESSOR_MODE PreviousMode)
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+
+ if (Class >= 0 && Class < ClassListEntries)
+ {
+ if (!(ClassList[Class].Flags & ICIF_QUERY))
+ {
+ Status = STATUS_INVALID_INFO_CLASS;
+ }
+ else if (ClassList[Class].RequiredSizeQUERY > 0 &&
+ BufferLength != ClassList[Class].RequiredSizeQUERY)
+ {
+ if (!(ClassList[Class].Flags & ICIF_QUERY_SIZE_VARIABLE))
+ {
+ Status = STATUS_INFO_LENGTH_MISMATCH;
+ }
+ }
+
+ if (NT_SUCCESS(Status))
+ {
+ if (PreviousMode != KernelMode)
+ {
+ _SEH_TRY
+ {
+ if (Buffer != NULL)
+ {
+ ProbeForWrite(Buffer,
+ BufferLength,
+ ClassList[Class].AlignmentQUERY);
+ }
+
+ if (ReturnLength != NULL)
+ {
+ ProbeForWriteUlong(ReturnLength);
+ }
+ }
+ _SEH_HANDLE
+ {
+ Status = _SEH_GetExceptionCode();
+ }
+ _SEH_END;
+ }
+ }
+ }
+ else
+ Status = STATUS_INVALID_INFO_CLASS;
+
+ return Status;
+}
+
+/*
* Use IsPointerOffset to test whether a pointer should be interpreted
as an offset
* or as a pointer
*/
_____
Modified: trunk/reactos/ntoskrnl/include/internal/ob.h
--- trunk/reactos/ntoskrnl/include/internal/ob.h 2005-10-10
13:03:09 UTC (rev 18393)
+++ trunk/reactos/ntoskrnl/include/internal/ob.h 2005-10-10
13:03:55 UTC (rev 18394)
@@ -11,12 +11,6 @@
struct _EPROCESS;
-#define ICIF_QUERY 0x1
-#define ICIF_SET 0x2
-#define ICIF_QUERY_SIZE_VARIABLE 0x4
-#define ICIF_SET_SIZE_VARIABLE 0x8
-#define ICIF_SIZE_VARIABLE (ICIF_QUERY_SIZE_VARIABLE |
ICIF_SET_SIZE_VARIABLE)
-
typedef struct _DIRECTORY_OBJECT
{
CSHORT Type;
@@ -37,15 +31,6 @@
LARGE_INTEGER CreateTime;
} SYMLINK_OBJECT, *PSYMLINK_OBJECT;
-typedef struct _INFORMATION_CLASS_INFO
-{
- ULONG RequiredSizeQUERY;
- ULONG RequiredSizeSET;
- ULONG AlignmentSET;
- ULONG AlignmentQUERY;
- ULONG Flags;
-} INFORMATION_CLASS_INFO, *PINFORMATION_CLASS_INFO;
-
#define BODY_TO_HEADER(objbdy)
\
CONTAINING_RECORD((objbdy), OBJECT_HEADER, Body)
@@ -251,152 +236,6 @@
/* object information classes */
-#define ICI_SQ_SAME(Size, Alignment, Flags)
\
- { Size, Size, Alignment, Alignment, Flags }
-#define ICI_SQ(SizeQuery, SizeSet, AlignmentQuery, AlignmentSet, Flags)
\
- { SizeQuery, SizeSet, AlignmentQuery, AlignmentSet, Flags }
-#define CheckInfoClass(Class, BufferLen, ClassList, StatusVar, Mode)
\
- do {
\
- if((Class) >= 0 && (Class) < sizeof(ClassList) /
sizeof(ClassList[0])) \
- {
\
- if(!(ClassList[Class].Flags & ICIF_##Mode))
\
- {
\
- *(StatusVar) = STATUS_INVALID_INFO_CLASS;
\
- }
\
- else if(ClassList[Class].RequiredSize##Mode > 0 &&
\
- (BufferLen) != ClassList[Class].RequiredSize##Mode)
\
- {
\
- if(!(ClassList[Class].Flags & ICIF_##Mode##_SIZE_VARIABLE) &&
\
- (BufferLen) != ClassList[Class].RequiredSize##Mode)
\
- {
\
- *(StatusVar) = STATUS_INFO_LENGTH_MISMATCH;
\
- }
\
- }
\
- }
\
- else
\
- {
\
- *(StatusVar) = STATUS_INVALID_INFO_CLASS;
\
- }
\
- } while(0)
-
-
-#define GetInfoClassAlignment(Class, ClassList, AlignmentVar, Mode)
\
- do {
\
- if((Class) >= 0 && (Class) < sizeof(ClassList) /
sizeof(ClassList[0])) \
- {
\
- *(AlignmentVar) = ClassList[Class].Alignment##Mode;
\
- }
\
- else
\
- {
\
- *(AlignmentVar) = sizeof(ULONG);
\
- }
\
- } while(0)
-
-#define ProbeQueryInfoBuffer(Buffer, BufferLen, Alignment, RetLen,
PrevMode, StatusVar) \
- do {
\
- if(PrevMode != KernelMode)
\
- {
\
- _SEH_TRY
\
- {
\
- ProbeForWrite(Buffer,
\
- BufferLen,
\
- Alignment);
\
- if(RetLen != NULL)
\
- {
\
- ProbeForWrite(RetLen,
\
- sizeof(ULONG),
\
- 1);
\
- }
\
- }
\
- _SEH_HANDLE
\
- {
\
- *(StatusVar) = _SEH_GetExceptionCode();
\
- }
\
- _SEH_END;
\
-
\
- if(!NT_SUCCESS(*(StatusVar)))
\
- {
\
- DPRINT1("ProbeQueryInfoBuffer failed: 0x%x\n", *(StatusVar));
\
- return *(StatusVar);
\
- }
\
- }
\
- } while(0)
-
-#define ProbeSetInfoBuffer(Buffer, BufferLen, Alignment, PrevMode,
StatusVar) \
- do {
\
- if(PrevMode != KernelMode)
\
- {
\
- _SEH_TRY
\
- {
\
- ProbeForRead(Buffer,
\
- BufferLen,
\
- Alignment);
\
- }
\
- _SEH_HANDLE
\
- {
\
- *(StatusVar) = _SEH_GetExceptionCode();
\
- }
\
- _SEH_END;
\
-
\
- if(!NT_SUCCESS(*(StatusVar)))
\
- {
\
- DPRINT1("ProbeAllInfoBuffer failed: 0x%x\n", *(StatusVar));
\
- return *(StatusVar);
\
- }
\
- }
\
- } while(0)
-
-#define DefaultSetInfoBufferCheck(Class, ClassList, Buffer, BufferLen,
PrevMode, StatusVar) \
- do {
\
- ULONG _Alignment;
\
- /* get the preferred alignment for the information class or return */
\
- /* default alignment in case the class doesn't exist */
\
- GetInfoClassAlignment(Class,
\
- ClassList,
\
- &_Alignment,
\
- SET);
\
-
\
- /* probe the ENTIRE buffers and return on failure */
\
- ProbeSetInfoBuffer(Buffer,
\
- BufferLen,
\
- _Alignment,
\
- PrevMode,
\
- StatusVar);
\
-
\
- /* validate information class index and check buffer size */
\
- CheckInfoClass(Class,
\
- BufferLen,
\
- ClassList,
\
- StatusVar,
\
- SET);
\
- } while(0)
-
-#define DefaultQueryInfoBufferCheck(Class, ClassList, Buffer,
BufferLen, RetLen, PrevMode, StatusVar) \
- do {
\
- ULONG _Alignment;
\
- /* get the preferred alignment for the information class or return
*/ \
- /* alignment in case the class doesn't exist */
\
- GetInfoClassAlignment(Class,
\
- ClassList,
\
- &_Alignment,
\
- QUERY);
\
-
\
- /* probe the ENTIRE buffers and return on failure */
\
- ProbeQueryInfoBuffer(Buffer,
\
- BufferLen,
\
- _Alignment,
\
- RetLen,
\
- PrevMode,
\
- StatusVar);
\
-
\
- /* validate information class index and check buffer size */
\
- CheckInfoClass(Class,
\
- BufferLen,
\
- ClassList,
\
- StatusVar,
\
- QUERY);
\
- } while(0)
-
#endif /* __INCLUDE_INTERNAL_OBJMGR_H */
_____
Modified: trunk/reactos/ntoskrnl/io/iocomp.c
--- trunk/reactos/ntoskrnl/io/iocomp.c 2005-10-10 13:03:09 UTC (rev
18393)
+++ trunk/reactos/ntoskrnl/io/iocomp.c 2005-10-10 13:03:55 UTC (rev
18394)
@@ -359,13 +359,13 @@
PAGED_CODE();
/* Check buffers and parameters */
- DefaultQueryInfoBufferCheck(IoCompletionInformationClass,
- IoCompletionInfoClass,
- IoCompletionInformation,
- IoCompletionInformationLength,
- ResultLength,
- PreviousMode,
- &Status);
+ Status = DefaultQueryInfoBufferCheck(IoCompletionInformationClass,
+ IoCompletionInfoClass,
+ sizeof(IoCompletionInfoClass)
/ sizeof(IoCompletionInfoClass[0]),
+ IoCompletionInformation,
+ IoCompletionInformationLength,
+ ResultLength,
+ PreviousMode);
if(!NT_SUCCESS(Status)) {
DPRINT1("NtQueryMutant() failed, Status: 0x%x\n", Status);
_____
Modified: trunk/reactos/ntoskrnl/mm/section.c
--- trunk/reactos/ntoskrnl/mm/section.c 2005-10-10 13:03:09 UTC (rev
18393)
+++ trunk/reactos/ntoskrnl/mm/section.c 2005-10-10 13:03:55 UTC (rev
18394)
@@ -4012,13 +4012,13 @@
PreviousMode = ExGetPreviousMode();
- DefaultQueryInfoBufferCheck(SectionInformationClass,
- ExSectionInfoClass,
- SectionInformation,
- SectionInformationLength,
- ResultLength,
- PreviousMode,
- &Status);
+ Status = DefaultQueryInfoBufferCheck(SectionInformationClass,
+ ExSectionInfoClass,
+ sizeof(ExSectionInfoClass) /
sizeof(ExSectionInfoClass[0]),
+ SectionInformation,
+ SectionInformationLength,
+ ResultLength,
+ PreviousMode);
if(!NT_SUCCESS(Status))
{
_____
Modified: trunk/reactos/ntoskrnl/ps/query.c
--- trunk/reactos/ntoskrnl/ps/query.c 2005-10-10 13:03:09 UTC (rev
18393)
+++ trunk/reactos/ntoskrnl/ps/query.c 2005-10-10 13:03:55 UTC (rev
18394)
@@ -143,13 +143,13 @@
PreviousMode = ExGetPreviousMode();
- DefaultQueryInfoBufferCheck(ProcessInformationClass,
- PsProcessInfoClass,
- ProcessInformation,
- ProcessInformationLength,
- ReturnLength,
- PreviousMode,
- &Status);
+ Status = DefaultQueryInfoBufferCheck(ProcessInformationClass,
+ PsProcessInfoClass,
+ sizeof(PsProcessInfoClass) /
sizeof(PsProcessInfoClass[0]),
+ ProcessInformation,
+ ProcessInformationLength,
+ ReturnLength,
+ PreviousMode);
if(!NT_SUCCESS(Status))
{
DPRINT1("NtQueryInformationProcess() failed, Status: 0x%x\n",
Status);
@@ -654,12 +654,12 @@
PreviousMode = ExGetPreviousMode();
- DefaultSetInfoBufferCheck(ProcessInformationClass,
- PsProcessInfoClass,
- ProcessInformation,
- ProcessInformationLength,
- PreviousMode,
- &Status);
+ Status = DefaultSetInfoBufferCheck(ProcessInformationClass,
+ PsProcessInfoClass,
+ sizeof(PsProcessInfoClass) /
sizeof(PsProcessInfoClass[0]),
+ ProcessInformation,
+ ProcessInformationLength,
+ PreviousMode);
if(!NT_SUCCESS(Status))
{
DPRINT1("NtSetInformationProcess() %d %x %x called\n",
ProcessInformationClass, ProcessInformation, ProcessInformationLength);
_____
Modified: trunk/reactos/ntoskrnl/se/token.c
--- trunk/reactos/ntoskrnl/se/token.c 2005-10-10 13:03:09 UTC (rev
18393)
+++ trunk/reactos/ntoskrnl/se/token.c 2005-10-10 13:03:55 UTC (rev
18394)
@@ -615,13 +615,13 @@
PreviousMode = ExGetPreviousMode();
/* Check buffers and class validity */
- DefaultQueryInfoBufferCheck(TokenInformationClass,
- SeTokenInformationClass,
- TokenInformation,
- TokenInformationLength,
- ReturnLength,
- PreviousMode,
- &Status);
+ Status = DefaultQueryInfoBufferCheck(TokenInformationClass,
+ SeTokenInformationClass,
+ sizeof(SeTokenInformationClass)
/ sizeof(SeTokenInformationClass[0]),
+ TokenInformation,
+ TokenInformationLength,
+ ReturnLength,
+ PreviousMode);
if(!NT_SUCCESS(Status))
{
@@ -1198,12 +1198,12 @@
PreviousMode = ExGetPreviousMode();
- DefaultSetInfoBufferCheck(TokenInformationClass,
- SeTokenInformationClass,
- TokenInformation,
- TokenInformationLength,
- PreviousMode,
- &Status);
+ Status = DefaultSetInfoBufferCheck(TokenInformationClass,
+ SeTokenInformationClass,
+ sizeof(SeTokenInformationClass) /
sizeof(SeTokenInformationClass[0]),
+ TokenInformation,
+ TokenInformationLength,
+ PreviousMode);
if(!NT_SUCCESS(Status))
{