{
return STATUS_INFO_LENGTH_MISMATCH;
}
+
+ if (!SeSinglePrivilegeCheck(SeDebugPrivilege, ExGetPreviousMode()))
+ {
+ return STATUS_ACCESS_DENIED;
+ }
+
NtGlobalFlag = ((PSYSTEM_FLAGS_INFORMATION) Buffer)->Flags;
return STATUS_SUCCESS;
}
return STATUS_PRIVILEGE_NOT_HELD;
}
- _SEH2_TRY
- {
- ProbeForWriteUlong(Buffer);
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- _SEH2_YIELD(return _SEH2_GetExceptionCode());
- }
- _SEH2_END;
+ ProbeForWriteUlong(Buffer);
}
Status = MmSessionCreate(&SessionId);
- if (NT_SUCCESS(Status))
- {
- _SEH2_TRY
- {
- *(PULONG)Buffer = SessionId;
- }
- _SEH2_EXCEPT(ExSystemExceptionFilter())
- {
- Status = _SEH2_GetExceptionCode();
- }
- _SEH2_END;
- }
+ if (NT_SUCCESS(Status)) *(PULONG)Buffer = SessionId;
return Status;
}
{
return STATUS_PRIVILEGE_NOT_HELD;
}
-
- _SEH2_TRY
- {
- SessionId = ProbeForReadUlong(Buffer);
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- _SEH2_YIELD(return _SEH2_GetExceptionCode());
- }
- _SEH2_END;
- }
- else
- {
- SessionId = *(PULONG)Buffer;
}
+ SessionId = *(PULONG)Buffer;
+
return MmSessionDelete(SessionId);
}
&ResultLength);
/* Save the result length to the caller */
- if (UnsafeResultLength)
+ if (NT_SUCCESS(FStatus) && UnsafeResultLength)
*UnsafeResultLength = ResultLength;
}
}
IN PVOID SystemInformation,
IN ULONG SystemInformationLength)
{
+ NTSTATUS Status = STATUS_INVALID_INFO_CLASS;
+ KPROCESSOR_MODE PreviousMode;
+
PAGED_CODE();
- /*
- * If called from user mode, check
- * possible unsafe arguments.
- */
-#if 0
- if (KernelMode != KeGetPreviousMode())
- {
- // Check arguments
- //ProbeForWrite(
- // SystemInformation,
- // Length
- // );
- //ProbeForWrite(
- // ResultLength,
- // sizeof (ULONG)
- // );
- }
-#endif
- /*
- * Check the request is valid.
- */
- if ((SystemInformationClass >= MIN_SYSTEM_INFO_CLASS) &&
- (SystemInformationClass < MAX_SYSTEM_INFO_CLASS))
+ PreviousMode = ExGetPreviousMode();
+
+ _SEH2_TRY
{
- if (NULL != CallQS [SystemInformationClass].Set)
+ /*
+ * If called from user mode, check
+ * possible unsafe arguments.
+ */
+ if (PreviousMode != KernelMode)
{
- /*
- * Hand the request to a subhandler.
- */
- return CallQS [SystemInformationClass].Set(SystemInformation,
- SystemInformationLength);
+ ProbeForRead(SystemInformation, SystemInformationLength, sizeof(ULONG));
}
+
+ /*
+ * Check the request is valid.
+ */
+ if ((SystemInformationClass >= MIN_SYSTEM_INFO_CLASS) &&
+ (SystemInformationClass < MAX_SYSTEM_INFO_CLASS))
+ {
+ if (NULL != CallQS [SystemInformationClass].Set)
+ {
+ /*
+ * Hand the request to a subhandler.
+ */
+ Status = CallQS [SystemInformationClass].Set(SystemInformation,
+ SystemInformationLength);
+ }
+ }
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ Status = _SEH2_GetExceptionCode();
}
+ _SEH2_END;
- return STATUS_INVALID_INFO_CLASS;
+ return Status;
}
NTSTATUS