[NTOS] Complete the support of Debug Filters. CORE-13529

- KD64: Update the list of supported Debug Filter Masks (KdComponentTable)
  with the more up-to-date one from KDBG, that includes some components
  that have been added in Vista+, but some of which we also use in ReactOS.

- NtQueryDebugFilterState(), NtSetDebugFilterState() and KdpPrint():
  Add the Vista+ behaviour or falling back to the DEFAULT component ID
  settings for unknown Components (compiled in only wheen NTDDI_VERSION >= NTDDI_VISTA).
  + Remove redundant comments and update these functions with SAL2 annotations.

- KDBG: Add extra documentation for the debug filter components list.

- CONFIG: Load all the supported Debug Filter Masks settings from the
  registry.
This commit is contained in:
Hermès Bélusca-Maïto 2019-11-17 17:16:55 +01:00
parent 9537653ee7
commit 6c1aac6948
No known key found for this signature in database
GPG key ID: 3B2539C65E7B93D0
7 changed files with 1341 additions and 113 deletions

File diff suppressed because it is too large Load diff

View file

@ -546,9 +546,7 @@ extern BOOLEAN KdpControlCPressed;
extern BOOLEAN KdpContextSent; extern BOOLEAN KdpContextSent;
extern KSPIN_LOCK KdpDebuggerLock; extern KSPIN_LOCK KdpDebuggerLock;
extern LARGE_INTEGER KdTimerStop, KdTimerStart, KdTimerDifference; extern LARGE_INTEGER KdTimerStop, KdTimerStart, KdTimerDifference;
extern ULONG KdComponentTableSize;
extern ULONG Kd_WIN2000_Mask;
extern PULONG KdComponentTable[104];
extern CHAR KdpMessageBuffer[0x1000], KdpPathBuffer[0x1000]; extern CHAR KdpMessageBuffer[0x1000], KdpPathBuffer[0x1000];
extern CHAR KdPrintDefaultCircularBuffer[KD_DEFAULT_LOG_BUFFER_SIZE]; extern CHAR KdPrintDefaultCircularBuffer[KD_DEFAULT_LOG_BUFFER_SIZE];
extern BREAKPOINT_ENTRY KdpBreakpointTable[KD_BREAKPOINT_MAX]; extern BREAKPOINT_ENTRY KdpBreakpointTable[KD_BREAKPOINT_MAX];
@ -559,3 +557,164 @@ extern ULONG KdpNumInternalBreakpoints;
extern ULONG_PTR KdpCurrentSymbolStart, KdpCurrentSymbolEnd; extern ULONG_PTR KdpCurrentSymbolStart, KdpCurrentSymbolEnd;
extern ULONG TraceDataBuffer[40]; extern ULONG TraceDataBuffer[40];
extern ULONG TraceDataBufferPosition; extern ULONG TraceDataBufferPosition;
//
// Debug Filter Component Table
//
#define MAX_KD_COMPONENT_TABLE_ENTRIES 147
extern ULONG KdComponentTableSize;
extern PULONG KdComponentTable[MAX_KD_COMPONENT_TABLE_ENTRIES];
//
// Debug Filter Masks
//
extern ULONG Kd_WIN2000_Mask;
extern ULONG Kd_SYSTEM_Mask;
extern ULONG Kd_SMSS_Mask;
extern ULONG Kd_SETUP_Mask;
extern ULONG Kd_NTFS_Mask;
extern ULONG Kd_FSTUB_Mask;
extern ULONG Kd_CRASHDUMP_Mask;
extern ULONG Kd_CDAUDIO_Mask;
extern ULONG Kd_CDROM_Mask;
extern ULONG Kd_CLASSPNP_Mask;
extern ULONG Kd_DISK_Mask;
extern ULONG Kd_REDBOOK_Mask;
extern ULONG Kd_STORPROP_Mask;
extern ULONG Kd_SCSIPORT_Mask;
extern ULONG Kd_SCSIMINIPORT_Mask;
extern ULONG Kd_CONFIG_Mask;
extern ULONG Kd_I8042PRT_Mask;
extern ULONG Kd_SERMOUSE_Mask;
extern ULONG Kd_LSERMOUS_Mask;
extern ULONG Kd_KBDHID_Mask;
extern ULONG Kd_MOUHID_Mask;
extern ULONG Kd_KBDCLASS_Mask;
extern ULONG Kd_MOUCLASS_Mask;
extern ULONG Kd_TWOTRACK_Mask;
extern ULONG Kd_WMILIB_Mask;
extern ULONG Kd_ACPI_Mask;
extern ULONG Kd_AMLI_Mask;
extern ULONG Kd_HALIA64_Mask;
extern ULONG Kd_VIDEO_Mask;
extern ULONG Kd_SVCHOST_Mask;
extern ULONG Kd_VIDEOPRT_Mask;
extern ULONG Kd_TCPIP_Mask;
extern ULONG Kd_DMSYNTH_Mask;
extern ULONG Kd_NTOSPNP_Mask;
extern ULONG Kd_FASTFAT_Mask;
extern ULONG Kd_SAMSS_Mask;
extern ULONG Kd_PNPMGR_Mask;
extern ULONG Kd_NETAPI_Mask;
extern ULONG Kd_SCSERVER_Mask;
extern ULONG Kd_SCCLIENT_Mask;
extern ULONG Kd_SERIAL_Mask;
extern ULONG Kd_SERENUM_Mask;
extern ULONG Kd_UHCD_Mask;
extern ULONG Kd_RPCPROXY_Mask;
extern ULONG Kd_AUTOCHK_Mask;
extern ULONG Kd_DCOMSS_Mask;
extern ULONG Kd_UNIMODEM_Mask;
extern ULONG Kd_SIS_Mask;
extern ULONG Kd_FLTMGR_Mask;
extern ULONG Kd_WMICORE_Mask;
extern ULONG Kd_BURNENG_Mask;
extern ULONG Kd_IMAPI_Mask;
extern ULONG Kd_SXS_Mask;
extern ULONG Kd_FUSION_Mask;
extern ULONG Kd_IDLETASK_Mask;
extern ULONG Kd_SOFTPCI_Mask;
extern ULONG Kd_TAPE_Mask;
extern ULONG Kd_MCHGR_Mask;
extern ULONG Kd_IDEP_Mask;
extern ULONG Kd_PCIIDE_Mask;
extern ULONG Kd_FLOPPY_Mask;
extern ULONG Kd_FDC_Mask;
extern ULONG Kd_TERMSRV_Mask;
extern ULONG Kd_W32TIME_Mask;
extern ULONG Kd_PREFETCHER_Mask;
extern ULONG Kd_RSFILTER_Mask;
extern ULONG Kd_FCPORT_Mask;
extern ULONG Kd_PCI_Mask;
extern ULONG Kd_DMIO_Mask;
extern ULONG Kd_DMCONFIG_Mask;
extern ULONG Kd_DMADMIN_Mask;
extern ULONG Kd_WSOCKTRANSPORT_Mask;
extern ULONG Kd_VSS_Mask;
extern ULONG Kd_PNPMEM_Mask;
extern ULONG Kd_PROCESSOR_Mask;
extern ULONG Kd_DMSERVER_Mask;
extern ULONG Kd_SR_Mask;
extern ULONG Kd_INFINIBAND_Mask;
extern ULONG Kd_IHVDRIVER_Mask;
extern ULONG Kd_IHVVIDEO_Mask;
extern ULONG Kd_IHVAUDIO_Mask;
extern ULONG Kd_IHVNETWORK_Mask;
extern ULONG Kd_IHVSTREAMING_Mask;
extern ULONG Kd_IHVBUS_Mask;
extern ULONG Kd_HPS_Mask;
extern ULONG Kd_RTLTHREADPOOL_Mask;
extern ULONG Kd_LDR_Mask;
extern ULONG Kd_TCPIP6_Mask;
extern ULONG Kd_ISAPNP_Mask;
extern ULONG Kd_SHPC_Mask;
extern ULONG Kd_STORPORT_Mask;
extern ULONG Kd_STORMINIPORT_Mask;
extern ULONG Kd_PRINTSPOOLER_Mask;
extern ULONG Kd_VSSDYNDISK_Mask;
extern ULONG Kd_VERIFIER_Mask;
extern ULONG Kd_VDS_Mask;
extern ULONG Kd_VDSBAS_Mask;
extern ULONG Kd_VDSDYN_Mask; // Specified in Vista+
extern ULONG Kd_VDSDYNDR_Mask;
extern ULONG Kd_VDSLDR_Mask; // Specified in Vista+
extern ULONG Kd_VDSUTIL_Mask;
extern ULONG Kd_DFRGIFC_Mask;
extern ULONG Kd_DEFAULT_Mask;
extern ULONG Kd_MM_Mask;
extern ULONG Kd_DFSC_Mask;
extern ULONG Kd_WOW64_Mask;
//
// Components specified in Vista+, some of which we also use in ReactOS
//
extern ULONG Kd_ALPC_Mask;
extern ULONG Kd_WDI_Mask;
extern ULONG Kd_PERFLIB_Mask;
extern ULONG Kd_KTM_Mask;
extern ULONG Kd_IOSTRESS_Mask;
extern ULONG Kd_HEAP_Mask;
extern ULONG Kd_WHEA_Mask;
extern ULONG Kd_USERGDI_Mask;
extern ULONG Kd_MMCSS_Mask;
extern ULONG Kd_TPM_Mask;
extern ULONG Kd_THREADORDER_Mask;
extern ULONG Kd_ENVIRON_Mask;
extern ULONG Kd_EMS_Mask;
extern ULONG Kd_WDT_Mask;
extern ULONG Kd_FVEVOL_Mask;
extern ULONG Kd_NDIS_Mask;
extern ULONG Kd_NVCTRACE_Mask;
extern ULONG Kd_LUAFV_Mask;
extern ULONG Kd_APPCOMPAT_Mask;
extern ULONG Kd_USBSTOR_Mask;
extern ULONG Kd_SBP2PORT_Mask;
extern ULONG Kd_COVERAGE_Mask;
extern ULONG Kd_CACHEMGR_Mask;
extern ULONG Kd_MOUNTMGR_Mask;
extern ULONG Kd_CFR_Mask;
extern ULONG Kd_TXF_Mask;
extern ULONG Kd_KSECDD_Mask;
extern ULONG Kd_FLTREGRESS_Mask;
extern ULONG Kd_MPIO_Mask;
extern ULONG Kd_MSDSM_Mask;
extern ULONG Kd_UDFS_Mask;
extern ULONG Kd_PSHED_Mask;
extern ULONG Kd_STORVSP_Mask;
extern ULONG Kd_LSASS_Mask;
extern ULONG Kd_SSPICLI_Mask;
extern ULONG Kd_CNG_Mask;
extern ULONG Kd_EXFAT_Mask;
extern ULONG Kd_FILETRACE_Mask;
extern ULONG Kd_XSAVE_Mask;
extern ULONG Kd_SE_Mask;
extern ULONG Kd_DRIVEEXTENDER_Mask;

