!address

The !address extension displays information about the memory that the target process or target computer uses.

User-Mode

!address Address
!address -summary 
!address [-f:F1,F2,...] {[-o:{csv | tsv | 1}] | [-c:"Command"]}
!address -? | -help

Kernel-Mode

!address Address 
!address

Parameters

Address
Displays only the region of the address space that contains Address.

-summary
Displays only summary information.

-f:F1, F2, ...
Displays only the regions specified by the filters F1, F2, and so on.

The following filter values specify memory regions by the way that the target process is using them.

Filter value Memory regions displayed

VAR

Busy regions. These regions include all virtual allocation blocks, the SBH heap, memory from custom allocators, and all other regions of the address space that fall into no other classification.

Free

Free memory. This includes all memory that has not been reserved.

Image

Memory that is mapped to a file that is part of an executable image.

Stack

Memory used for thread stacks.

Teb

Memory used for thread environment blocks (TEBs).

Peb

Memory used for the process environment block (PEB).

Heap

Memory used for heaps.

PageHeap

The memory region used for the full-page heap.

CSR

CSR shared memory.

Actx

Memory used for activation context data.

NLS

Memory used for National Language Support (NLS) tables.

FileMap

Memory used for memory-mapped files. This filter is applicable only during live debugging.

The following filter values specify memory regions by the memory type.

Filter value Memory regions displayed

MEM_IMAGE

Memory that is mapped to a file that is part of an executable image.

MEM_MAPPED

Memory that is mapped to a file that is not part of an executable image. This includes memory that is mapped to the paging file.

MEM_PRIVATE

Private memory. This memory is not shared by any other process, and it is not mapped to any file.

The following filter values specify memory regions by the state of the memory.

Filter value Memory regions displayed

MEM_COMMIT

Committed memory.

MEM_FREE

Free memory. This includes all memory that has not been reserved.

MEM_RESERVE

Reserved memory.

The following filter values specify memory regions by the protection applied to the memory.

Filter value Memory regions displayed

PAGE_NOACCESS

Memory that cannot be accessed.

PAGE_READONLY

Memory that is readable, but not writable and not executable.

PAGE_READWRITE

Memory that is readable and writable, but not executable.

PAGE_WRITECOPY

Memory that has copy-on-write behavior.

PAGE_EXECUTE

Memory that is executable, but not readable and not writeable.

PAGE_EXECUTE_READ

Memory that is executable and readable, but not writable.

PAGE_EXECUTE_READWRITE

Memory that is executable, readable, and writable.

PAGE_EXECUTE_WRITECOPY

Memory that is executable and has copy-on-write behavior.

PAGE_GUARD

Memory that acts as a guard page.

PAGE_NOCACHE

Memory that is not cached.

PAGE_WRITECOMBINE

Memory that has write-combine access enabled.

-o:{csv | tsv | 1}
Displays the output according to one of the following options.

Option Output format

csv

Displays the output as comma-separated values.

tsv

Displays the output as tab-separated values.

1

Displays the output in bare format. This format works well when !address is used as input to .foreach.

-c:"Command"
Executes a custom command for each memory region. You can use the following placeholders in your command to represent output fields of the !address extension.

Placeholder Output field

%1

Base address

%2

End address + 1

%3

Region size

%4

Type

%5

State

%6

Protection

%7

Usage

For example, !address -f:Heap -c:".echo %1 %3 %5" displays the base address, size, and state for each memory region of type Heap.

Quotes in the command must be preceded by a back slash (\"). For example, !address -f:Heap -c:"s -a %1 %2 \"pad\"" searches each memory region of type Heap for the string "pad".

Multiple commands separated by semicolons are not supported.

-?
Displays minimal Help text for this extension in the Debugger Command window.

DLL

Ext.dll

Additional Information

For more information about how to display and search memory, see Reading and Writing Memory. For additional extensions that display memory properties, see !vm (kernel mode) and !vprot (user mode).

Remarks

Without any parameters, the !address extension displays information about the whole address space. The !address -summary command shows only the summary.

In kernel mode, this extension searches only kernel memory, even if you used .process (Set Process Context) to specify a given process' virtual address space. In user mode, the !address extension always refers to the memory that the target process owns.

In user mode, !address Address shows the characteristics of the region that the specified address belongs to. Without parameters, !address shows the characteristics of all memory regions. These characteristics include the memory usage, memory type, memory state, and memory protection. For more information about the meaning of this information, see the earlier tables in the description of the -f parameter.

The following example uses !address to retrieve information about a region of memory that is mapped to kernel32.dll.

0:000> !address 75831234
Usage:                  Image
Base Address:           75831000
End Address:            758f6000
Region Size:            000c5000
Type:                   01000000MEM_IMAGE
State:                  00001000MEM_COMMIT
Protect:                00000020PAGE_EXECUTE_READ
More info:              lmv m kernel32
More info:              !lmi kernel32
More info:              ln 0x75831234

This example uses an Address value of 0x75831234. The display shows that this address is in a memory region that begins with the address 0x75831000 and ends with the address 0x758f6000. The region has usage Image, type MEM_IMAGE, state MEM_COMMIT, and protection PAGE_EXECUTE_READ. (For more information about the meaning of these values, see the earlier tables.) The display also lists three other debugger commands that you can use to get more information about this memory address.

If you are starting with an address and trying to determine information about it, the usage information is frequently the most valuable. After you know the usage, you can use additional extensions to learn more about this memory. For example, if the usage is Heap, you can use the !heap extension to learn more.

The following example uses the s (Search Memory) command to search each memory region of type Image for the wide-character string "Note".

!address /f:Image /c:"s -u %1 %2 \"Note\""

*** Executing: s -u 0xab0000 0xab1000 "Note"
*** Executing: s -u 0xab1000 0xabc000 "Note"
00ab2936  004e 006f 0074 0065 0070 0061 0064 0000  N.o.t.e.p.a.d...
00ab2f86  004e 006f 0074 0065 0070 0061 0064 005c  N.o.t.e.p.a.d.\.
00ab32e4  004e 006f 0074 0065 0070 0061 0064 0000  N.o.t.e.p.a.d...
*** Executing: s -u 0xabc000 0xabd000 "Note"
. . .

In kernel mode, the output of !address is similar to the user mode output but contains less information. The following example shows the kernel mode output.

kd> !address
  804de000 - 00235000                           
 Usage       KernelSpaceUsageImage
          ImageName   ntoskrnl.exe

  80c00000 - 001e1000
          Usage       KernelSpaceUsagePFNDatabase

....

  f85b0000 - 00004000
          Usage       KernelSpaceUsageKernelStack
          KernelStack 817b4da0 : 324.368

 f880d000 - 073d3000
          Usage       KernelSpaceUsageNonPagedPoolExpansion

The meaning of "usage" is the same as in user mode. "ImageName" indicates the module that is associated with this address. "KernelStack" shows the address of this thread's ETHREAD block (0x817B4DA0), the process ID (0x324), and the thread ID (0x368).