Windows 2012 R2 PoolMon


There are 3 different types of temporary storage that can be used by a driver such as

a) Kernel Stack

b) Non paged pool

c) Paged pool

Non Paged Pool: Driver routines running at elevated IRQL’s need to allocate temporary memory called as Non Paged pool. Non paged pool memory is always physically resident.

Paged Pool: Virtual memory available to the driver routines running below DISPATCH_LEVEL IRQL such as driver cleanup , driver initialization, dispatch routines and kernel mode threads.

The most common function to use is ExAllocatePool (which is obsolete) and should use ExAllocatePoolwithTag instead. At a high level ExAllocatePoolwithTag is similar to heapalloc or malloc at user mode programming. The tag is used to identify the block memory / blocks allocated by the driver. To track the pool usage using the tags, you need to enable pool tagging using gflags

Non paged pool and Paged pool memory usage can be viewed using Poolmon.exe. There are several memory debugging tools which can be used in adjacent with Poolmon such as Windbg, Perfmon etc. Poolmon.exe dynamically updates the output for every few seconds and users who are familiar with the commands still valid with Windows Server 2012 R2

P- Sorts tags list by Paged, non-paged and mixed

B- Sort tags by maximum byte usage

T – Sort tags by tag name

M – Sort tags by maximum byte allocation

E – Displays Total Non paged and paged pool allocation at the bottom of the poolmon.exe window

S – Sort tags with the difference of allocs and frees

Q – Quit

F – Sort by Free


Download the binaries by following below link and follow the instructions to download Poolmon.exe


This is straightforward, simply click poolmon.exe and run the above commands after it displays the allocations.

When To Use:

This is interesting question, Poolmon should be used in conjunction with Perfmon / Windbg to understand the issues related to system performance. Collect the data and analyse the trend before using poolmon. With the help of Perfmon, identify the nonpaged pool leaks and paged pool leaks and run the poolmon logs .

With the help of poolmon, identify which tag is consuming most bytes.

for Eg:

Tag  Type    Allocs          Frees         Diff   Bytes      Per Alloc


Test   Paged    1473 (   0)    1002 (   0)    281 1972392

ipdc  Paged   12485 (  10)    5648 (   4)   4027  40395

CM28  Paged    6662 (   8)    5571 (   6)   1691  1745

MmSt  Paged     614 (   0)     441 (   0)    173   83456

From the above example Test is consuming 1972392 bytes which is highest. Use findstr to find the driver associated with Test tag. When using Windbg debugger can use !poolused /t5 2 and then !for_each_module s -a @#Base @#End “Test” and then load module against the address ( lm <address ) to find the driver

Hope this helps !


DNS Resolution on Single NIC and Multiple IP’s

Who should read this : 

a) System Engineers

b) System Administrators

c) DNS Administrators

d) Active Directory Admins

e) Active Directory Technical Architects


Risk / Considerations: 

The changes below should be performed in the test environment and evaluate any dependent applications / hardcoded applications which are configured with the DNS and its behavior. The application behavior to be analyzed by the change includes, the DNS server response time, DNS Query forwarder and DNS Query failures.



DNS name resolution is most critical aspect of any IT infrastructure, whether it is Microsoft DNS / UNIX the protocol behavior does not change. One such scenario is discussed below between IT Manager Mark and System Engineer Shaun.


IT Manager [Mark]: Good morning Shaun, on the Windows Server 2012 R2 member server with single NIC ( Network Interface Card ) installed and multiple IP Addresses configured, i would like to control DNS name resolution based on IP Address , is that possible ?


System Engineer [Shaun]: Hi Mark, can you elaborate your question please


IT Manager [Mark]: Sure, on the Windows Server 2012 R2 member server which is also acting as DNS server, i see that there are two IP Addresses configured on single NIC

IP Address 1 [Private] =

IP Address 2 [Public] =

Any Private DNS name resolution should be resolved by and for any Public names ,the queries should be forwarded and resolved by , how do we achieve this ?


System Engineer [Shaun]: This is highly unlikely to be achieved, Mark. The reason is with single NIC, there is no way to define the binding. The closest work around is to set the DNS server address order under the NIC properties

Note: This setting should be performed for Static IP Addresses and not controlled by Group Policy

Step1 : Logon to the Windows Server 2012 R2 using Administrator account / account which has privileges to make modifications to NIC

Step2: Start –> Run –> NCPA.cpl

Step3: Navigate to Network Adapter to be configured , right click the adapter –> Properties –> Internet Protocol Version 4 –> Properties

Step4: Navigate Advance TCP/IP Settings as shown below and add the DNS Server addresses IP Address under “DNS Server addresses, in                           order to use” section as shown below



Step 5: Click Ok and close all the windows of the Network interface

Step 6: Open the command prompt and run IPConfig / flushdns and IPConfig /registerdns


DNS Server priority is determined by the order. If the first server isn’t available to respond to a host name resolution request, the next DNS server in the list is accessed, and so on. To change the position of a server in the list box, select it and then click the up or down arrow button