The !for_each_module extension executes a debugger command one time for each loaded module.

!for_each_module ["CommandString"]
!for_each_module -?



Specifies the debugger commands to execute one time for each module in the debugger's module list. If CommandString includes multiple commands, you must separate them with semicolons and enclose CommandString in quotation marks. If you include multiple commands, the individual commands within CommandString cannot contain quotation marks.

You can use the following aliases in CommandString or in any script that the commands in CommandString executes.

AliasData typeValue



The file version of the module.



The product version of the module.



The module number. Modules are enumerated consecutively, starting with zero.



The module name. This name is typically the file name without the file name extension. In some situations, the module name differs significantly from the file name.



The name of the executable file, including the file name extension. Typically, the full path is included in user mode but not in kernel mode.



Unless Microsoft CodeView symbols are present, this alias is the same as the image name.



In most situations, this alias is NULL. If the debugger is mapping an image file (for example, during minidump debugging), this alias is the name of the mapped image.



The path and name of the symbol file. If you have not loaded any symbols, this alias is the name of the executable file instead.



The string length of the module name string, plus one.



The string length of the image name string, plus one.



The string length of the loaded image name string, plus one.



The string length of the mapped image name string, plus one.



The string length of the symbol file name string, plus one.



The address of the start of the image.



The size of the image, in bytes.



The address of the end of the image.



The time and date stamp of the image. If you want to expand this time and date stamp into a readable date, use the .formats (Show Number Formats) command.



The checksum of the module.



The module flags. For a list of the DEBUG_MODULE_Xxx values, see Dbgeng.h.



The symbol type. For a list of the DEBUG_SYMTYPE_Xxx values, see Dbgeng.h.


These aliases are all replaced before CommandString is executed for each module and before any other parsing occurs. These aliases are case sensitive. You must add a space before the alias and a space after it, even if the alias is enclosed in parentheses. If you use C++ expression syntax, you must reference these aliases as @@( @#alias).

These aliases are available only during the lifetime of the call to !for_each_module. Do not confuse them with pseudo-registers, fixed-name aliases, or user-named aliases.


Displays some Help text for this extension in the Debugger Command window.


Windows 2000


Windows XP and later



Additional Information

For more information about how to define and use aliases as shortcuts for entering character strings (including use of the ${ } token), see Using Aliases.


If you do not specify any arguments, the !for_each_module extension displays general information about the loaded modules. This information is similar to the information that the following command shows.

!for_each_module .echo @#ModuleIndex : @#Base @#End @#ModuleName @#ImageName  @#LoadedImageName

For more information about loaded and unloaded modules, use the lm (List Loaded Modules) command.

If you enable verbose debugger output, the debugger displays the total number of loaded and unloaded modules when the extension is called, and the debugger displays detailed information about each module (including the values of each available alias) before CommandString is executed for that module.

The following examples show how to use the !for_each_module extension. The following commands display the global debug flags.

!for_each_module x ${@#ModuleName}!*Debug*Flag*
!for_each_module x ${@#ModuleName}!g*Debug*

The following command checks for binary corruption in every loaded module, by using the !chkimg extension:

!for_each_module !chkimg @#ModuleName

The following command searches for the pattern "MZ" in every loaded image.

!for_each_module s-a @#Base @#End "MZ"

The following example demonstrates the use of @#FileVersion and @#ProductVersion for each module name:

0:000> !for_each_module .echo @#ModuleName fver = @#FileVersion pver = @#ProductVersion 
USER32 fver = 6.0.6000.16438 (vista_gdr.070214-1610) pver = 6.0.6000.16438
kernel32 fver = 6.0.6000.16386 (vista_rtm.061101-2205) pver = 6.0.6000.16386
ntdll fver = 6.0.6000.16386 (vista_rtm.061101-2205) pver = 6.0.6000.16386
notepad fver = 6.0.6000.16386 (vista_rtm.061101-2205) pver = 6.0.6000.16386
WINSPOOL fver = 6.0.6000.16386 (vista_rtm.061101-2205) pver = 6.0.6000.16386
COMCTL32 fver = 6.10 (vista_rtm.061101-2205) pver = 6.0.6000.16386
SHLWAPI fver = 6.0.6000.16386 (vista_rtm.061101-2205) pver = 6.0.6000.16386
msvcrt fver = 7.0.6000.16386 (vista_rtm.061101-2205) pver = 7.0.6000.16386
GDI32 fver = 6.0.6000.16386 (vista_rtm.061101-2205) pver = 6.0.6000.16386
RPCRT4 fver = 6.0.6000.16525 (vista_gdr.070716-1600) pver = 6.0.6000.16525
SHELL32 fver = 6.0.6000.16513 (vista_gdr.070626-1505) pver = 6.0.6000.16513
ole32 fver = 6.0.6000.16386 (vista_rtm.061101-2205) pver = 6.0.6000.16386
ADVAPI32 fver = 6.0.6000.16386 (vista_rtm.061101-2205) pver = 6.0.6000.16386
COMDLG32 fver = 6.0.6000.16386 (vista_rtm.061101-2205) pver = 6.0.6000.16386



Send comments about this topic to Microsoft