Procmon Advanced Usage and Analysis

Article Overview and Navigation

This document provides a comprehensive technical deep dive into Process Monitor (Procmon). Navigate through the sections below to explore its internal architecture, features, and advanced usage techniques:

I. Process Monitor Internal Architecture and Operational Context

Process Monitor (Procmon) is an advanced monitoring tool for Windows that provides real-time observation of file system, Registry, process, thread, and network activity.1 Its utility in system troubleshooting, malware analysis, and performance diagnostics stems from its ability to capture a detailed stream of system events. Understanding Procmon's internal architecture is crucial for its effective utilization and the correct interpretation of its output.

A. Core Monitoring Mechanisms

Procmon achieves its system-wide event capture capabilities through a combination of kernel-mode drivers and user-mode components, employing specific Windows mechanisms for each type of activity it monitors.

1. File System Activity:

Procmon monitors file system activity by installing a kernel-mode driver, typically named PROCMONXX.SYS (where XX is a version number, e.g., PROCMON24.SYS), which functions as a File System Minifilter Driver.3 This driver registers with the Windows Filter Manager (FltMgr.sys), a kernel component responsible for managing file system filter drivers.5

Upon registration, PROCMONXX.SYS is assigned an altitude, a numeric value that dictates its position in the I/O stack relative to other minifilters.6 Procmon's default altitude typically falls within the "FSFilter Activity Monitor" group, which is around 385200.4 This altitude places it above many other filters like anti-virus scanners or encryption drivers, but below others like top-level file system filters.7

The PROCMONXX.SYS driver intercepts I/O Request Packets (IRPs) by registering pre-operation callback routines and post-operation callback routines with the Filter Manager for various I/O operations (e.g., IRP_MJ_CREATE, IRP_MJ_READ, IRP_MJ_WRITE, IRP_MJ_CLOSE).5

  • Pre-operation callbacks (PFLT_PRE_OPERATION_CALLBACK): These routines are invoked by FltMgr.sys before the I/O operation is passed down to lower-level drivers (including the base file system driver like NTFS.SYS). Procmon uses these to log the initiation of an operation.
  • Post-operation callbacks (PFLT_POST_OPERATION_CALLBACK): These routines are invoked after lower-level drivers have completed processing the I/O operation and it is traveling back up the stack. Procmon uses these to log the completion status and other details of the operation.5

This mechanism allows Procmon to observe the parameters of file system requests and their outcomes.

2. Registry Activity:

For monitoring Registry activity, Procmon utilizes Registry Callback Routines. It registers these callbacks by calling kernel functions such as CmRegisterCallbackEx.8 This function allows a driver to register a RegistryCallback routine that the Configuration Manager (the kernel component managing the registry) will invoke when specified registry operations occur.

Procmon can register to receive notifications for a wide array of registry operations, including, but not limited to:

  • RegNtPreCreateKeyEx: Notification before a registry key is created or opened.
  • RegNtPostSetValueKey: Notification after a value is set under a registry key.
  • RegNtDeleteKey, RegNtDeleteValueKey, RegNtQueryValueKey, RegNtEnumerateKey, RegNtEnumerateValueKey, etc.

By implementing these callbacks, Procmon's driver can log detailed information about which processes are accessing or modifying specific registry keys and values, along with the operation's success or failure. The Altitude parameter in CmRegisterCallbackEx also plays a role in ordering registry filter drivers, similar to file system filter altitudes.8

3. Process and Thread Activity:

Procmon monitors process and thread creation and termination using dedicated kernel notification routines:

  • PsSetCreateProcessNotifyRoutineEx: This function allows a driver to register a callback routine (PCREATE_PROCESS_NOTIFY_ROUTINE_EX) that the system calls whenever a new process is created or an existing process exits.9 Procmon uses this to capture details about new processes, including their command line and parent process ID.
  • PsSetCreateThreadNotifyRoutine: Similarly, this function registers a callback (PCREATE_THREAD_NOTIFY_ROUTINE) that is invoked when a new thread is created or a thread terminates within any process.10 This allows Procmon to log thread start and exit events.

These callbacks provide Procmon with information about the lifecycle of processes and threads across the system.

4. Network Activity:

Monitoring network activity is complex and has evolved. Procmon's network monitoring capabilities are generally focused on TCP/UDP endpoint creation, connection, send, and receive operations. The precise mechanisms can involve:

  • Intercepting Winsock calls at the user-mode to kernel-mode boundary: While Procmon primarily operates through kernel drivers, it can also gather information related to user-mode API calls that initiate network operations.
  • Event Tracing for Windows (ETW): Modern Windows versions heavily leverage ETW for diagnostics. Winsock itself provides ETW tracing capabilities.11 Procmon might consume events from relevant ETW providers, such as the Microsoft-Windows-Winsock-AFD provider, to capture network events. This is a common and efficient method for system-wide tracing.
  • Historical/Alternative Mechanisms (less likely for current Procmon versions for basic TCP/UDP):
    • Transport Driver Interface (TDI) filters: An older mechanism for intercepting network traffic at the transport layer.
    • Windows Filtering Platform (WFP) callouts: A more modern and comprehensive framework for network traffic inspection and modification. WFP is powerful but also complex to implement for simple logging.

Procmon's network logging typically captures high-level events like connection attempts, data sent/received (often just the fact of sending/receiving, not the full payload), and disconnections, rather than deep packet inspection which is the domain of tools like Wireshark. The official documentation primarily lists file system, Registry, and process/thread activity as its core strengths.1

B. Interaction with Windows Architecture

Procmon's components operate in both user-mode and kernel-mode, interacting with key parts of the Windows architecture:

  • User-Mode (Procmon.exe, Procmon64.exe): This is the graphical interface that users interact with. It is responsible for configuring monitoring options, communicating with the kernel driver to start/stop capture, receiving event data from the driver, displaying events, managing filters, and saving/loading traces.
  • Kernel-Mode (PROCMONXX.SYS): This driver contains the core monitoring logic described above (minifilter, registry callbacks, process/thread notification routines). It intercepts events directly within the kernel, collects relevant data, and buffers it before passing it to the user-mode component.

Procmon's interception points are strategically placed within the Windows I/O and object management pathways:

  • File System Operations: Intercepted via FltMgr.sys in the I/O stack, allowing Procmon to see requests before they reach, and after they return from, underlying file system drivers (e.g., NTFS.SYS, FastFAT.SYS) and other filters. The I/O Manager is the executive component that manages the overall I/O process, including IRP dispatch.12
  • Registry Operations: Intercepted via callbacks registered with the Configuration Manager, which is responsible for managing registry hive loading and access.12
  • Process/Thread Operations: Monitored via notifications from the Process Manager (part of the NT Executive).12
  • Object Management: Many operations logged by Procmon involve interactions with the Object Manager, which manages all kernel objects (files, registry keys, processes, threads, etc.). Result codes like STATUS_OBJECT_NAME_NOT_FOUND often originate from the Object Manager.14

The Result codes logged by Procmon, detailed in the Interpreting Process Monitor Results articlearticle, often originate from these Windows components (I/O Manager, Object Manager, specific file system drivers, Registry Manager, Security Reference Monitor) or from other filter drivers in the stack.

C. Procmon Driver Altitude Deep Dive

The concept of "altitude" is fundamental to understanding Procmon's behavior for file system monitoring and how it interacts with other file system filter drivers.

1. Concept and Mechanism:

Within the File System Filter Manager framework, each minifilter driver is assigned a unique altitude, which is a string representing a numerical value.6 This altitude dictates the minifilter's loading order and its position in the filter driver stack for a given volume.6 The Filter Manager (FltMgr.sys) calls registered minifilters in order of their altitude.

Microsoft allocates altitude ranges for different categories of filter drivers (e.g., anti-virus, encryption, replication, activity monitors).7

  • Higher numerical altitudes mean the filter is positioned further away from the base file system (closer to the I/O Manager and the initiating application). These filters see IRPs earlier in the pre-operation path and later in the post-operation path.
  • Lower numerical altitudes mean the filter is positioned closer to the base file system. These filters see IRPs later in the pre-operation path and earlier in the post-operation path.

Procmon's PROCMONXX.SYS driver typically registers in the "FSFilter Activity Monitor" altitude group, with a default altitude around 385200.4 This places it above many security (e.g., AV scanners, ~32xxxx range) and encryption filters (~14xxxx range) but below certain system or specialized filters.7

