EventInformationLength,
ReturnLength,
NULL,
- PreviousMode);
+ PreviousMode,
+ TRUE);
if(!NT_SUCCESS(Status))
{
/* Invalid buffers */
MutantInformationLength,
ResultLength,
NULL,
- PreviousMode);
+ PreviousMode,
+ TRUE);
if(!NT_SUCCESS(Status))
{
DPRINT("NtQueryMutant() failed, Status: 0x%x\n", Status);
SemaphoreInformationLength,
ReturnLength,
NULL,
- PreviousMode);
+ PreviousMode,
+ TRUE);
if (!NT_SUCCESS(Status))
{
/* Invalid buffers */
TimerInformationLength,
ReturnLength,
NULL,
- PreviousMode);
+ PreviousMode,
+ TRUE);
if (!NT_SUCCESS(Status)) return Status;
/* Get the Timer Object */
ULONG BufferLength,
PULONG ReturnLength,
PULONG_PTR ReturnLengthPtr,
- KPROCESSOR_MODE PreviousMode)
+ KPROCESSOR_MODE PreviousMode,
+ BOOLEAN CompleteProbing)
{
NTSTATUS Status = STATUS_SUCCESS;
{
if (Buffer != NULL)
{
- ProbeForWrite(Buffer,
- BufferLength,
- ClassList[Class].AlignmentQUERY);
+ if (!CompleteProbing)
+ {
+ ProbeForRead(Buffer,
+ BufferLength,
+ ClassList[Class].AlignmentQUERY);
+ }
+ else
+ {
+ ProbeForWrite(Buffer,
+ BufferLength,
+ ClassList[Class].AlignmentQUERY);
+ }
}
if (ReturnLength != NULL)
(
PROCESS_BASIC_INFORMATION,
ULONG,
- ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE
+ ICIF_QUERY
),
/* ProcessQuotaLimits */
(
QUOTA_LIMITS,
ULONG,
- ICIF_QUERY | ICIF_SET | ICIF_SIZE_VARIABLE
+ ICIF_QUERY | ICIF_SET
),
/* ProcessIoCounters */
(
IO_COUNTERS,
ULONG,
- ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE
+ ICIF_QUERY
),
/* ProcessVmCounters */
(
KERNEL_USER_TIMES,
ULONG,
- ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE
+ ICIF_QUERY
),
/* ProcessBasePriority */
(
KPRIORITY,
ULONG,
- ICIF_SET | ICIF_SET_SIZE_VARIABLE
+ ICIF_SET
),
/* ProcessRaisePriority */
(
ULONG,
ULONG,
- ICIF_SET | ICIF_SET_SIZE_VARIABLE
+ ICIF_SET
),
/* ProcessDebugPort */
(
HANDLE,
ULONG,
- ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE
+ ICIF_QUERY
),
/* ProcessExceptionPort */
(
HANDLE,
ULONG,
- ICIF_SET | ICIF_SET_SIZE_VARIABLE
+ ICIF_SET
),
/* ProcessAccessToken */
(
PROCESS_ACCESS_TOKEN,
ULONG,
- ICIF_SET | ICIF_SET_SIZE_VARIABLE
+ ICIF_SET
),
/* ProcessLdtInformation */
(
PROCESS_LDT_INFORMATION,
ULONG,
- ICIF_QUERY | ICIF_SET | ICIF_SIZE_VARIABLE
+ ICIF_QUERY | ICIF_SET
),
/* ProcessLdtSize */
(
PROCESS_LDT_SIZE,
ULONG,
- ICIF_SET | ICIF_SET_SIZE_VARIABLE
+ ICIF_SET
),
/* ProcessDefaultHardErrorMode */
(
ULONG,
ULONG,
- ICIF_QUERY | ICIF_SET | ICIF_SIZE_VARIABLE
+ ICIF_QUERY | ICIF_SET
),
/* ProcessIoPortHandlers */
(
UCHAR,
ULONG,
- ICIF_SET | ICIF_SET_SIZE_VARIABLE
+ ICIF_SET
),
/* ProcessPooledUsageAndLimits */
(
POOLED_USAGE_AND_LIMITS,
ULONG,
- ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE
+ ICIF_QUERY
),
/* ProcessWorkingSetWatch */
(
PROCESS_WS_WATCH_INFORMATION,
ULONG,
- ICIF_QUERY | ICIF_SET | ICIF_SIZE_VARIABLE
+ ICIF_QUERY | ICIF_SET | ICIF_SET_SIZE_VARIABLE
),
/* ProcessUserModeIOPL */
(
UCHAR,
ULONG,
- ICIF_SET | ICIF_SET_SIZE_VARIABLE
+ ICIF_SET
),
/* ProcessEnableAlignmentFaultFixup */
IQS
(
- CHAR,
+ BOOLEAN,
CHAR,
BOOLEAN,
- UCHAR,
- ICIF_SET | ICIF_SET_SIZE_VARIABLE
+ CHAR,
+ ICIF_SET
),
/* ProcessPriorityClass */
ULONG,
PROCESS_PRIORITY_CLASS,
CHAR,
- ICIF_QUERY | ICIF_SET | ICIF_SIZE_VARIABLE
+ ICIF_QUERY | ICIF_SET
),
/* ProcessWx86Information */
(
ULONG,
ULONG,
- ICIF_QUERY | ICIF_SET | ICIF_SIZE_VARIABLE
+ ICIF_QUERY | ICIF_SET
),
/* ProcessHandleCount */
(
ULONG,
ULONG,
- ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE
+ ICIF_QUERY
),
/* ProcessAffinityMask */
(
KAFFINITY,
ULONG,
- ICIF_SET | ICIF_SET_SIZE_VARIABLE
+ ICIF_SET
),
/* ProcessPriorityBoost */
(
ULONG,
ULONG,
- ICIF_QUERY | ICIF_SET | ICIF_SIZE_VARIABLE
+ ICIF_QUERY | ICIF_SET
),
/* ProcessDeviceMap */
ULONG,
RTL_FIELD_TYPE(PROCESS_DEVICEMAP_INFORMATION, Set),
ULONG,
- ICIF_QUERY | ICIF_SET | ICIF_SIZE_VARIABLE
+ ICIF_QUERY | ICIF_SET
),
/* ProcessSessionInformation */
(
PROCESS_SESSION_INFORMATION,
ULONG,
- ICIF_QUERY | ICIF_SET | ICIF_SIZE_VARIABLE
+ ICIF_QUERY | ICIF_SET
),
/* ProcessForegroundInformation */
CHAR,
CHAR,
BOOLEAN,
- UCHAR,
- ICIF_SET | ICIF_SET_SIZE_VARIABLE
+ CHAR,
+ ICIF_SET
),
/* ProcessWow64Information */
(
ULONG,
ULONG,
- ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE
+ ICIF_QUERY
),
/* ProcessImageFileName */
(
ULONG,
ULONG,
- ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE
+ ICIF_QUERY
),
/* ProcessBreakOnTermination */
(
ULONG,
ULONG,
- ICIF_QUERY | ICIF_SET | ICIF_SIZE_VARIABLE
+ ICIF_QUERY | ICIF_SET
),
/* ProcessDebugObjectHandle */
(
HANDLE,
ULONG,
- ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE
+ ICIF_QUERY
),
/* ProcessDebugFlags */
(
ULONG,
ULONG,
- ICIF_QUERY | ICIF_SET | ICIF_SIZE_VARIABLE
+ ICIF_QUERY | ICIF_SET
),
/* ProcessHandleTracing */
IQS
(
PROCESS_HANDLE_TRACING_QUERY,
- CHAR,
ULONG,
ULONG,
- ICIF_QUERY | ICIF_SET | ICIF_SIZE_VARIABLE
+ ULONG,
+ ICIF_QUERY | ICIF_SET
),
/* ProcessIoPriority */
(
ULONG,
ULONG,
- ICIF_QUERY | ICIF_SET | ICIF_SIZE_VARIABLE
+ ICIF_QUERY | ICIF_SET
),
/* ProcessTlsInformation */
(
ULONG,
ULONG,
- ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE
+ ICIF_QUERY
),
/* ProcessImageInformation */
(
SECTION_IMAGE_INFORMATION,
ULONG,
- ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE
+ ICIF_QUERY
),
/* ProcessCycleTime */
(
THREAD_BASIC_INFORMATION,
ULONG,
- ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE
+ ICIF_QUERY
),
/* ThreadTimes */
(
KERNEL_USER_TIMES,
ULONG,
- ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE
+ ICIF_QUERY
),
/* ThreadPriority */
(
KPRIORITY,
ULONG,
- ICIF_SET | ICIF_SET_SIZE_VARIABLE
+ ICIF_SET
),
/* ThreadBasePriority */
(
LONG,
ULONG,
- ICIF_SET | ICIF_SET_SIZE_VARIABLE
+ ICIF_SET
),
/* ThreadAffinityMask */
(
KAFFINITY,
ULONG,
- ICIF_SET | ICIF_SET_SIZE_VARIABLE
+ ICIF_SET
),
/* ThreadImpersonationToken */
(
HANDLE,
ULONG,
- ICIF_SET | ICIF_SET_SIZE_VARIABLE
+ ICIF_SET
),
/* ThreadDescriptorTableEntry is only implemented in x86 as well as the descriptor entry */
(
DESCRIPTOR_TABLE_ENTRY,
ULONG,
- ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE
+ ICIF_QUERY
),
#else
IQS_NONE,
CHAR,
BOOLEAN,
UCHAR,
- ICIF_SET | ICIF_SET_SIZE_VARIABLE
+ ICIF_SET
),
/* ThreadEventPair_Reusable */
ULONG,
ULONG_PTR,
ULONG,
- ICIF_QUERY | ICIF_SET | ICIF_SIZE_VARIABLE
+ ICIF_QUERY | ICIF_SET
),
/* ThreadZeroTlsCell */
(
ULONG_PTR,
ULONG,
- ICIF_SET | ICIF_SIZE_VARIABLE
+ ICIF_SET
),
/* ThreadPerformanceCount */
(
LARGE_INTEGER,
ULONG,
- ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE
+ ICIF_QUERY
),
/* ThreadAmILastThread */
(
ULONG,
ULONG,
- ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE
+ ICIF_QUERY
),
/* ThreadIdealProcessor */
(
ULONG_PTR,
ULONG,
- ICIF_SET | ICIF_SIZE_VARIABLE
+ ICIF_SET
),
/* ThreadPriorityBoost */
ULONG,
ULONG_PTR,
ULONG,
- ICIF_QUERY | ICIF_SET | ICIF_SIZE_VARIABLE
+ ICIF_QUERY | ICIF_SET
),
/* ThreadSetTlsArrayAddress */
(
ULONG,
ULONG,
- ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE
+ ICIF_QUERY
),
/* ThreadHideFromDebugger */
(
ULONG,
ULONG,
- ICIF_QUERY | ICIF_SET | ICIF_SIZE_VARIABLE
+ ICIF_QUERY | ICIF_SET
),
/* ThreadSwitchLegacyState */
(
ULONG,
ULONG,
- ICIF_SET | ICIF_SET_SIZE_VARIABLE
+ ICIF_SET
),
/* ThreadIsTerminated */
(
ULONG,
ULONG,
- ICIF_QUERY | ICIF_QUERY_SIZE_VARIABLE
+ ICIF_QUERY
),
/* ThreadLastSystemCall */
#include "internal/probe.h"
#include "resource.h"
+/* Internal Ps alignment probing header */
+#include "internal/ps_i.h"
+
#ifdef _MSC_VER
# pragma section("INITDATA", read,write,discard)
#endif
IoCompletionInformationLength,
ResultLength,
NULL,
- PreviousMode);
+ PreviousMode,
+ TRUE);
if (!NT_SUCCESS(Status)) return Status;
/* Get the Object */
ULONG Flags;
PAGED_CODE();
- /* Check for user-mode caller */
- if (PreviousMode != KernelMode)
+ /* Verify Information Class validity */
+ Status = DefaultQueryInfoBufferCheck(ProcessInformationClass,
+ PsProcessInfoClass,
+ RTL_NUMBER_OF(PsProcessInfoClass),
+ ProcessInformation,
+ ProcessInformationLength,
+ ReturnLength,
+ NULL,
+ PreviousMode,
+ FALSE);
+ if (!NT_SUCCESS(Status))
{
- /* Prepare to probe parameters */
- _SEH2_TRY
- {
- /* Probe the buffer */
- ProbeForRead(ProcessInformation,
- ProcessInformationLength,
- sizeof(ULONG));
-
- /* Probe the return length if required */
- if (ReturnLength) ProbeForWriteUlong(ReturnLength);
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- /* Return the exception code */
- _SEH2_YIELD(return _SEH2_GetExceptionCode());
- }
- _SEH2_END;
+ DPRINT1("NtQueryInformationProcess(): Information verification class failed! (Status -> 0x%lx, ProcessInformationClass -> %lx)\n", Status, ProcessInformationClass);
+ return Status;
}
if (((ProcessInformationClass == ProcessCookie) ||
/* Per-process security cookie */
case ProcessCookie:
+ if (ProcessInformationLength != sizeof(ULONG))
+ {
+ /* Length size wrong, bail out */
+ Status = STATUS_INFO_LENGTH_MISMATCH;
+ break;
+ }
+
/* Get the current process and cookie */
Process = PsGetCurrentProcess();
Cookie = Process->Cookie;
PAGED_CODE();
/* Verify Information Class validity */
-#if 0
Status = DefaultSetInfoBufferCheck(ProcessInformationClass,
PsProcessInfoClass,
RTL_NUMBER_OF(PsProcessInfoClass),
ProcessInformation,
ProcessInformationLength,
PreviousMode);
- if (!NT_SUCCESS(Status)) return Status;
-#endif
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("NtSetInformationProcess(): Information verification class failed! (Status -> 0x%lx, ProcessInformationClass -> %lx)\n", Status, ProcessInformationClass);
+ return Status;
+ }
/* Check what class this is */
Access = PROCESS_SET_INFORMATION;
case ProcessEnableAlignmentFaultFixup:
/* Check buffer length */
- if (ProcessInformationLength != sizeof(ULONG))
+ if (ProcessInformationLength != sizeof(BOOLEAN))
{
Status = STATUS_INFO_LENGTH_MISMATCH;
break;
PAGED_CODE();
/* Verify Information Class validity */
-#if 0
Status = DefaultSetInfoBufferCheck(ThreadInformationClass,
PsThreadInfoClass,
RTL_NUMBER_OF(PsThreadInfoClass),
ThreadInformation,
ThreadInformationLength,
PreviousMode);
- if (!NT_SUCCESS(Status)) return Status;
-#endif
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("NtSetInformationThread(): Information verification class failed! (Status -> 0x%lx, ThreadInformationClass -> %lx)\n", Status, ThreadInformationClass);
+ return Status;
+ }
/* Check what kind of information class this is */
switch (ThreadInformationClass)
ULONG ThreadTerminated;
PAGED_CODE();
- /* Check if we were called from user mode */
- if (PreviousMode != KernelMode)
+ /* Verify Information Class validity */
+ Status = DefaultQueryInfoBufferCheck(ThreadInformationClass,
+ PsThreadInfoClass,
+ RTL_NUMBER_OF(PsThreadInfoClass),
+ ThreadInformation,
+ ThreadInformationLength,
+ ReturnLength,
+ NULL,
+ PreviousMode,
+ FALSE);
+ if (!NT_SUCCESS(Status))
{
- /* Enter SEH */
- _SEH2_TRY
- {
- /* Probe the buffer */
- ProbeForWrite(ThreadInformation,
- ThreadInformationLength,
- sizeof(ULONG));
-
- /* Probe the return length if required */
- if (ReturnLength) ProbeForWriteUlong(ReturnLength);
- }
- _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
- {
- /* Return the exception code */
- _SEH2_YIELD(return _SEH2_GetExceptionCode());
- }
- _SEH2_END;
+ DPRINT1("NtQueryInformationThread(): Information verification class failed! (Status -> 0x%lx , ThreadInformationClass -> %lx)\n", Status, ThreadInformationClass);
+ return Status;
}
/* Check what class this is */
TokenInformationLength,
ReturnLength,
NULL,
- PreviousMode);
+ PreviousMode,
+ TRUE);
if (!NT_SUCCESS(Status))
{
DPRINT("NtQueryInformationToken() failed, Status: 0x%x\n", Status);
SIZE_T PagefileLimit;
} POOLED_USAGE_AND_LIMITS, *PPOOLED_USAGE_AND_LIMITS;
-typedef struct _PROCESS_LDT_INFORMATION
-{
- ULONG Start;
- ULONG Length;
- LDT_ENTRY LdtEntries[ANYSIZE_ARRAY];
-} PROCESS_LDT_INFORMATION, *PPROCESS_LDT_INFORMATION;
-
-typedef struct _PROCESS_LDT_SIZE
-{
- ULONG Length;
-} PROCESS_LDT_SIZE, *PPROCESS_LDT_SIZE;
-
typedef struct _PROCESS_WS_WATCH_INFORMATION
{
PVOID FaultingPc;
#endif
+typedef struct _PROCESS_LDT_INFORMATION
+{
+ ULONG Start;
+ ULONG Length;
+ LDT_ENTRY LdtEntries[ANYSIZE_ARRAY];
+} PROCESS_LDT_INFORMATION, *PPROCESS_LDT_INFORMATION;
+
+typedef struct _PROCESS_LDT_SIZE
+{
+ ULONG Length;
+} PROCESS_LDT_SIZE, *PPROCESS_LDT_SIZE;
+
typedef struct _PROCESS_PRIORITY_CLASS
{
BOOLEAN Foreground;