[NTOS:PS] Dump the process/thread information class names on debug logging

This commit is contained in:
George Bișoc
2025-11-23 01:56:56 +01:00
parent 69ad0e6996
commit f3e742ddef

View File

@@ -49,6 +49,157 @@ PsReferenceProcessFilePointer(IN PEPROCESS Process,
return Section ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL;
}
#if DBG
static
PCSTR
PspDumpProcessInfoClassName(
_In_ PROCESSINFOCLASS ProcessInformationClass)
{
static CHAR UnknownClassName[11];
#define DBG_PROCESS_INFO_CLASS(InfoClass) [InfoClass] = #InfoClass
static const PCSTR ProcessInfoClasses[] =
{
DBG_PROCESS_INFO_CLASS(ProcessBasicInformation),
DBG_PROCESS_INFO_CLASS(ProcessQuotaLimits),
DBG_PROCESS_INFO_CLASS(ProcessVmCounters),
DBG_PROCESS_INFO_CLASS(ProcessTimes),
DBG_PROCESS_INFO_CLASS(ProcessBasePriority),
DBG_PROCESS_INFO_CLASS(ProcessRaisePriority),
DBG_PROCESS_INFO_CLASS(ProcessDebugPort),
DBG_PROCESS_INFO_CLASS(ProcessExceptionPort),
DBG_PROCESS_INFO_CLASS(ProcessAccessToken),
DBG_PROCESS_INFO_CLASS(ProcessLdtInformation),
DBG_PROCESS_INFO_CLASS(ProcessLdtSize),
DBG_PROCESS_INFO_CLASS(ProcessDefaultHardErrorMode),
DBG_PROCESS_INFO_CLASS(ProcessIoPortHandlers),
DBG_PROCESS_INFO_CLASS(ProcessPooledUsageAndLimits),
DBG_PROCESS_INFO_CLASS(ProcessWorkingSetWatch),
DBG_PROCESS_INFO_CLASS(ProcessUserModeIOPL),
DBG_PROCESS_INFO_CLASS(ProcessEnableAlignmentFaultFixup),
DBG_PROCESS_INFO_CLASS(ProcessPriorityClass),
DBG_PROCESS_INFO_CLASS(ProcessWx86Information),
DBG_PROCESS_INFO_CLASS(ProcessHandleCount),
DBG_PROCESS_INFO_CLASS(ProcessAffinityMask),
DBG_PROCESS_INFO_CLASS(ProcessPriorityBoost),
DBG_PROCESS_INFO_CLASS(ProcessDeviceMap),
DBG_PROCESS_INFO_CLASS(ProcessSessionInformation),
DBG_PROCESS_INFO_CLASS(ProcessForegroundInformation),
DBG_PROCESS_INFO_CLASS(ProcessWow64Information),
DBG_PROCESS_INFO_CLASS(ProcessImageFileName),
DBG_PROCESS_INFO_CLASS(ProcessLUIDDeviceMapsEnabled),
DBG_PROCESS_INFO_CLASS(ProcessBreakOnTermination),
DBG_PROCESS_INFO_CLASS(ProcessDebugObjectHandle),
DBG_PROCESS_INFO_CLASS(ProcessDebugFlags),
DBG_PROCESS_INFO_CLASS(ProcessHandleTracing),
DBG_PROCESS_INFO_CLASS(ProcessIoPriority),
DBG_PROCESS_INFO_CLASS(ProcessExecuteFlags),
DBG_PROCESS_INFO_CLASS(ProcessTlsInformation),
DBG_PROCESS_INFO_CLASS(ProcessCookie),
DBG_PROCESS_INFO_CLASS(ProcessImageInformation),
DBG_PROCESS_INFO_CLASS(ProcessCycleTime),
DBG_PROCESS_INFO_CLASS(ProcessPagePriority),
DBG_PROCESS_INFO_CLASS(ProcessInstrumentationCallback),
DBG_PROCESS_INFO_CLASS(ProcessThreadStackAllocation),
DBG_PROCESS_INFO_CLASS(ProcessWorkingSetWatchEx),
DBG_PROCESS_INFO_CLASS(ProcessImageFileNameWin32),
DBG_PROCESS_INFO_CLASS(ProcessImageFileMapping),
DBG_PROCESS_INFO_CLASS(ProcessAffinityUpdateMode),
DBG_PROCESS_INFO_CLASS(ProcessMemoryAllocationMode),
DBG_PROCESS_INFO_CLASS(ProcessGroupInformation),
DBG_PROCESS_INFO_CLASS(ProcessConsoleHostProcess),
DBG_PROCESS_INFO_CLASS(ProcessWindowInformation),
};
#undef DBG_PROCESS_INFO_CLASS
if (ProcessInformationClass < RTL_NUMBER_OF(ProcessInfoClasses))
{
return ProcessInfoClasses[ProcessInformationClass];
}
sprintf(UnknownClassName, "%lu", ProcessInformationClass);
return UnknownClassName;
}
static
PCSTR
PspDumpThreadInfoClassName(
_In_ THREADINFOCLASS ThreadInformationClass)
{
static CHAR UnknownClassName[11];
#define DBG_THREAD_INFO_CLASS(InfoClass) [InfoClass] = #InfoClass
static const PCSTR ThreadInfoClasses[] =
{
DBG_THREAD_INFO_CLASS(ThreadBasicInformation),
DBG_THREAD_INFO_CLASS(ThreadTimes),
DBG_THREAD_INFO_CLASS(ThreadPriority),
DBG_THREAD_INFO_CLASS(ThreadBasePriority),
DBG_THREAD_INFO_CLASS(ThreadAffinityMask),
DBG_THREAD_INFO_CLASS(ThreadImpersonationToken),
DBG_THREAD_INFO_CLASS(ThreadDescriptorTableEntry),
DBG_THREAD_INFO_CLASS(ThreadEnableAlignmentFaultFixup),
DBG_THREAD_INFO_CLASS(ThreadEventPair_Reusable),
DBG_THREAD_INFO_CLASS(ThreadQuerySetWin32StartAddress),
DBG_THREAD_INFO_CLASS(ThreadZeroTlsCell),
DBG_THREAD_INFO_CLASS(ThreadPerformanceCount),
DBG_THREAD_INFO_CLASS(ThreadAmILastThread),
DBG_THREAD_INFO_CLASS(ThreadIdealProcessor),
DBG_THREAD_INFO_CLASS(ThreadPriorityBoost),
DBG_THREAD_INFO_CLASS(ThreadSetTlsArrayAddress),
DBG_THREAD_INFO_CLASS(ThreadIsIoPending),
DBG_THREAD_INFO_CLASS(ThreadHideFromDebugger),
DBG_THREAD_INFO_CLASS(ThreadBreakOnTermination),
DBG_THREAD_INFO_CLASS(ThreadSwitchLegacyState),
DBG_THREAD_INFO_CLASS(ThreadIsTerminated),
DBG_THREAD_INFO_CLASS(ThreadLastSystemCall),
DBG_THREAD_INFO_CLASS(ThreadIoPriority),
DBG_THREAD_INFO_CLASS(ThreadCycleTime),
DBG_THREAD_INFO_CLASS(ThreadPagePriority),
DBG_THREAD_INFO_CLASS(ThreadActualBasePriority),
DBG_THREAD_INFO_CLASS(ThreadTebInformation),
DBG_THREAD_INFO_CLASS(ThreadCSwitchMon),
DBG_THREAD_INFO_CLASS(ThreadCSwitchPmu),
DBG_THREAD_INFO_CLASS(ThreadWow64Context),
DBG_THREAD_INFO_CLASS(ThreadGroupInformation),
DBG_THREAD_INFO_CLASS(ThreadUmsInformation),
DBG_THREAD_INFO_CLASS(ThreadCounterProfiling),
DBG_THREAD_INFO_CLASS(ThreadIdealProcessorEx),
DBG_THREAD_INFO_CLASS(ThreadCpuAccountingInformation),
DBG_THREAD_INFO_CLASS(ThreadSuspendCount),
DBG_THREAD_INFO_CLASS(ThreadHeterogeneousCpuPolicy),
DBG_THREAD_INFO_CLASS(ThreadContainerId),
DBG_THREAD_INFO_CLASS(ThreadNameInformation),
DBG_THREAD_INFO_CLASS(ThreadSelectedCpuSets),
DBG_THREAD_INFO_CLASS(ThreadSystemThreadInformation),
DBG_THREAD_INFO_CLASS(ThreadActualGroupAffinity),
DBG_THREAD_INFO_CLASS(ThreadDynamicCodePolicyInfo),
DBG_THREAD_INFO_CLASS(ThreadExplicitCaseSensitivity),
DBG_THREAD_INFO_CLASS(ThreadWorkOnBehalfTicket),
DBG_THREAD_INFO_CLASS(ThreadSubsystemInformation),
DBG_THREAD_INFO_CLASS(ThreadDbgkWerReportActive),
DBG_THREAD_INFO_CLASS(ThreadAttachContainer),
DBG_THREAD_INFO_CLASS(ThreadManageWritesToExecutableMemory),
DBG_THREAD_INFO_CLASS(ThreadPowerThrottlingState),
DBG_THREAD_INFO_CLASS(ThreadWorkloadClass),
DBG_THREAD_INFO_CLASS(ThreadCreateStateChange),
DBG_THREAD_INFO_CLASS(ThreadApplyStateChange),
DBG_THREAD_INFO_CLASS(ThreadStrongerBadHandleChecks),
DBG_THREAD_INFO_CLASS(ThreadEffectiveIoPriority),
DBG_THREAD_INFO_CLASS(ThreadEffectivePagePriority),
};
#undef DBG_THREAD_INFO_CLASS
if (ThreadInformationClass < RTL_NUMBER_OF(ThreadInfoClasses))
{
return ThreadInfoClasses[ThreadInformationClass];
}
sprintf(UnknownClassName, "%lu", ThreadInformationClass);
return UnknownClassName;
}
#endif // #if DBG
/* PUBLIC FUNCTIONS **********************************************************/
/*
@@ -82,8 +233,10 @@ NtQueryInformationProcess(
PreviousMode);
if (!NT_SUCCESS(Status))
{
DPRINT1("NtQueryInformationProcess(ProcessInformationClass: %lu): Class validation failed! (Status: 0x%lx)\n",
ProcessInformationClass, Status);
#if DBG
DPRINT1("NtQueryInformationProcess(ProcessInformationClass: %s): Class validation failed! (Status: 0x%lx)\n",
PspDumpProcessInfoClassName(ProcessInformationClass), Status);
#endif
return Status;
}
@@ -1200,7 +1353,9 @@ NtQueryInformationProcess(
/* Not supported by Server 2003 */
default:
DPRINT1("Unsupported info class: %lu\n", ProcessInformationClass);
#if DBG
DPRINT1("Unsupported info class: %s\n", PspDumpProcessInfoClassName(ProcessInformationClass));
#endif
Status = STATUS_INVALID_INFO_CLASS;
}
@@ -1267,8 +1422,10 @@ NtSetInformationProcess(IN HANDLE ProcessHandle,
PreviousMode);
if (!NT_SUCCESS(Status))
{
DPRINT1("NtSetInformationProcess(ProcessInformationClass: %lu): Class validation failed! (Status: 0x%lx)\n",
ProcessInformationClass, Status);
#if DBG
DPRINT1("NtSetInformationProcess(ProcessInformationClass: %s): Class validation failed! (Status: 0x%lx)\n",
PspDumpProcessInfoClassName(ProcessInformationClass), Status);
#endif
return Status;
}
@@ -2129,7 +2286,9 @@ NtSetInformationProcess(IN HANDLE ProcessHandle,
/* Anything else is invalid */
default:
DPRINT1("Invalid Server 2003 Info Class: %lu\n", ProcessInformationClass);
#if DBG
DPRINT1("Invalid Server 2003 Info Class: %s\n", PspDumpProcessInfoClassName(ProcessInformationClass));
#endif
Status = STATUS_INVALID_INFO_CLASS;
}
@@ -2175,8 +2334,10 @@ NtSetInformationThread(IN HANDLE ThreadHandle,
PreviousMode);
if (!NT_SUCCESS(Status))
{
DPRINT1("NtSetInformationThread(ThreadInformationClass: %lu): Class validation failed! (Status: 0x%lx)\n",
ThreadInformationClass, Status);
#if DBG
DPRINT1("NtSetInformationThread(ThreadInformationClass: %s): Class validation failed! (Status: 0x%lx)\n",
PspDumpThreadInfoClassName(ThreadInformationClass), Status);
#endif
return Status;
}
@@ -2739,7 +2900,9 @@ NtSetInformationThread(IN HANDLE ThreadHandle,
/* Anything else */
default:
/* Not yet implemented */
DPRINT1("Not implemented: %lu\n", ThreadInformationClass);
#if DBG
DPRINT1("Not implemented: %s\n", PspDumpThreadInfoClassName(ThreadInformationClass));
#endif
Status = STATUS_NOT_IMPLEMENTED;
}
@@ -2781,8 +2944,10 @@ NtQueryInformationThread(IN HANDLE ThreadHandle,
PreviousMode);
if (!NT_SUCCESS(Status))
{
DPRINT1("NtQueryInformationThread(ThreadInformationClass: %lu): Class validation failed! (Status: 0x%lx)\n",
ThreadInformationClass, Status);
#if DBG
DPRINT1("NtQueryInformationThread(ThreadInformationClass: %s): Class validation failed! (Status: 0x%lx)\n",
PspDumpThreadInfoClassName(ThreadInformationClass), Status);
#endif
return Status;
}
@@ -3187,7 +3352,9 @@ NtQueryInformationThread(IN HANDLE ThreadHandle,
/* Anything else */
default:
/* Not yet implemented */
DPRINT1("Not implemented: %lu\n", ThreadInformationClass);
#if DBG
DPRINT1("Not implemented: %s\n", PspDumpThreadInfoClassName(ThreadInformationClass));
#endif
Status = STATUS_NOT_IMPLEMENTED;
}