Table 1: Illustrative File System Minifilter Altitude Ranges and Procmon
Filter Category Typical Altitude Range Position Relative to Base FS Procmon's Default Position
FSFilter Top 400000 - 409999 Furthest Below
FSFilter Activity Monitor 360000 - 389999 Far Within (e.g., 385200)
FSFilter Continuous Backup 340000 - 349999 Middle-Far Above
FSFilter Anti-Virus 320000 - 329999 Middle Above
FSFilter Replication 260000 - 269999 Middle-Close Above
FSFilter HSM 200000 - 209999 Close Above
FSFilter Encryption 140000 - 149999 Closer Above
FSFilter Compression 160000 - 169999 Closer Above
FSFilter Physical Quota Mgmt 120000 - 129999 Very Close Above
FSFilter OpenFile 100000 - 109999 Very Close Above
FSFilter Security Enhancer 80000 - 89999 Extremely Close Above
FSFilter Bottom 40000 - 49999 Closest Above
Note: Ranges are illustrative and subject to change. Specific driver altitudes are assigned by Microsoft. Procmon's default is ~385200. 7

2. Impact on Call Stacks:

A common point of confusion is why lowering Procmon's altitude often results in a longer call stack visible in Procmon's Stack Trace window, even though Procmon is positioned lower in the IRP processing order (closer to the file system).

The key is to understand that the stack trace is captured by Procmon at the point its logging code executes.

  • For pre-operation callbacks: Procmon logs the event before passing the IRP down to filters below it (or to the base file system).
  • For post-operation callbacks: Procmon logs the event after the IRP has been processed by filters below it and the base file system, and is traveling back up the stack through Procmon's layer.

If Procmon's altitude is low:

  • In a pre-operation, when Procmon's callback is invoked, many higher-altitude filters have already processed the IRP. Their function frames are still on the call stack above Procmon's current execution context. Thus, Procmon captures these frames.
  • In a post-operation, Procmon's callback is invoked relatively early as the IRP travels up. Again, filters higher in the stack are still on the call stack awaiting the IRP's completion to propagate to them.

If Procmon's altitude is high (default):

  • In a pre-operation, Procmon is one of the first filters to see the IRP. Fewer (or no) other filter driver frames will be on the stack above it when it logs.
  • In a post-operation, Procmon is one of the last filters to see the completed IRP. Lower-altitude filters have already finished their post-operation processing, and their frames may have unwound from the stack by the time Procmon's post-operation callback logs the event.

Therefore, a lower Procmon altitude means more filter drivers above Procmon in the filter stack have already been invoked and remain on the call stack when Procmon's logging code executes. These appear in the captured stack trace, making it appear "longer" (i.e., showing more modules above PROCMONXX.SYS). This is crucial for observing the activity of these higher-altitude filters.3 Conversely, a higher altitude Procmon logs before lower filters are called (pre-op) or after they have completed and potentially unwound from the stack (post-op), resulting in a "shorter" stack trace concerning other filters.

3. Behavior, Advantages, and Disadvantages:

Table 2: Procmon Altitude Configuration: Behavior and Diagnostic Implications
Feature High Altitude (Default, e.g., 385200) Low Altitude (e.g., 40000 - 140000)
Behavior Intercepts early in pre-operation path (before many other filters). Intercepts late in post-operation path (after many other filters). Intercepts late in pre-operation path (after many higher-altitude filters). Intercepts early in post-operation path (before many higher-altitude filters).
Advantages - Sees requests closer to the source application.
- Potentially less interference from filters below it altering the operation before Procmon sees it (pre-op).
- Potentially lower system overhead as it's higher in the stack.
- Sees operations after potential modification/blocking by higher-altitude filters.
- Stack trace includes more active filters above it, crucial for diagnosing filter conflicts and interactions.3
- Can see activity of drivers like AV scanners that are typically at lower altitudes.3
Disadvantages - May miss modifications or blocks performed by lower-altitude filters.
- Stack trace may not show activity of lower-altitude filters that are critical to an issue.
- May not see the "final" state of an IRP if modified by lower filters.
- May not see the original parameters of an IRP if they were modified by filters above it.
- Potentially higher system overhead due to being deeper in stack processing for every I/O.
- Log files can be significantly larger due to capturing more activity.

4. Altitude Adjustment:

Procmon's altitude can be adjusted by modifying a registry value. This is typically done for diagnostic purposes, such as when suspecting interaction with a specific filter driver.3

How to Adjust:

  1. Identify Procmon's service key: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PROCMONXX (e.g., PROCMON24).
  2. Navigate to the instance subkey: Instances\Process Monitor XX Instance (e.g., Process Monitor 24 Instance).
  3. Modify the Altitude (REG_SZ) value. For example, to see activity below most filters, a value like 40000 or 140000 might be used.3 The specific value depends on the altitudes of other filters present on the system (which can be checked using fltmc instances from an administrative command prompt).3
  4. Crucially, permissions on the Process Monitor XX Instance key must be modified to Deny Set Value and Delete for the Everyone group. This prevents Procmon from resetting the altitude to its default value upon starting.3 Inheritance may need to be disabled on the key to set these specific deny permissions.
  5. A system reboot is typically required for the new altitude to take effect if Procmon has been run prior to the change.3

When Diagnostically Useful:

  • Suspecting a specific filter driver (e.g., AV, encryption, backup) is causing an issue (e.g., access denied, poor performance, incorrect behavior). Lowering Procmon's altitude below the suspected filter can help confirm its involvement by making it visible in call stacks or by observing changes in behavior.
  • Trying to bypass problematic filters by setting Procmon's altitude above them (though this is less common than lowering it).
  • Understanding the complete chain of filters involved in an I/O operation.

Potential System Stability Implications:

  • While generally safe for diagnostic purposes, running Procmon at non-standard altitudes, especially very low ones, for extended periods is not recommended for production systems without specific cause.
  • Incorrectly assigned altitudes (e.g., conflicting with critical system filters) could theoretically lead to instability, though the Filter Manager is designed to mitigate such issues. The primary risk is usually increased system load and very large log files.
  • It is important to restore the default altitude and permissions after troubleshooting is complete, or understand the implications of leaving it changed.3

D. Capture Scope, Limitations, and Blind Spots

While powerful, Procmon is not omniscient. Its monitoring capabilities are tied to the specific interception mechanisms it uses.

1. What Procmon Captures Well:

  • File System Activity: Detailed logging of create, read, write, delete, query information, set information, directory enumeration, and other file operations via standard Windows APIs that result in IRPs passing through the file system stack.1
  • Registry Activity: Comprehensive logging of key creation, deletion, querying, value setting, enumeration, etc., for operations routed through the Configuration Manager.1
  • Process and Thread Activity: Reliable capture of process creation/termination (with command lines, parent PIDs) and thread creation/termination.1
  • Basic Network Operations: TCP/UDP endpoint operations (create, connect, accept, send, receive, disconnect) initiated via standard Winsock APIs, likely captured via ETW or similar high-level mechanisms.2

2. What Procmon Might Miss or Represent Incompletely:

  • Operations handled entirely within a single kernel component without re-issuing IRPs/callbacks Procmon monitors: For example, some internal cache hits within a file system driver might not generate new IRPs that Procmon's minifilter would see.
  • Very low-level hardware interactions: Direct hardware port I/O or DMA operations that bypass the standard driver stacks monitored by Procmon.
  • Purely user-mode intra-process activity: Memory allocations, function calls, or data manipulation that occur entirely within a process's address space and do not involve kernel objects or APIs that Procmon hooks.
  • Operations blocked/modified by filters above a high-altitude Procmon (on pre-op): If a filter with a higher altitude than Procmon blocks or significantly alters an IRP in its pre-operation callback and completes the IRP without passing it down, Procmon (at its default or lower altitude) might not see the original request or might see a modified one.
  • Operations modified by filters below a low-altitude Procmon (on post-op, if completion doesn't return to Procmon's layer in the same way): This is less common, but if a lower filter alters the IRP's outcome and the completion path changes significantly, Procmon's view might be incomplete.
  • Fine-grained details of certain complex kernel mechanisms: While Procmon shows the results of these mechanisms (e.g., memory mapping via CreateSection followed by MapViewOfFile), it doesn't detail the internal workings of the Memory Manager itself.
  • Some forms of high-speed/offloaded network traffic: Network traffic processed by dedicated hardware offload engines (e.g., TOE cards) might bypass the parts of the host networking stack that Procmon monitors.
  • Details of Asynchronous Procedure Calls (APCs) or other intra-kernel signaling unless they result in monitored operations.

