The !dso Debugger Extension Command

The USEREXTS debugger extension as supplied with the Device Driver Kit (DDK) for both Windows NT 4.0 and Windows 2000 exports a dso function and thus supports a !dso command.

The !dso command is in some sense an early form of what Microsoft’s debuggers would soon offer as the built-in dt command. A key difference is that the dt command dumps from type information in whatever symbol files the debugger has handy (or can download) but the !dso command dumps only the debugger extension’s built-in knowledge.

The extension’s own description of the !dso command is variously:

dso <Struct> [Field] [Address]- Dumps Struct field(s)'s offset(s) and value(s).

or

dso <Struct> [Field] [addr [*n]]-Dumps Struct field(s)'s offsets(s) & value(s).

It is not this note’s purpose, however, to pick over the syntax of an old command. The point is instead to note that in the years before Microsoft built type information into public symbol files, the !dso command was often the most detailed public record (by far) that Microsoft left of undocumented Windows structures. Not all the structures that are known to the !dso command are undocumented, but many are, including some for which type information has hardly ever (and in some few cases never) turned up in public symbol files even through to Windows 10.

The large table that follows lists the structures whose offsets can be dumped by the !userexts.dso command. Please be aware that a different !dso command is implemented in another debugger extension, named USERKDX, which Microsoft at first distributed only with the Platform SDK from the time of Windows NT 4.0, not with the contemporaneous DDK. Inevitably, the same command in the other extension supports a different set of structures.