View file

@ -2295,8 +2295,9 @@ KdRefreshDebuggerNotPresent(VOID)
*/ */
NTSTATUS NTSTATUS
NTAPI NTAPI
NtQueryDebugFilterState(IN ULONG ComponentId, NtQueryDebugFilterState(
IN ULONG Level) _In_ ULONG ComponentId,
_In_ ULONG Level)
{ {
PULONG Mask; PULONG Mask;
@ -2316,16 +2317,22 @@ NtQueryDebugFilterState(IN ULONG ComponentId,
} }
else else
{ {
#if (NTDDI_VERSION >= NTDDI_VISTA)
/* Use the default component ID */
Mask = &Kd_DEFAULT_Mask;
// Level = DPFLTR_INFO_LEVEL; // Override the Level.
#else
/* Invalid ID, fail */ /* Invalid ID, fail */
return STATUS_INVALID_PARAMETER_1; return STATUS_INVALID_PARAMETER_1;
#endif
} }
/* Convert Level to bit field if necessary */ /* Convert Level to bit field if required */
if (Level < 32) Level = 1 << Level; if (Level < 32) Level = 1 << Level;
Level &= ~DPFLTR_MASK;
/* Determine if this Level is filtered out */ /* Determine if this Level is filtered out */
if ((Kd_WIN2000_Mask & Level) || if ((Kd_WIN2000_Mask & Level) || (*Mask & Level))
(*Mask & Level))
{ {
/* This mask will get through to the debugger */ /* This mask will get through to the debugger */
return (NTSTATUS)TRUE; return (NTSTATUS)TRUE;
@ -2342,15 +2349,15 @@ NtQueryDebugFilterState(IN ULONG ComponentId,
*/ */
NTSTATUS NTSTATUS
NTAPI NTAPI
NtSetDebugFilterState(IN ULONG ComponentId, NtSetDebugFilterState(
IN ULONG Level, _In_ ULONG ComponentId,
IN BOOLEAN State) _In_ ULONG Level,
_In_ BOOLEAN State)
{ {
PULONG Mask; PULONG Mask;
/* Modifying debug filters requires the debug privilege */ /* Modifying debug filters requires the debug privilege */
if (!SeSinglePrivilegeCheck(SeDebugPrivilege, if (!SeSinglePrivilegeCheck(SeDebugPrivilege, ExGetPreviousMode()))
ExGetPreviousMode()))
{ {
/* Fail */ /* Fail */
return STATUS_ACCESS_DENIED; return STATUS_ACCESS_DENIED;
@ -2372,25 +2379,24 @@ NtSetDebugFilterState(IN ULONG ComponentId,
} }
else else
{ {
#if (NTDDI_VERSION >= NTDDI_VISTA)
/* Use the default component ID */
Mask = &Kd_DEFAULT_Mask;
#else
/* Invalid ID, fail */ /* Invalid ID, fail */
return STATUS_INVALID_PARAMETER_1; return STATUS_INVALID_PARAMETER_1;
#endif
} }
/* Convert Level to bit field if required */ /* Convert Level to bit field if required */
if (Level < 32) Level = 1 << Level; if (Level < 32) Level = 1 << Level;
Level &= ~DPFLTR_MASK;
/* Check what kind of operation this is */ /* Set or remove the Level */
if (State) if (State)
{
/* Set the Level */
*Mask |= Level; *Mask |= Level;
}
else else
{
/* Remove the Level */
*Mask &= ~Level; *Mask &= ~Level;
}
/* Success */
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }

View file

@ -237,19 +237,66 @@ ULONG Kd_VSSDYNDISK_Mask;
ULONG Kd_VERIFIER_Mask; ULONG Kd_VERIFIER_Mask;
ULONG Kd_VDS_Mask; ULONG Kd_VDS_Mask;
ULONG Kd_VDSBAS_Mask; ULONG Kd_VDSBAS_Mask;
ULONG Kd_VDSDYN_Mask; // Specified in Vista+
ULONG Kd_VDSDYNDR_Mask; ULONG Kd_VDSDYNDR_Mask;
ULONG Kd_VDSLDR_Mask; // Specified in Vista+
ULONG Kd_VDSUTIL_Mask; ULONG Kd_VDSUTIL_Mask;
ULONG Kd_DFRGIFC_Mask; ULONG Kd_DFRGIFC_Mask;
ULONG Kd_DEFAULT_Mask; ULONG Kd_DEFAULT_Mask;
ULONG Kd_MM_Mask; ULONG Kd_MM_Mask;
ULONG Kd_DFSC_Mask; ULONG Kd_DFSC_Mask;
ULONG Kd_WOW64_Mask; ULONG Kd_WOW64_Mask;
//
// Components specified in Vista+, some of which we also use in ReactOS
//
ULONG Kd_ALPC_Mask;
ULONG Kd_WDI_Mask;
ULONG Kd_PERFLIB_Mask;
ULONG Kd_KTM_Mask;
ULONG Kd_IOSTRESS_Mask;
ULONG Kd_HEAP_Mask;
ULONG Kd_WHEA_Mask;
ULONG Kd_USERGDI_Mask;
ULONG Kd_MMCSS_Mask;
ULONG Kd_TPM_Mask;
ULONG Kd_THREADORDER_Mask;
ULONG Kd_ENVIRON_Mask;
ULONG Kd_EMS_Mask;
ULONG Kd_WDT_Mask;
ULONG Kd_FVEVOL_Mask;
ULONG Kd_NDIS_Mask;
ULONG Kd_NVCTRACE_Mask;
ULONG Kd_LUAFV_Mask;
ULONG Kd_APPCOMPAT_Mask;
ULONG Kd_USBSTOR_Mask;
ULONG Kd_SBP2PORT_Mask;
ULONG Kd_COVERAGE_Mask;
ULONG Kd_CACHEMGR_Mask;
ULONG Kd_MOUNTMGR_Mask;
ULONG Kd_CFR_Mask;
ULONG Kd_TXF_Mask;
ULONG Kd_KSECDD_Mask;
ULONG Kd_FLTREGRESS_Mask;
ULONG Kd_MPIO_Mask;
ULONG Kd_MSDSM_Mask;
ULONG Kd_UDFS_Mask;
ULONG Kd_PSHED_Mask;
ULONG Kd_STORVSP_Mask;
ULONG Kd_LSASS_Mask;
ULONG Kd_SSPICLI_Mask;
ULONG Kd_CNG_Mask;
ULONG Kd_EXFAT_Mask;
ULONG Kd_FILETRACE_Mask;
ULONG Kd_XSAVE_Mask;
ULONG Kd_SE_Mask;
ULONG Kd_DRIVEEXTENDER_Mask;
// End Mask
ULONG Kd_ENDOFTABLE_Mask; ULONG Kd_ENDOFTABLE_Mask;
// //
// Debug Filter Component Table // Debug Filter Component Table
// //
PULONG KdComponentTable[104] = PULONG KdComponentTable[MAX_KD_COMPONENT_TABLE_ENTRIES] =
{ {
&Kd_SYSTEM_Mask, &Kd_SYSTEM_Mask,
&Kd_SMSS_Mask, &Kd_SMSS_Mask,
@ -347,13 +394,61 @@ PULONG KdComponentTable[104] =
&Kd_VERIFIER_Mask, &Kd_VERIFIER_Mask,
&Kd_VDS_Mask, &Kd_VDS_Mask,
&Kd_VDSBAS_Mask, &Kd_VDSBAS_Mask,
&Kd_VDSDYN_Mask, // Specified in Vista+
&Kd_VDSDYNDR_Mask, &Kd_VDSDYNDR_Mask,
&Kd_VDSLDR_Mask, // Specified in Vista+
&Kd_VDSUTIL_Mask, &Kd_VDSUTIL_Mask,
&Kd_DFRGIFC_Mask, &Kd_DFRGIFC_Mask,
&Kd_DEFAULT_Mask, &Kd_DEFAULT_Mask,
&Kd_MM_Mask, &Kd_MM_Mask,
&Kd_DFSC_Mask, &Kd_DFSC_Mask,
&Kd_WOW64_Mask, &Kd_WOW64_Mask,
//
// Components specified in Vista+, some of which we also use in ReactOS
//
&Kd_ALPC_Mask,
&Kd_WDI_Mask,
&Kd_PERFLIB_Mask,
&Kd_KTM_Mask,
&Kd_IOSTRESS_Mask,
&Kd_HEAP_Mask,
&Kd_WHEA_Mask,
&Kd_USERGDI_Mask,
&Kd_MMCSS_Mask,
&Kd_TPM_Mask,
&Kd_THREADORDER_Mask,
&Kd_ENVIRON_Mask,
&Kd_EMS_Mask,
&Kd_WDT_Mask,
&Kd_FVEVOL_Mask,
&Kd_NDIS_Mask,
&Kd_NVCTRACE_Mask,
&Kd_LUAFV_Mask,
&Kd_APPCOMPAT_Mask,
&Kd_USBSTOR_Mask,
&Kd_SBP2PORT_Mask,
&Kd_COVERAGE_Mask,
&Kd_CACHEMGR_Mask,
&Kd_MOUNTMGR_Mask,
&Kd_CFR_Mask,
&Kd_TXF_Mask,
&Kd_KSECDD_Mask,
&Kd_FLTREGRESS_Mask,
&Kd_MPIO_Mask,
&Kd_MSDSM_Mask,
&Kd_UDFS_Mask,
&Kd_PSHED_Mask,
&Kd_STORVSP_Mask,
&Kd_LSASS_Mask,
&Kd_SSPICLI_Mask,
&Kd_CNG_Mask,
&Kd_EXFAT_Mask,
&Kd_FILETRACE_Mask,
&Kd_XSAVE_Mask,
&Kd_SE_Mask,
&Kd_DRIVEEXTENDER_Mask,
// End Mask
&Kd_ENDOFTABLE_Mask, &Kd_ENDOFTABLE_Mask,
}; };

View file

@ -331,8 +331,19 @@ KdpPrint(IN ULONG ComponentId,
/* Assume failure */ /* Assume failure */
*Handled = FALSE; *Handled = FALSE;
/* Validate the mask */ #if (NTDDI_VERSION >= NTDDI_VISTA)
if ((ComponentId >= KdComponentTableSize) && (ComponentId < MAXULONG))
{
/* Use the default component ID */
Mask = &Kd_DEFAULT_Mask;
// Level = DPFLTR_INFO_LEVEL; // Override the Level.
}
#endif
/* Convert Level to bit field if required */
if (Level < 32) Level = 1 << Level; if (Level < 32) Level = 1 << Level;
Level &= ~DPFLTR_MASK;
/* Validate the mask */
if (!(Kd_WIN2000_Mask & Level) || if (!(Kd_WIN2000_Mask & Level) ||
((ComponentId < KdComponentTableSize) && ((ComponentId < KdComponentTableSize) &&
!(*KdComponentTable[ComponentId] & Level))) !(*KdComponentTable[ComponentId] & Level)))

View file

@ -222,7 +222,14 @@ KdbpGetComponentId(
} }
ComponentTable[] = ComponentTable[] =
{ {
{ "DEFAULT", MAXULONG }, //
// Default components
//
{ "WIN2000", MAXULONG },
{ "DEFAULT", DPFLTR_DEFAULT_ID },
//
// Standard components
//
{ "SYSTEM", DPFLTR_SYSTEM_ID }, { "SYSTEM", DPFLTR_SYSTEM_ID },
{ "SMSS", DPFLTR_SMSS_ID }, { "SMSS", DPFLTR_SMSS_ID },
{ "SETUP", DPFLTR_SETUP_ID }, { "SETUP", DPFLTR_SETUP_ID },
@ -327,6 +334,9 @@ KdbpGetComponentId(
{ "MM", DPFLTR_MM_ID }, { "MM", DPFLTR_MM_ID },
{ "DFSC", DPFLTR_DFSC_ID }, { "DFSC", DPFLTR_DFSC_ID },
{ "WOW64", DPFLTR_WOW64_ID }, { "WOW64", DPFLTR_WOW64_ID },
//
// Components specified in Vista+, some of which we also use in ReactOS
//
{ "ALPC", DPFLTR_ALPC_ID }, { "ALPC", DPFLTR_ALPC_ID },
{ "WDI", DPFLTR_WDI_ID }, { "WDI", DPFLTR_WDI_ID },
{ "PERFLIB", DPFLTR_PERFLIB_ID }, { "PERFLIB", DPFLTR_PERFLIB_ID },

View file

@ -57,17 +57,17 @@ NTSYSCALLAPI
NTSTATUS NTSTATUS
NTAPI NTAPI
NtQueryDebugFilterState( NtQueryDebugFilterState(
ULONG ComponentId, _In_ ULONG ComponentId,
ULONG Level _In_ ULONG Level
); );
NTSYSCALLAPI NTSYSCALLAPI
NTSTATUS NTSTATUS
NTAPI NTAPI
NtSetDebugFilterState( NtSetDebugFilterState(
ULONG ComponentId, _In_ ULONG ComponentId,
ULONG Level, _In_ ULONG Level,
BOOLEAN State _In_ BOOLEAN State
); );
NTSYSCALLAPI NTSYSCALLAPI