3. Architectural Limitations:

These limitations exist because Procmon relies on specific, documented (and some less documented but stable) interception points within the Windows architecture:

  • File System: Relies on FltMgr.sys callbacks. If an operation doesn't go through this path, Procmon won't see it.
  • Registry: Relies on CmRegisterCallbackEx notifications. Operations bypassing these (e.g., direct hive file manipulation, though rare and risky) would be missed.
  • Process/Thread: Relies on PsSetCreateProcessNotifyRoutineEx and PsSetCreateThreadNotifyRoutine.
  • Network: Relies on higher-level event sources (like ETW for Winsock) rather than NDIS-level packet interception.

Procmon is an event monitor, not a full system emulator or a kernel debugger with universal breakpoints. It sees what passes through its "toll booths."

4. When Not to Rely Solely on Procmon:

Procmon is a powerful first-line and intermediate analysis tool, but certain scenarios require other specialized tools:

  • Deep Kernel Debugging (WinDbg): For analyzing kernel crashes (blue screens), inspecting arbitrary kernel memory, stepping through kernel code, setting breakpoints anywhere in the kernel, or diagnosing issues that Procmon cannot see (e.g., race conditions, complex driver interactions not visible via Procmon's hooks).19
  • Hardware Tracing: For issues suspected to be at the hardware or very low-level firmware/driver interface, tools like hardware bus analyzers or specific hardware tracing capabilities might be needed.
  • Detailed Network Packet Analysis (Wireshark, Microsoft Message Analyzer): When full packet payloads, protocol-specific errors, or precise network timings are required. Procmon shows that a network operation occurred; Wireshark shows the exact bytes exchanged.20
  • Analysis of Purely User-Mode Code Execution (Debuggers, Profilers): For debugging application logic, analyzing user-mode memory corruption, or profiling CPU usage within user-mode functions, tools like Visual Studio Debugger, WinDbg (in user-mode), or dedicated CPU/memory profilers are more appropriate.19
  • Rootkit Detection beyond Procmon's Scope: Sophisticated kernel-mode rootkits may actively try to hide from or subvert monitoring tools like Procmon. Specialized rootkit detectors or live kernel debugging might be necessary.

II. Mastering Procmon Features for Effective Analysis

Effective use of Procmon hinges on understanding its interface and leveraging its powerful filtering, highlighting, and event examination capabilities.

A. Core Interface Navigation

The Procmon main window presents a real-time list of captured events. Key elements include:

  • Event List: The central pane displaying events as rows.
  • Columns: Customizable columns provide details for each event. Essential columns include1:
    • Sequence: Unique number for each event.
    • Time of Day: Timestamp of the event.
    • Process Name: Name of the process generating the event.
    • PID: Process ID.
    • Operation: Type of operation (e.g., RegOpenKey, CreateFile, TCP Send).
    • Path: File path, registry key path, or network endpoint.
    • Result: Outcome of the operation (e.g., SUCCESS, ACCESS DENIED).
    • Detail: Operation-specific parameters.
    • Duration: Time taken for synchronous operations.
  • Status Bar: Displays total events, filtered events, and capture status.
  • Menu Options: Provides access to all features (File, Edit, Event, Filter, Tools, Options, Help).
  • Toolbar: Quick access to common functions like start/stop capture (Ctrl+E), clear display (Ctrl+X), filter dialog (Ctrl+L), save (Ctrl+S), process tree (Ctrl+T), autoscroll (Ctrl+A).23

B. Filtering

Procmon can capture millions of events in seconds; filtering is crucial for isolating relevant data.24

1. Filter Dialog (Filter -> Filter..., Ctrl+L):

This is the primary interface for creating complex filter sets.24

2. Filter Categories (Properties):

Filters are built by selecting a property (column name) to filter on.

3. Condition Operators:

A relation (operator) is chosen to compare the property with a specified value23:

  • is
  • is not
  • less than
  • more than
  • begins with
  • ends with
  • contains
  • excludes
  • greater than (same as more than)
  • less than or equal to
  • greater than or equal to
  • is any of (allows multiple comma-separated values for 'is')
  • is not any of (allows multiple comma-separated values for 'is not')

4. Include vs. Exclude Actions:

Each filter condition can be set to either:

  • Include: Only events matching this condition (and other Include conditions) will be displayed.
  • Exclude: Events matching this condition will be hidden.

5. Building Complex Filter Sets:

Multiple filter conditions can be added. Procmon applies an implicit logic:

  • All conditions for the same property with the same action (Include/Exclude) are effectively OR'd if multiple values are provided (e.g., Process Name is proc1.exe OR Process Name is proc2.exe if added as separate is conditions or using is any of).
  • Conditions for different properties or different actions are typically AND'd. For example: (Process Name is app.exe INCLUDE) AND (Operation is RegQueryValue INCLUDE) AND (Result is not SUCCESS EXCLUDE) This means an event must match all INCLUDE conditions and not match any EXCLUDE conditions to be displayed. Careful construction is key. The "Drop Filtered Events" option in the Filter menu makes filtering destructive (events are discarded, not just hidden).22

6. Right-Click Context Menu Filtering:

A quick way to filter is to right-click an event in the main display. The context menu offers options like "Include 'value'", "Exclude 'value'" for the specific column clicked, or for other properties of that event (e.g., Include Process Name, Exclude Operation).22

7. Saving and Loading Filter Sets (.PMF files):

Complex filter configurations can be saved to a .PMF file (Filter -> Save Filter...) and later loaded (Filter -> Load Filter... or Filter -> Organize Filters...).25 This is extremely useful for recurring analysis tasks.

8. Example Scenarios:

  • Specific Process: Process Name is notepad.exe Include
  • Specific Path (contains): Path contains C:\Users\Me\MyDoc.txt Include
  • Specific Result Code: Result is ACCESS DENIED Include 26
  • Failed Operations Only: Result is not SUCCESS Include (and potentially exclude specific non-error results like REPARSE or BUFFER TOO SMALL if they are noise for the current scenario).
  • Registry Writes Only: (Operation begins with RegSet Include) AND (Operation is not RegSetInformationKey Include if not needed for example). Or more broadly: (Event Class is Registry Include) AND (Operation contains Set Include OR Operation contains Create Include OR Operation contains Delete Include).
  • Network Connections to Specific IP: (Operation is TCP Connect Include) AND (Path ends with :192.168.1.100 Include) (Note: Path for TCP Connect often includes source:port -> destination:ip:port).

C. Highlighting

Highlighting (Filter -> Highlight..., Ctrl+H) allows events to be visually distinguished (e.g., by background color) without removing other events from the display.23 It uses the same condition-building logic as filters. This is useful for drawing attention to specific events (e.g., highlight all ACCESS DENIED results in yellow) while still seeing the surrounding context. Highlight colors can be customized via Options -> Highlight Colors....23

D. Event Properties (Details Pane)

Double-clicking an event or selecting it and pressing Ctrl+E (or Enter) opens the Event Properties window, which provides comprehensive details about the selected event across several tabs.28

  • Event Tab:
    • Displays general information about the event: Sequence #, Time of Day, Process, PID, TID, Operation, Path, Result, Class, Duration.
    • Crucially, the lower pane shows the parsed Detail column information, with each parameter on a separate line for clarity (e.g., Desired Access, Disposition, Options for CreateFile).29
  • Process Tab:
    • Information about the process that generated the event: Path, Command Line, PID, Parent PID, User, Session ID, Architecture (32/64-bit), Integrity Level, Virtualized status (on Vista+).29
    • Module list: Shows DLLs and EXEs loaded in the process at the time of the event, with their load addresses and paths. Double-clicking a module shows its version information.29
  • Stack Tab:
    • Displays the call stack of the thread at the moment the event was logged. This is paramount for understanding the code path leading to the event.29 Details are in section II.E.

E. Reading and Interpreting the Call Stack

The call stack is one of Procmon's most powerful diagnostic features, providing insight into the code execution path that led to a logged event.

1. Accessing the Stack:

The call stack for a selected event is available in the Stack tab of the Event Properties window (accessible by double-clicking an event, pressing Ctrl+E, or selecting Event -> Properties...).29

2. Loading Symbols:

  • Absolute Necessity: For meaningful stack traces, symbol files (.PDB files) are essential. Without symbols, the stack trace displays raw memory addresses (e.g., ntoskrnl.exe+0x1C34A0), which are difficult to interpret. With symbols, these addresses are resolved into human-readable function names, module names, and sometimes source file and line numbers (e.g., ntoskrnl.exe!NtCreateFile+0x1A).1
  • Configuration: Symbols are configured via Options -> Configure Symbols....
    • DbgHelp.dll Path: Procmon uses DbgHelp.dll for symbol resolution. It's important to ensure Procmon is configured to use an up-to-date version, typically found in the Debugging Tools for Windows installation directory or recent Windows Kits.31
    • Symbol Path (_NT_SYMBOL_PATH format): This path tells DbgHelp.dll where to find symbol files. A correctly configured symbol path is critical. A typical and recommended path structure is: srv*C:\MyLocalSymbols*https://msdl.microsoft.com/download/symbols This tells the symbol engine to first look in a local cache (C:\MyLocalSymbols in this example, which can be any local path) and, if not found, download them from the Microsoft public symbol server and store them in the local cache for future use.32 Private symbol paths for custom-developed applications or third-party drivers should also be added here, separated by semicolons.
    • symsrv.dll: This DLL is the symbol server client used by DbgHelp.dll to retrieve symbols from symbol servers specified in the path (like the Microsoft public server).32
  • Impact: Proper symbol configuration transforms an almost useless list of addresses into a rich source of diagnostic information, clearly identifying the functions and modules involved in an operation.30

3. Structure (Reading Order):

The call stack is displayed with the most recent (deepest) function call at the top (frame 0 or 1) and the initial function call (closest to user-mode or the start of the kernel operation being logged) at the bottom. To understand the flow of execution leading to the logged event, read the stack from the bottom up.

  • The bottom-most frames often show the transition from user mode to kernel mode (e.g., a system call invoked from ntdll.dll or win32u.dll) or the entry point of a kernel callback routine (e.g., a file system minifilter callback in fltmgr.sys or PROCMONXX.SYS).
  • Each frame above it represents a function called by the function in the frame below it.

4. Identifying Modules:

Each frame in the stack trace typically follows the format Module!Function+Offset (e.g., ntoskrnl.exe!KeSetEvent+0x1a) or just Module+Address if full symbols aren't available.

  • User-mode DLLs: Modules like kernel32.dll, user32.dll, advapi32.dll, application-specific DLLs (e.g., MyApplication.dll), and .NET runtime DLLs (coreclr.dll, clr.dll). These are often seen at the bottom of call stacks for operations initiated by user-mode applications. User-mode frames are marked with a 'U' on the left if user-mode stack walking is enabled and successful (availability depends on system architecture and OS version, generally available on 64-bit systems post Vista SP1).22
  • Core Kernel Components:
    • ntoskrnl.exe: The NT OS Kernel, containing core executive services, memory management, process management, I/O manager (parts of it), etc.
    • hal.dll: Hardware Abstraction Layer, providing an interface between the kernel and platform-specific hardware.
  • Specific Drivers:
    • File System Drivers: ntfs.sys (NTFS), fastfat.sys (FAT32/FAT16), exfat.sys (exFAT), refs.sys (ReFS).
    • Network Stack Drivers: tcpip.sys (TCP/IP protocol driver), ndis.sys (Network Driver Interface Specification wrapper).
    • Filter Manager: fltmgr.sys (File System Filter Manager).
    • Procmon's own driver: PROCMONXX.SYS (e.g., PROCMON24.SYS).
  • Third-Party Filter Drivers: These are crucial to identify, especially when troubleshooting compatibility issues or unexpected behavior. They are often identifiable by vendor names within the module path (e.g., AVDriver.sys, EncryptDrv.sys, BackupFlt.sys). The presence of LeakyFlt.sys in a stack trace, as shown in one example, indicates its involvement.3
Table 4: Common Module Types in Procmon Call Stacks
Module Category Example Module Names Typical Role/Function in an Operation
User-Mode Application MyApp.exe, MyLib.dll Initiates operations, application-specific logic.
Core User-Mode OS ntdll.dll, kernel32.dll, user32.dll, advapi32.dll Provides Win32 API, system call stubs to transition to kernel mode.
Core Kernel OS ntoskrnl.exe, hal.dll Core OS services, scheduling, memory management, I/O management, hardware abstraction.
File System Driver ntfs.sys, fastfat.sys, fltmgr.sys Manages file storage, access, and metadata on disk. fltmgr.sys manages file system filter drivers.
Network Driver tcpip.sys, ndis.sys, afd.sys Implements network protocols, manages network interface cards, provides socket interface.
Registry Support ntoskrnl.exe (Configuration Manager parts) Manages access to the Windows Registry.
Procmon Driver PROCMONXX.SYS Intercepts and logs events for Procmon.
Third-Party Filter Driver VendorAV.sys, EncryptionFlt.sys, EndpointSec.sys Provides add-on functionality like anti-virus scanning, encryption, data loss prevention, etc.
Graphics/Display Drivers dxgkrnl.sys, nvlddmkm.sys, atikmdag.sys Manage GPU and display operations.
Other Device Drivers USBSTOR.SYS, HIDCLASS.SYS, KBDCLASS.SYS Drivers for specific hardware devices.

5. Using the Stack for Diagnosis:

  • Pinpointing Code Path: The stack trace reveals the exact sequence of function calls within the kernel (and potentially user-mode) that led to the specific event Procmon logged.
  • Identifying Initiator: The lower frames of the stack (closer to the user/kernel transition or initial callback) often point to the ultimate initiator of an operation – a specific function in an application DLL, a system worker thread, or an interrupt handler.
  • Understanding Driver/Filter Involvement: The presence of various driver modules (.sys files) in the stack clearly indicates their participation in processing the request. This is especially vital for diagnosing issues with file system filters, network filters, or other drivers interacting with the operation.3
  • Correlating with Result Column: By examining which module's function is near the top of the stack (or which module is just below PROCMONXX.SYS in a post-operation for file I/O, or which module PROCMONXX.SYS called that returned an error), one can often infer which module likely returned the status code seen in the Result column. For instance, if VendorAV.sys!ScanFunction is high in the stack for a CreateFile operation that returns ACCESS DENIED, the AV filter is a prime suspect.

The call stack provides a narrative of causality. Each frame represents a function that called the function in the frame above it (or is the currently executing function, for the top-most relevant frame). Reading from bottom-up tells a story: "Process A called API B in ntdll.dll, which transitioned to kernel function C in ntoskrnl.exe, which called I/O Manager function D, which invoked filter E, then filter F (Procmon), then filter G, then file system H..." When an operation fails (e.g., ACCESS_DENIED), the stack trace helps identify the module that was likely executing or had just finished executing when that decision was made. If PROCMONXX.SYS is logging a post-operation, the functions immediately above it (or the component it called that returned the error) are key. Combined with altitude changes, this narrative can reveal "hidden actors" (other filter drivers) that influence outcomes. For example, if an operation succeeds with Procmon at high altitude, but fails or behaves differently when Procmon is at low altitude (revealing a new filter driver X in the stack), driver X becomes a suspect. Thus, the call stack is not just a list of functions; it's a critical diagnostic tool for assigning responsibility for an event's occurrence and outcome.

6. Stack Trace and Altitude Interaction (Revisited):

As detailed in Section I.C.2, Procmon's file system filter driver altitude directly influences which other filter drivers appear in the call stack above PROCMONXX.SYS (or its internal logging function within PROCMONXX.SYS).

  • A lower Procmon altitude means PROCMONXX.SYS is invoked later in the pre-operation chain or earlier in the post-operation chain. Consequently, more filter drivers that are positioned higher in the I/O stack will have their function frames present on the call stack when Procmon captures it. This leads to a "longer" stack trace visible in Procmon, showing more modules above PROCMONXX.SYS.3
  • A higher Procmon altitude (the default) means fewer such drivers will be visible above PROCMONXX.SYS in the stack trace.

F. Interpreting the Result Column

The Result column in Procmon is critical for understanding the outcome of an operation.

1. Primary Code System:

The Result column primarily displays NTSTATUS codes for kernel-originated operations (e.g., STATUS_SUCCESS, STATUS_ACCESS_DENIED, STATUS_OBJECT_NAME_NOT_FOUND).34 Procmon often translates these hexadecimal NTSTATUS values into more human-readable symbolic names (e.g., SUCCESS, ACCESS DENIED, NAME NOT FOUND). For some user-mode initiated events or certain network operations, it might display Windows error codes (Win32 errors), which are often related to or can be mapped from NTSTATUS codes.34

2. Potential Origins:

The Result logged by Procmon is the status code returned at the point Procmon intercepted the operation's completion (for post-operations) or the status determined at the point of pre-operation logging. This status can originate from various components:

  • The ultimate target component:
    • The base File System Driver (e.g., NTFS.SYS, FASTFAT.SYS) for file operations.
    • The Network Stack (e.g., TCPIP.SYS, AFD.SYS) for network operations.
    • The Registry Manager (implemented within ntoskrnl.exe as the Configuration Manager) for registry operations.12
  • A third-party filter driver positioned above Procmon in the I/O stack (for file operations) that intercepted and completed/failed the IRP before it reached Procmon's pre-operation callback or before it could proceed to lower drivers. Procmon might log the initial parameters of the request, but the result it records could be from this higher filter if it completes the IRP.
  • A third-party filter driver positioned below Procmon in the I/O stack whose failure status propagated back up to or through Procmon's layer during post-operation processing. For example, an anti-virus filter below Procmon might return STATUS_ACCESS_DENIED, and Procmon would log this result.
  • Core NT Executive subsystems14:
    • Object Manager: Responsible for managing kernel objects. Can return codes like STATUS_OBJECT_NAME_NOT_FOUND, STATUS_OBJECT_PATH_NOT_FOUND, STATUS_INVALID_HANDLE.
    • Security Reference Monitor (SRM): Performs access checks. The primary source of STATUS_ACCESS_DENIED if an operation is denied based on security descriptors and token privileges.36
    • I/O Manager: Can return errors related to IRP parameter validation or structural issues.
    • Memory Manager: Can return errors related to buffer validity, memory mapping failures (e.g., STATUS_INSUFFICIENT_RESOURCES).
Table 5: Potential Origins of Common NTSTATUS Codes in Procmon's Result Column
Common NTSTATUS Code (Symbolic) Hex Value Likely Originating Component Category Brief Explanation/Common Scenario
SUCCESS 0x00000000 Target Driver, Filter Driver, OS Component Operation completed successfully.
ACCESS DENIED 0xC0000022 Security Reference Monitor (SRM), File System Driver (security), Filter Driver (e.g., AV, DLP) Insufficient permissions to perform the operation based on object DACL and process token. Filter drivers can also return this to block access.
OBJECT NAME NOT FOUND 0xC0000034 Object Manager, File System Driver, Registry Manager The specified file, directory, or registry key does not exist at the given path.
OBJECT PATH NOT FOUND 0xC000003A Object Manager, File System Driver, Registry Manager A component of the path (e.g., a directory in a file path) does not exist.
SHARING VIOLATION 0xC0000043 File System Driver, Filter Driver Attempt to open a file with a share mode incompatible with how it's already opened by another process/thread.
FILE IS A DIRECTORY 0xC00000BA File System Driver Attempted a file operation on an object that is a directory.
NOT A DIRECTORY 0xC0000103 File System Driver Attempted a directory operation on an object that is a file.
BUFFER OVERFLOW 0x80000005 Target Driver, OS Component (Warning) Output buffer was too small for all data, but some data may have been returned.
BUFFER TOO SMALL 0xC0000023 Target Driver, OS Component (Error) Output buffer was too small to return any data, or for required input data.
REPARSE 0x00000104 File System Driver, Filter Driver (Informational) Indicates a reparse point was encountered (e.g., symbolic link, mount point); I/O Manager will re-issue the request. Not an error.
END OF FILE 0xC0000011 File System Driver Attempted to read past the end of a file.
INVALID PARAMETER 0xC000000D Any Kernel Component One or more parameters supplied to a kernel function/driver were invalid.
INSUFFICIENT RESOURCES 0xC000009A Memory Manager, PnP Manager, other resource allocators Not enough system resources (e.g., memory, pool) to complete the operation.
OPLOCK NOT GRANTED 0xC00000E2 File System Driver (Opportunistic Locking) An opportunistic lock request could not be granted, or an existing oplock was broken.
NAME COLLISION 0xC0000035 File System Driver, Registry Manager Attempted to create a file or registry key that already exists, when FILE_CREATE (for files) or equivalent was specified.
PRIVILEGE NOT HELD 0xC0000061 Security Reference Monitor (SRM) The process token lacks a required privilege (e.g., SeBackupPrivilege) for the operation.

3. Leveraging the Interpreting Process Monitor Results Article:

For a comprehensive catalog and detailed explanation of specific Result codes (NTSTATUS values), their meanings, common causes, and potential origins (including the crucial role of filter drivers and core Windows components like the Object Manager or Security Reference Monitor), refer to the Interpreting Process Monitor Results articlearticle.

4. Using Procmon Context for Inference:

To accurately determine the source and meaning of a Result code in a specific trace, it's essential to use the surrounding context provided by Procmon, in conjunction with the detailed knowledge from the Interpreting Process Monitor Results article:

  • Call Stack: As discussed in II.E.5, the modules present in the call stack, especially those near PROCMONXX.SYS or at the top of the stack when the error is returned, are strong indicators of the component that generated the result.
  • Surrounding Events:
    • Retries: Does the application attempt the same operation multiple times after a failure? This can indicate transient issues or an application's error handling logic.
    • Subsequent Operations: What does the application do after receiving a specific result? Does it try an alternative path? Does it query for more information (e.g., querying file attributes after a CreateFile fails)? Does it log an error or terminate?29
  • Duration Column: An unusually long duration before a SUCCESS or a failure might indicate contention, network latency, a slow driver, or complex processing by an intermediate component before the final result is determined.
  • Detail Column: This column provides operation-specific parameters (e.g., Desired Access flags, Disposition, Options for CreateFile; Type for RegQueryValueKey). Comparing these parameters with the object's actual state or permissions can often explain the result. For example, if Desired Access requests DELETE permission, but the file's security descriptor (DACL) doesn't grant this to the process, an ACCESS DENIED result is expected.29

An NTSTATUS code like STATUS_ACCESS_DENIED is merely a symptom; it indicates that access was denied but doesn't inherently reveal by whom or precisely why. the Interpreting Process Monitor Results article will elucidate the general meanings and common origins of such codes. Procmon's true diagnostic power emerges when this code is analyzed alongside the call stack (pinpointing involved modules), the Detail column (showing request parameters), Procmon's altitude settings (which might reveal or hide intermediate filter drivers), and the sequence of surrounding events. This holistic view enables the analyst to progress from "the operation failed with code X" to a more precise diagnosis like "the operation failed with code X because filter driver Y intercepted the call made with parameters Z, originating from process P." The Result column is thus a starting point, and its interpretation requires synthesizing information from multiple Procmon features, underpinned by an understanding of Windows internals and the specifics of NTSTATUS codes.

III. Advanced Procmon Usage and Troubleshooting Techniques

Beyond basic event viewing and filtering, Procmon offers several advanced features and methodologies that are indispensable for complex troubleshooting scenarios.

A. Boot Logging

Boot logging allows Procmon to capture system activity from the very early stages of the Windows boot process, continuing through driver initialization, service startup, and user login.1 This is invaluable for:

  • Diagnosing issues that occur during boot or shutdown.
  • Identifying causes of slow boot or login times.
  • Detecting early-stage malware activity or persistence mechanisms that execute at startup.40
  • Troubleshooting service or driver failures that prevent normal system operation.

Enabling Boot Logging:

To enable boot logging, navigate to Options -> Enable Boot Logging in the Procmon menu.27 Procmon will then configure its driver (PROCMONXX.SYS) to start logging events automatically upon the next system reboot. Options may be available to also generate profiling events (periodic thread stack dumps) during boot logging, which can aid in performance analysis.

Collecting and Analyzing the Trace:

After enabling boot logging and rebooting the system, log in as usual. Once the desktop is loaded (or when ready to collect the log), run Procmon.exe again. Procmon will detect that boot log data (typically saved to a file like C:\Windows\Bootlog.pml) exists and will prompt to save it to a new .PML file.38

Boot logs can be extremely large, often containing tens or hundreds of millions of events. Effective filtering is absolutely essential for analysis. Key areas to investigate in a boot log include:

  • Processes that terminate unexpectedly or return error codes during startup.
  • Errors (Result codes other than SUCCESS or expected informational codes) occurring during the initialization phases of critical system drivers or services.
  • Unusual file or registry access patterns, such as unexpected writes to system areas or autorun locations, which might indicate malware persistence attempts.
  • Long delays between events or operations with high Duration values, which can pinpoint boot performance bottlenecks.

B. Process Tree View

The Process Tree view provides a hierarchical representation of all processes that were active and captured during the Procmon trace, illustrating parent-child relationships.1

Accessing and Using the Process Tree:

The Process Tree is accessed via Tools -> Process Tree or by pressing Ctrl+T. The window displays processes in a tree structure, where child processes are nested under their parent process. This view is highly useful for:

  • Quickly understanding the lineage of processes (e.g., seeing that services.exe launched svchost.exe, which in turn launched another service's executable).
  • Visually identifying process chains, which can be important in malware analysis (e.g., Word document spawning PowerShell, which then spawns a suspicious executable).
  • Identifying processes that were created and terminated during the trace.

Filtering from the Process Tree:

A powerful feature of the Process Tree is the ability to quickly filter the main Procmon event display based on a selected process in the tree. Right-clicking on a process in the tree offers options such as:

  • Add process to Include filter: This action filters the main event list to show only events generated by the selected process.
  • Add process and children to Include filter: This filters the main event list to show events from the selected process and all of its descendants in the process tree. This is an extremely efficient way to isolate the activity of a specific application and any processes it may have launched, significantly reducing noise in the trace.42

C. Duration Analysis and Performance

The Duration column in Procmon is a key metric for identifying performance bottlenecks.21 For synchronous operations, this column displays the time elapsed between Procmon logging the pre-operation event and the post-operation event. The unit is typically seconds, often with microsecond precision.

Identifying Bottlenecks with Duration:

Sorting the event list by the Duration column in descending order quickly highlights the operations that took the longest to complete. These can be indicative of:

  • Disk I/O bottlenecks: Slow physical disks, high disk queue lengths, or excessive seeking.
  • Network latency: For operations involving remote file access or network communication (e.g., TCP Send, TCP Receive, ReadFile on a network share). The duration will include network round-trip times.
  • CPU-intensive operations within a driver or kernel component: A filter driver performing complex analysis or a poorly optimized kernel routine.
  • Overhead from filter drivers: Security software (AV, EDR), encryption drivers, or backup agents can add significant latency to I/O operations.
  • Resource contention: Waiting for locks or other shared resources.

Interpreting Duration:

Context is crucial when evaluating Duration values. A 0.5-second duration for reading a small registry value is extremely high, whereas for reading a multi-megabyte file over a slow network, it might be acceptable.

  • Compare durations for similar operations on similar resources.
  • Look for outliers: operations with durations significantly longer than the norm.
  • Consider the impact on user experience: even small delays in frequently executed operations on a critical path can lead to perceived sluggishness.
  • For file operations, the Offset and Length details in the Detail column are important. A long duration for reading a large chunk of a file is different from a long duration for reading a few bytes.

Tools -> Count Occurrences...:

This dialog (Tools -> Count Occurrences...) provides frequency statistics for unique values within any selected column.43 It is a powerful adjunct to duration analysis.

  • Usage: Select a column (e.g., Operation, Path, Process Name, Result) and click Count. Procmon will display a list of unique values found in that column for the currently filtered events, along with the number of times each value occurred.
  • Performance Insight: While not directly measuring time, Count Occurrences can reveal "death by a thousand cuts" scenarios. An application might perform an excessive number of individually fast operations, leading to cumulative performance degradation. For example:
    • Counting Path occurrences for a slow application might reveal it's reading the same small configuration file thousands of times.
    • Counting Operation occurrences might show an unexpectedly high number of RegQueryValueKey calls.
    • Counting Result occurrences can quickly show the prevalence of errors like ACCESS DENIED or NAME NOT FOUND.53

Performance analysis in Procmon often requires looking at both individual operation Duration and the Count Occurrences of operations. A high count of individually fast operations can be as detrimental as a few very slow operations. For example, an application reading a large file one byte at a time would show many quick ReadFile events, but the overall time to read the file would be substantial. Count Occurrences on the Path for that specific file would highlight the excessive number of operations.

D. Identifying Filter Driver Influence

Filter drivers (especially file system and network filters) are common sources of application compatibility issues, performance degradation, and unexpected behavior. Procmon is a primary tool for identifying their influence. Key techniques include:

1. Observing Filter Driver Modules in Stack Traces: The most direct method. If a third-party driver (e.g., VendorAV.sys, EncryptionFilter.sys) appears in the call stack for an operation, particularly if it's associated with an error, a long duration, or is unexpected, it's clearly involved. This requires properly configured symbols (see II.E.2).3

2. Correlating Procmon Activity with fltmc instances Output:

  • Run fltmc instances in an administrative command prompt. This command lists all currently loaded file system minifilter drivers, their assigned altitudes, and instance information.3
  • Compare this list with modules observed in Procmon stack traces. If a filter listed by fltmc is in an altitude range relevant to the observed issue but isn't appearing in stack traces, consider adjusting Procmon's altitude (see I.C.4).

3. Analyzing Result Codes Known to be Frequently Returned by Filters: Certain NTSTATUS codes, while standard, are often returned by specific types of filter drivers. For example, security filters might return ACCESS DENIED, or backup filters might cause SHARING VIOLATION or FILE_LOCKED_WITH_ONLY_READERS. the Interpreting Process Monitor Results article on Result codes is essential here.

4. Observing Unexpected Operation Sequences or Retries: If an application attempts an operation, it fails, and then it immediately retries (sometimes multiple times), or if it performs a series of unusual preparatory queries before an operation, a filter driver might be interfering with the normal flow.

5. Methodically Adjusting Procmon's Altitude: As detailed in Section I.C, lowering Procmon's altitude can reveal the activity of filters operating below its default position. If new filter driver modules appear in call stacks when Procmon's altitude is lowered, and the behavior or result of an operation changes concurrently, this strongly implicates those newly visible filters.3

6. Methodically Disabling/Uninstalling Third-Party Software: If a specific third-party application known to install filter drivers (e.g., antivirus, endpoint security suites, disk encryption tools, backup software) is suspected of causing an issue, temporarily disabling or uninstalling that software (ideally in a controlled test environment) can help confirm its filter's involvement. Comparing Procmon traces taken before and after the disable/uninstall can pinpoint the differing behaviors.

E. Common Troubleshooting Scenarios

The techniques described can be applied to a wide range of diagnostic scenarios.

1. Application Crashes/Failures:

  • Technique: Start by filtering for the crashing application's process name. Examine the events immediately preceding the process termination (often indicated by a "Process Exit" event, possibly with an error code in the Detail column, or by correlating with WerFault.exe activity if Windows Error Reporting is involved).
  • Result Codes: Look for critical errors like ACCESS DENIED, OBJECT_NAME_NOT_FOUND, SHARING_VIOLATION, INVALID_HANDLE on essential files, registry keys, or DLLs.
  • Stack Trace Analysis: If Procmon captures an event that directly leads to an unhandled exception (e.g., an access violation during a file read), the call stack for that event can be invaluable. It might point to the faulting module or a module that passed invalid data to a system call.30
  • Missing Dependencies: Look for NAME_NOT_FOUND results on Load Image operations (Procmon's way of showing DLL loads) or on CreateFile operations attempting to open DLL files.

2. File Access Denied/Sharing Violations:

  • Technique: Filter for Result is ACCESS DENIED or Result is SHARING VIOLATION.18 Also include the process name of interest.
  • Detail Column: For CreateFile operations resulting in these errors, examine the Detail column to see the Desired Access (e.g., Read, Write, Delete), ShareMode (e.g., Read, Write), and Disposition (e.g., Open, Create, Overwrite) requested by the application. An ACCESS DENIED may occur if the requested access rights conflict with the file's security descriptor (DACL). A SHARING VIOLATION occurs if the requested share mode conflicts with how the file is already opened by another handle (possibly in the same process or a different one).
  • Call Stack & Altitude: Check the call stack to see if a filter driver (e.g., antivirus, data loss prevention, encryption) is returning the denial. If a filter is suspected but not visible, adjust Procmon's altitude (see I.C.4).
  • Process Tree/Other Tools: Use Tools -> Process Tree (Ctrl+T) to identify other running processes. Tools like Process Explorer or Handle (also from Sysinternals) can then be used to see which process has a handle open to the problematic file and with what access/share modes.

3. Registry Access Issues:

  • Technique: Filter for the relevant process name and for registry operations (Event Class is Registry) with Result codes such as ACCESS DENIED, NAME_NOT_FOUND, or PRIVILEGE NOT HELD.
  • Common Causes:
    • Application trying to write to a protected registry key (e.g., under HKLM\SYSTEM or HKLM\SOFTWARE) without sufficient privileges (e.g., not running as administrator).
    • Application trying to read a key or value that does not exist (NAME_NOT_FOUND).
    • Application requiring a specific privilege (e.g., SeRestorePrivilege for certain hive operations) that its token does not possess.
  • Call Stack: Can indicate if registry virtualization (e.g., UAC virtualization) or security software is intercepting and modifying registry access.

4. Slow Application Startup/Performance:

  • Technique:
    • For system-wide slow startup or slow user login, enable boot logging (see III.A).27
    • For application-specific slowness, start Procmon capture immediately before launching the application and stop it once the application is fully loaded or the slow operation completes.
  • Filtering: Filter for the application's process name(s).
  • Duration Column: Sort by Duration (descending) to find the single most time-consuming operations.45 These are immediate candidates for investigation.
  • Tools -> Count Occurrences...: Use this to identify operations that are executed an excessive number of times, even if individually fast (e.g., thousands of reads from the same configuration file, or excessive registry queries).
  • Specific Operations: Look for long delays in Load Image operations (slow DLL loading), TCP Connect (slow network resource access), or lengthy file reads/writes to specific paths.
  • Stack Traces for Slow Events: Analyze call stacks for high-duration events. This can reveal if specific drivers (especially third-party filters) or inefficient code paths are contributing to the delays.

5. Suspected Malware Activity Patterns:

Procmon can be instrumental in dynamic malware analysis by revealing characteristic malicious behaviors.56

  • Technique: Often involves looking for known indicators of compromise (IOCs) or common malware tactics:
    • Persistence Mechanisms:
      • Registry: Writing to Run, RunOnce, Userinit, Shell keys (e.g., HKCU\Software\Microsoft\Windows\CurrentVersion\Run). Filter for these key paths and write operations.
      • File System: Dropping executables or scripts into Startup folders (user or common), creating scheduled tasks (Procmon might see the schtasks.exe execution or direct registry writes for tasks). Filter for these paths.
      • Boot logging is crucial for detecting persistence mechanisms that execute early in the boot process.27
    • Evasion/Stealth:
      • Process Injection: While Procmon may not show the act of injection itself, it can show the effects, such as a legitimate process (e.g., explorer.exe, svchost.exe) suddenly making unexpected network connections, dropping files, or modifying sensitive registry keys.
      • Attempts to Disable Security Software: Look for operations (especially writes or deletes) targeting files, directories, or registry keys associated with antivirus products or other security tools.
    • Command and Control (C2) Communication:
      • Unexpected network connections (TCP Connect, UDP Send) by processes that typically shouldn't have network activity, especially to unusual IP addresses, domains, or non-standard ports.
    • Data Exfiltration: Sequences of extensive file reads (especially from user document folders, databases, etc.) followed by network send operations.
    • Lateral Movement: Attempts to access network shares, enumerate other systems, or use tools like PsExec.exe.
  • Other Indicators:
    • Processes running from unusual locations (e.g., C:\Users\<user>\AppData\Local\Temp, C:\Windows\Temp, recycled bin).
    • Suspicious process parent-child relationships (e.g., winword.exe spawning cmd.exe or powershell.exe). The Process Tree view (Ctrl+T) is excellent for visualizing this.
    • File operations that create hidden files or alternate data streams (ADS).

Troubleshooting complex system issues or analyzing unknown software behavior with Procmon is rarely a linear process. It typically involves an iterative cycle of observation, hypothesis formation, filter refinement, and detailed event examination. An analyst might start with broad filters (e.g., focusing on a specific process or time window), observe initial patterns (such as frequent errors or operations with long durations), and then form a hypothesis (e.g., "the application appears to be struggling with network access to a specific server"). This hypothesis then guides the refinement of filters (e.g., including only network operations to that server, looking for specific error codes like HOST NOT FOUND or CONNECTION TIMEOUT). Examination of call stacks for the suspect operations, coupled with tools like Count Occurrences or sorting by Duration, provides further data. If filter drivers are suspected, adjusting Procmon's altitude might be the next step. This iterative approach, combining Procmon's features with a solid understanding of Windows internals, is key to effective diagnostics. The scenarios outlined above serve as starting points for this investigative process, rather than rigid checklists.

Works cited

  1. Process Monitor - Sysinternals | Microsoft Learn, accessed May 13, 2025, https://learn.microsoft.com/en-us/sysinternals/downloads/procmon
  2. The Ultimate Guide to Procmon: Everything You Need to Know, accessed May 13, 2025, https://www.varonis.com/blog/procmon
  3. Change Altitude of Process Monitor (ProcMon) | Microsoft ..., accessed May 13, 2025, https://techcommunity.microsoft.com/blog/askperf/change-altitude-of-process-monitor-procmon/2118159
  4. How To: Run Process Monitor With Reduced Altitude - SAP ..., accessed May 13, 2025, https://community.sap.com/t5/technology-blogs-by-sap/how-to-run-process-monitor-with-reduced-altitude/ba-p/13484744
  5. Processing I/O Operations - Windows drivers | Microsoft Learn, accessed May 13, 2025, https://learn.microsoft.com/en-us/windows-hardware/drivers/ifs/processing-i-o-operations
  6. A Quick Dive into File System Filtering - VulnerX, accessed May 13, 2025, https://vulnerx.com/windows-minifilter-file-system-drivers/
  7. Allocated Filter Altitudes - Windows drivers | Microsoft Learn, accessed May 13, 2025, https://learn.microsoft.com/en-us/windows-hardware/drivers/ifs/allocated-altitudes
  8. CmRegisterCallbackEx function (wdm.h) - Windows drivers ..., accessed May 13, 2025, https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/wdm/nf-wdm-cmregistercallbackex
  9. PsSetCreateProcessNotifyRoutineEx function (ntddk.h) - Windows ..., accessed May 13, 2025, https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/ntddk/nf-ntddk-pssetcreateprocessnotifyroutineex
  10. Subscribing to Process Creation, Thread Creation and Image Load Notifications from a Kernel Driver | Red Team Notes, accessed May 13, 2025, https://www.ired.team/miscellaneous-reversing-forensics/windows-kernel-internals/subscribing-to-process-creation-thread-creation-and-image-load-notifications-from-a-kernel-driver
  11. Winsock Tracing - Win32 apps | Microsoft Learn, accessed May 13, 2025, https://learn.microsoft.com/en-us/windows/win32/winsock/winsock-tracing
  12. Kernel-Mode Driver Architecture Design Guide - Windows drivers | Microsoft Learn, accessed May 13, 2025, https://learn.microsoft.com/en-us/windows-hardware/drivers/kernel/
  13. Chapter 21: Windows 10, accessed May 13, 2025, https://www.cs.hunter.cuny.edu/~sweiss/course_materials/csci340/slides/chapter21.pdf
  14. Windows kernel - Windows drivers | Microsoft Learn, accessed May 13, 2025, https://learn.microsoft.com/en-us/windows-hardware/drivers/ddi/_kernel/
  15. Change the altitude of Process Monitor for troubleshooting purposes - Sophos Support, accessed May 13, 2025, https://support.sophos.com/support/s/article/KBA-000006304
  16. Setting ProcMon to run at a lower altitude to capture other filter drivers - Citrix Support, accessed May 13, 2025, https://support.citrix.com/s/article/CTX222210-setting-procmon-to-run-at-a-lower-altitude-to-capture-other-filter-drivers?language=en_US
  17. How To Use Procmon Track Low Level Driver - 路遥之家, accessed May 13, 2025, https://crushonme.github.io/wiki/How-To-Use-Procmon-Track-Low-Level-Driver/
  18. Process Monitor (ProcMon) installation and usage guide - Thomson Reuters, accessed May 13, 2025, https://www.thomsonreuters.com/content/helpandsupp/en-us/help/ultratax-cs/troubleshoot-installation-issues/installer/process-monitor-procmon-installation.html
  19. How close is WinDBG Preview to an everyday debugger? - Casey Muratori, accessed May 13, 2025, https://caseymuratori.com/blog_0033
  20. The Cure for Your Software Debugging: Part 3 of 3 - BitTitan, accessed May 13, 2025, https://www.bittitan.com/blog/industry-info/the-cure-for-your-software-debugging-part-3-of-3/
  21. Overview of the profiling tools - Visual Studio (Windows) | Microsoft Learn, accessed May 13, 2025, https://learn.microsoft.com/en-us/visualstudio/profiling/profiling-feature-tour?view=vs-2022
  22. Process Monitor - Documentation & Help, accessed May 13, 2025, https://documentation.help/Process-Monitor/documentation.pdf
  23. Understanding Process Monitor, accessed May 13, 2025, https://forums.ivanti.com/servlet/fileField?entityId=ka14O000000LfYq&field=File_attachment__Body__s
  24. Process Monitor - Webex Help Center, accessed May 13, 2025, https://help.webex.com/article/WBX000026390/Process-Monitor
  25. Process Monitor Filters for Malware Analysis and Forensics - Lenny Zeltser, accessed May 13, 2025, https://zeltser.com/process-monitor-filters-for-malware-analysis/
  26. Basic Steps for Making a Process Monitor (ProcMon) Capture | Microsoft Community Hub, accessed May 13, 2025, https://techcommunity.microsoft.com/blog/iis-support-blog/basic-steps-for-making-a-process-monitor-procmon-capture/348401
  27. Process Monitor (ProcMon) Tutorial - David Maiolo, accessed May 13, 2025, https://www.davidmaiolo.com/2018/03/12/process-monitor-procmon-tutorial/
  28. Efficient Windows troubleshooting: Identifying relevant event logs with Process Monitor, accessed May 13, 2025, https://www.theexperienceblog.com/2024/08/26/efficient-windows-troubleshooting-identifying-relevant-event-logs-with-process-monitor/
  29. Event Properties - Process Monitor - Documentation & Help, accessed May 13, 2025, https://documentation.help/Process-Monitor/Event_Properties.htm
  30. Sysinternals: Process Monitor deep dive (demo) | ProcMon, registry, process, Windows | Microsoft - YouTube, accessed May 13, 2025, https://www.youtube.com/watch?v=9H0Dz3NbNYQ
  31. Process Explorer - How to make it point to local symbols - Stack Overflow, accessed May 13, 2025, https://stackoverflow.com/questions/22409640/process-explorer-how-to-make-it-point-to-local-symbols
  32. Advanced SymSrv Use - Windows drivers | Microsoft Learn, accessed May 13, 2025, https://learn.microsoft.com/en-us/windows-hardware/drivers/debugger/advanced-symsrv-use
  33. Setting ProcMon to run at a lower altitude to capture other filter drivers - Citrix Support, accessed May 13, 2025, https://support.citrix.com/article/CTX222210/setting-procmon-to-run-at-a-lower-altitude-to-capture-other-filter-drivers
  34. NTSTATUS - Fictional Memory, accessed May 13, 2025, http://kirkshoop.github.io/2011/09/20/ntstatus.html
  35. Use NTSTATUS Values - Windows drivers | Microsoft Learn, accessed May 13, 2025, https://learn.microsoft.com/en-us/windows-hardware/drivers/kernel/using-ntstatus-values
  36. Windows Kernel Driver Docs | PDF - Scribd, accessed May 13, 2025, https://www.scribd.com/document/498995833/Windows-Kernel-Driver-Docs
  37. Interpreting Process Monitor data - IBM, accessed May 13, 2025, https://www.ibm.com/docs/SSFPJS_8.5.7/com.ibm.wbpm.admin.doc/topics/rinterpret_procmon_results.html
  38. Use Process Monitor to create real-time event logs - ThreatDown Support, accessed May 13, 2025, https://support.threatdown.com/hc/en-us/articles/4413798945811-Use-Process-Monitor-to-create-real-time-event-logs
  39. How to collect a Process Monitor Boot Log to troubleshoot issues occurring at startup, accessed May 13, 2025, https://www.autodesk.com/support/technical/article/caas/sfdcarticles/sfdcarticles/How-to-collect-a-Process-Monitor-Boot-Log-to-troubleshoot-issues-occurring-at-startup.html
  40. 6 Common Persistence Mechanisms in Malware - ANY.RUN's Cybersecurity Blog, accessed May 13, 2025, https://any.run/cybersecurity-blog/6-persistence-mechanisms-in-malware/
  41. Exploring Processes Using Sysinternals - Open Source For You, accessed May 13, 2025, https://www.opensourceforu.com/2016/01/exploring-processes-using-sysinternals/
  42. Log runtime dependencies on Windows Server 2003 using Process Monitor, accessed May 13, 2025, https://docs.aws.amazon.com/emp/latest/userguide/emp-procmon-log-runtime-dependencies.html
  43. Manage KPIs - Appian 24.4, accessed May 13, 2025, https://docs.appian.com/suite/help/24.4/process-custom-kpis.html
  44. How to Perform a Bottleneck Analysis With Process Mining — Flux Capacitor - Fluxicon, accessed May 13, 2025, https://fluxicon.com/blog/2017/01/how-to-perform-a-bottleneck-analysis-with-process-mining/
  45. How to Troubleshoot Windows Slow Boot Time with Process Monitor - YouTube, accessed May 13, 2025, https://www.youtube.com/watch?v=DSaFAcVXQXc
  46. Scenario guide: Troubleshoot performance problems in Windows - Learn Microsoft, accessed May 13, 2025, https://learn.microsoft.com/en-us/troubleshoot/windows-server/performance/troubleshoot-performance-problems-in-windows
  47. Windows Internals, Part 1: System architecture, processes, threads, memory management, and more, accessed May 13, 2025, https://empyreal96.github.io/nt-info-depot/Windows-Internals-PDFs/Windows%20System%20Internals%207e%20Part%201.pdf
  48. Processes, Threads, and Jobs in the Windows Operating System | Microsoft Press Store, accessed May 13, 2025, https://www.microsoftpressstore.com/articles/article.aspx?p=2233328&seqNum=7
  49. Microsoft Fabric, Power BI, Analysis Services, DAX, M, MDX, Power Query, Power Pivot and Excel - Chris Webb's BI Blog, accessed May 13, 2025, https://blog.crossjoin.co.uk/page/42/?trackingcode=PB1&noamp=mobile
  50. Troubleshooting | The Experience Blog, accessed May 13, 2025, https://www.theexperienceblog.com/tag/troubleshooting/
  51. How to track element occurrences efficiently - LabEx, accessed May 13, 2025, https://labex.io/tutorials/python-how-to-track-element-occurrences-efficiently-420266
  52. OpenTelemetry Metrics Explained: A Guide for Engineers - Honeycomb, accessed May 13, 2025, https://www.honeycomb.io/blog/opentelemetry-metrics
  53. Troubleshoot Apps failing to start using Process Monitor - Windows Client | Microsoft Learn, accessed May 13, 2025, https://learn.microsoft.com/en-us/troubleshoot/windows-client/shell-experience/troubleshoot-apps-start-failure-use-process-monitor
  54. How To Use Process Monitoring In Windows 11 HTMD Blog - Anoop C Nair, accessed May 13, 2025, https://www.anoopcnair.com/how-to-use-process-monitoring-in-windows-11/
  55. Application Troubleshooting with ProcMon - YouTube, accessed May 13, 2025, https://www.youtube.com/watch?v=KL3KP9w84cI
  56. Windows Sysinternals Notes - dmfr security, accessed May 13, 2025, https://dmfrsecurity.com/2020/12/14/sysinternals/
  57. Detecting Malicious Software by Monitoring Anomalous Windows Registry Accesses, accessed May 13, 2025, https://cs.fit.edu/~pkc/id/related/apap-raid02.pdf
  58. PRACTICAL MALWARE ANALYSIS - Black Hat, accessed May 13, 2025, https://www.blackhat.com/presentations/bh-dc-07/Kendall_McMillan/Paper/bh-dc-07-Kendall_McMillan-WP.pdf
  59. How to Unpack Malware with x64dbg, accessed May 13, 2025, https://www.varonis.com/blog/x64dbg-unpack-malware