Structure Versions
ACCEL 4.0 and 5.0
ADVISE_LINK 5.0 only
ANIMATIONINFO 4.0 and 5.0
ATTR_PAIR 5.0 only
ATTR_ROW 5.0 only
BITMAP 4.0 and 5.0
BITMAPCOREHEADER 4.0 and 5.0
BITMAPCOREINFO 4.0 and 5.0
BITMAPFILEHEADER 4.0 and 5.0
BITMAPINFO 4.0 and 5.0
BITMAPINFOHEADER 4.0 and 5.0
BITMAPV4HEADER 4.0 and 5.0
BUTN 5.0 only
BUTNWND 5.0 only
CALLPROCDATA 4.0 and 5.0
CANDIDATEFORM 5.0 only
CANDIDATEINFO 5.0 only
CANDIDATELIST 5.0 only
CAPTUREBUF 4.0 and 5.0
CARET 4.0 and 5.0
CBOX 4.0 and 5.0
CHAR_ROW 5.0 only
CHWIDTHINFO 5.0 only
CLIENTCREATESTRUCT 4.0 and 5.0
CLIENTIMC 5.0 only
CLIENTINFO 4.0 and 5.0
CLIENTTHREADINFO 4.0 and 5.0
CLS 4.0 and 5.0
CLSMENUNAME 4.0 and 5.0
CL_CONV_INFO 5.0 only
CL_INSTANCE_INFO 5.0 only
COMBOWND 4.0 and 5.0
COMMCONFIG 4.0 and 5.0
COMMON_WNDCLASS 4.0 and 5.0
COMPOSITIONFORM 5.0 only
COMPOSITIONSTRING 5.0 only
CONSOLEDESKTOPCONSOLETHREAD 4.0 and 5.0
CONSOLEWINDOWSTATIONPROCESS 4.0 and 5.0
CONSOLE_CURSOR_INFO 4.0 and 5.0
CONSOLE_FONT_INFO 4.0 and 5.0
CONSOLE_GRAPHICS_BUFFER_INFO 4.0 and 5.0
CONSOLE_INFORMATION 5.0 only
CONSOLE_READCONSOLE_CONTROL 4.0 and 5.0
CONSOLE_SCREEN_BUFFER_INFO 4.0 and 5.0
CONSOLE_WRITECONSOLE_MSG 5.0 only
CONV_INFO 5.0 only
COPYDATASTRUCT 5.0 only
CPINFO 4.0 and 5.0
CPTABLEINFO 4.0 and 5.0
CREATESTRUCTA 4.0 and 5.0
CREATESTRUCTW 4.0 and 5.0
CSR_API_MSG 5.0 only
CSR_PROCESS 5.0 only
CSR_THREAD 5.0 only
CSR_WAIT_BLOCK 5.0 only
CSTRING 4.0 and 5.0
CTLCOLOR 4.0 and 5.0
CURSORDATA 4.0 and 5.0
CURSORFIND 4.0 and 5.0
CURSORRESOURCE 4.0 and 5.0
CURSORSHAPE 4.0 and 5.0
CWPRETSTRUCT 4.0 and 5.0
CWPSTRUCT 4.0 and 5.0
DDEACK 4.0 and 5.0
DDEADVISE 4.0 and 5.0
DDEDATA 4.0 and 5.0
DDELN 4.0 and 5.0
DDEMLDATA 4.0 and 5.0
DDEML_MSG_HOOK_DATA 4.0 and 5.0
DDEPACK 4.0 and 5.0
DDEPOKE 4.0 and 5.0
DDEUP 4.0 and 5.0
DDE_DATA 4.0 and 5.0
DDE_MESSAGE_QUEUE 4.0 and 5.0
DEADKEY 4.0 and 5.0
DEBUGHOOKINFO 4.0 and 5.0
DELETEITEMSTRUCT 4.0 and 5.0
DESKTOPINFO 4.0 and 5.0
DIALOG 4.0 and 5.0
DISPLAYINFO 4.0 and 5.0
DISPLAYRESOURCE 4.0 only
DISPLAY_DEVICEA 4.0 and 5.0
DISPLAY_DEVICEW 4.0 and 5.0
DLG 4.0 and 5.0
DLGENUMDATA 4.0 and 5.0
DLGITEMTEMPLATE 4.0 and 5.0
DLGITEMTEMPLATE2 4.0 and 5.0
DLGTEMPLATE 4.0 and 5.0
DLGTEMPLATE2 4.0 and 5.0
DRAWICONEXDATA 4.0 and 5.0
DRAWITEMSTRUCT 4.0 and 5.0
DRAWTEXTPARMS 4.0 and 5.0
DROPFILESTRUCT 4.0 and 5.0
ED 4.0 and 5.0
EDITWND 4.0 and 5.0
ENABLE_ENUM_STRUCT 5.0 only
ENDDLGPARAMS 5.0 only
EPROCESS 4.0 and 5.0
EPROCESS_QUOTA_BLOCK 4.0 and 5.0
ERESOURCE 4.0 and 5.0
ETHREAD 4.0 and 5.0
EVENTMSG 4.0 and 5.0
EXCEPTION_DEBUG_INFO 4.0 and 5.0
EXCEPTION_POINTERS 4.0 and 5.0
EXCEPTION_RECORD 4.0 and 5.0
EXCEPTION_REGISTRATION_RECORD 4.0 and 5.0
EX_DEBUG_LOG 4.0 and 5.0
EX_DEBUG_LOG_EVENT 4.0 and 5.0
EX_DEBUG_LOG_TAG 4.0 and 5.0
FILEINFO 4.0 and 5.0
GRAPHICS_BUFFER_INFO 5.0 only
GUIDELINE 5.0 only
HANDLEENTRY 4.0 and 5.0
HANDLETABLE 4.0 and 5.0
HANDLE_ENTRY 4.0 only
HANDLE_TABLE 4.0 and 5.0
HARDERRORINFO 5.0 only
HARDERROR_MSG 4.0 and 5.0
HARDWAREHOOKSTRUCT 4.0 and 5.0
HARDWARE_PTE 4.0 only
HEAD 4.0 only
HEAP 5.0 only
HEAP_ENTRY 5.0 only
HEAP_FREE_ENTRY 5.0 only
HEAP_SEGMENT 5.0 only
HELPINFO 4.0 and 5.0
HELPWININFOA 4.0 and 5.0
HELPWININFOW 4.0 and 5.0
HLP 4.0 and 5.0
HOOK 4.0 and 5.0
ICONINFO 4.0 and 5.0
ICONMETRICSA 4.0 and 5.0
ICONMETRICSW 4.0 and 5.0
IMAGE_DEBUG_INFORMATION 5.0 only
IMAGE_SECTION_HEADER 5.0 only
IMC 5.0 only
IMECHARPOSITION 5.0 only
IMEDPI 5.0 only
IMEINFO 5.0 only
IMEINFOEX 5.0 only
IMEMENUITEMINFOA 5.0 only
IMEMENUITEMINFOW 5.0 only
IMEMODESAVER 5.0 only
IMEPRIVATEMODESAVER 5.0 only
IMEUI 5.0 only
IMEWND 5.0 only
INPUTCONTEXT 5.0 only
INPUT_INFORMATION 5.0 only
IN_STRING 4.0 and 5.0
ITEM 4.0 and 5.0
KE 4.0 and 5.0
KEY_EVENT_RECORD 5.0 only
KTHREAD 4.0 and 5.0
LARGE_ANSI_STRING 4.0 and 5.0
LARGE_IN_STRING 4.0 and 5.0
LARGE_STRING 4.0 and 5.0
LARGE_UNICODE_STRING 4.0 and 5.0
LBIV 4.0 and 5.0
LBItem 4.0 and 5.0
LBODItem 4.0 and 5.0
LBWND 4.0 and 5.0
LDR_DATA_TABLE_ENTRY 4.0 and 5.0
LDR_ENUM_RESOURCE_ENTRY 4.0 and 5.0
LINK_COUNT 5.0 only
LOGFONTA 5.0 only
LOGFONTW 5.0 only
MDI 4.0 and 5.0
MDICREATESTRUCTA 4.0 and 5.0
MDICREATESTRUCTW 4.0 and 5.0
MDINEXTMENU 4.0 and 5.0
MDIWND 4.0 and 5.0
MEASUREITEMSTRUCT 4.0 and 5.0
MEASUREITEMSTRUCT_EX 4.0 and 5.0
MENU 4.0 and 5.0
MENUITEMINFOA 4.0 and 5.0
MENUITEMINFOW 4.0 and 5.0
MENUITEMTEMPLATE 4.0 and 5.0
MENUITEMTEMPLATE2 4.0 and 5.0
MENUITEMTEMPLATEHEADER 4.0 and 5.0
MENU_EVENT_RECORD 4.0 and 5.0
MESSAGE_RESOURCE_BLOCK 4.0 and 5.0
MESSAGE_RESOURCE_DATA 4.0 and 5.0
MESSAGE_RESOURCE_ENTRY 4.0 and 5.0
MINIMIZEDMETRICS 4.0 and 5.0
MINMAXINFO 4.0 and 5.0
MONITOR 5.0 only
MOUSEHOOKSTRUCT 4.0 and 5.0
MOUSEKEYS 4.0 and 5.0
MOUSE_EVENT_RECORD 4.0 and 5.0
MSG 4.0 and 5.0
MSGBOXDATA 4.0 and 5.0
MSGBOXPARAMSA 4.0 and 5.0
MSGBOXPARAMSW 4.0 and 5.0
NCCALCSIZE_PARAMS 4.0 and 5.0
NEMODULESEG 4.0 and 5.0
NLS_DATA_BLOCK 4.0 and 5.0
NONCLIENTMETRICSA 4.0 and 5.0
NONCLIENTMETRICSW 4.0 and 5.0
OBJECT_ATTRIBUTES 4.0 and 5.0
OBJECT_BASIC_INFORMATION 4.0 and 5.0
OBJECT_CREATE_INFORMATION 4.0 and 5.0
OBJECT_DIRECTORY 4.0 and 5.0
OBJECT_DIRECTORY_ENTRY 4.0 and 5.0
OBJECT_DIRECTORY_INFORMATION 4.0 and 5.0
OBJECT_HANDLE_COUNT_DATABASE 4.0 and 5.0
OBJECT_HANDLE_COUNT_ENTRY 4.0 and 5.0
OBJECT_HANDLE_FLAG_INFORMATION 4.0 and 5.0
OBJECT_HANDLE_INFORMATION 4.0 and 5.0
OBJECT_HEADER 4.0 and 5.0
OBJECT_HEADER_CREATOR_INFO 4.0 and 5.0
OBJECT_HEADER_HANDLE_INFO 4.0 and 5.0
OBJECT_HEADER_NAME_INFO 4.0 and 5.0
OBJECT_HEADER_QUOTA_INFO 4.0 and 5.0
OBJECT_NAME_INFORMATION 4.0 and 5.0
OBJECT_SYMBOLIC_LINK 4.0 and 5.0
OBJECT_TYPE 4.0 and 5.0
OBJECT_TYPES_INFORMATION 4.0 and 5.0
OBJECT_TYPE_INFORMATION 4.0 and 5.0
OBJECT_TYPE_INITIALIZER 4.0 and 5.0
PEB 5.0 only
PENINPUTDATA 5.0 only
PROCOBJHEAD 4.0 and 5.0
PROP 4.0 and 5.0
PROPSET 4.0 and 5.0
RECONVERTSTRING 5.0 only
RECTL 4.0 and 5.0
REG_NOTIFY_INFORMATION 4.0 and 5.0
REG_PROVIDER 4.0 and 5.0
RTL_CRITICAL_SECTION 5.0 only
RTL_CRITICAL_SECTION_DEBUG 5.0 only
RTL_USER_PROCESS_PARAMETERS 5.0 only
ROW 5.0 only
SBCALC 4.0 and 5.0
SBDATA 4.0 and 5.0
SBINFO 4.0 and 5.0
SBTRACK 4.0 and 5.0
SBWND 4.0 and 5.0
SCREEN_INFORMATION 5.0 only
SCROLLINFO 4.0 and 5.0
SCROLLPOS 4.0 and 5.0
SERVERINFO 4.0 and 5.0
TEB 4.0 and 5.0
TEXTMETRICW 5.0 only
TEXT_BUFFER_INFO 5.0 only
THREAD_BASIC_INFORMATION 4.0 and 5.0
THROBJHEAD 4.0 and 5.0
TPMPARAMS 4.0 and 5.0
TRACKMOUSEEVENT 5.0 only
TRANSMSG 5.0 only
TRANSMSGLIST 5.0 only
USERCONNECT 4.0 and 5.0
USEROBJECTFLAGS 4.0 and 5.0
USERTHREAD_FLAGS 4.0 and 5.0
USERTHREAD_SHUTDOWN_INFORMATION 4.0 and 5.0
USERTHREAD_WOW_INFORMATION 4.0 and 5.0
W32PROCESS 4.0 and 5.0
W32THREAD 4.0 and 5.0
WINDOWPLACEMENT 4.0 and 5.0
WINDOWPOS 4.0 and 5.0
WMCSDATA 5.0 only
WND 4.0 and 5.0
WNDCLASSA 4.0 and 5.0
WNDCLASSEXA 4.0 and 5.0
WNDCLASSEXW 4.0 and 5.0
WNDCLASSW 4.0 and 5.0
WNDMSG 4.0 and 5.0
XACT_INFO 5.0 only

What principle ever governed the selection of structures for presentation through the !dso command is not known. As fits the name, by far the most of the supported structures are creatures of user mode. Yet more than a few have no visibility except in kernel mode.

One influence on the selection may be that a structure was eligible only if it was thought stable. The USEREXTS debugger extension ships with the DDK which in turn is new for each Windows version but not for each build and not even for each formally released service pack. Even assuming that programmers (both Microsoft’s and not) use the debugger, including its extensions, from the DDK for the same version of Windows that they’re debugging, the !dso command would have greatly reduced worth if the structures it dumps change between builds.

Many structures were added to the !dso output for version 5.0. Some of these structures truly were new for version 5.0. Many were perhaps added simply because Microsoft’s own programmers had found the !dso command to be useful and sought to increase its coverage. Only four were withdrawn: DISPLAYRESOURCE, HANDLE_ENTRY, HARDWARE_PTE and HEAD.