The ETHREAD and KTHREAD structures can be displayed with the dt command in the kernel debugger. The following output shows the format of an ETHREAD on a 32-bit system:lkd> dt nt!_ethread nt!_ETHREAD +0x000 Tcb : _KTHREAD +0x1e0 CreateTime : _LARGE_INTEGER +0x1e8 ExitTime : _LARGE_INTEGER +0x1e8 KeyedWaitChain : _LIST_ENTRY +0x1f0 ExitStatus : Int4B ... +0x270 AlpcMessageId : Uint4B +0x274 AlpcMessage : Ptr32 Void +0x274 AlpcReceiveAttributeSet : Uint4B +0x278 AlpcWaitListEntry : _LIST_ENTRY +0x280 CacheManagerCount : Uint4B

The KTHREAD can be displayed with a similar command or by typing dt nt!_ETHREAD Tcb, as was shown in the EPROCESS/KPROCESS experiment earlier:lkd> dt nt!_kthread nt!_KTHREAD +0x000 Header : _DISPATCHER_HEADER +0x010 CycleTime : Uint8B +0x018 HighCycleTime : Uint4B +0x020 QuantumTarget : Uint8B ... +0x05e WaitIrql : UChar +0x05f WaitMode : Char +0x060 WaitStatus : Int4B

EXPERIMENT: Using the Kernel Debugger !thread Command

The kernel debugger !thread command dumps a subset of the information in the thread data structures. Some key elements of the information the kernel debugger displays can’t be displayed by any utility, including the following information: internal structure addresses; priority details; stack information; the pending I/O request list; and, for threads in a wait state, the list of objects the thread is waiting for.

To display thread information, use either the !process command (which displays all the threads of a process after displaying the process information) or the !thread command with the address of a thread object to display a specific thread.

EXPERIMENT: Viewing Thread Information

The following output is the detailed display of a process produced by using the Tlist utility in the Debugging Tools for Windows. Notice that the thread list shows Win32StartAddr. This is the address passed to the CreateThread function by the application. All the other utilities, except Process Explorer, that show the thread start address show the actual start address (a function in Ntdll.dll), not the application-specified start address.C:\Program Files\Windows Kits\8.0\Debuggers\x86>tlist winword 3232 WINWORD.EXE 648739_Chap05.docx - Microsoft Word CWD: C:\Users\Alex Ionescu\Documents\ CmdLine: "C:\Program Files\Microsoft Office\Office14\WINWORD.EXE" /n "C:\Users\Alex Ionescu\Documents\Chapter5.docx VirtualSize: 531024 KB PeakVirtualSize: 585248 KB WorkingSetSize:122484 KB PeakWorkingSetSize:181532 KB NumberOfThreads: 12 2104 Win32StartAddr:0x2fde10ec LastErr:0x00000000 State:Waiting 2992 Win32StartAddr:0x7778fd0d LastErr:0x00000000 State:Waiting 3556 Win32StartAddr:0x3877e970 LastErr:0x00000000 State:Waiting 2436 Win32StartAddr:0x3877e875 LastErr:0x00000000 State:Waiting 3136 Win32StartAddr:0x3877e875 LastErr:0x00000000 State:Waiting 3412 Win32StartAddr:0x3877e875 LastErr:0x00000000 State:Waiting 1096 Win32StartAddr:0x3877e875 LastErr:0x00000000 State:Waiting 912 Win32StartAddr:0x74497832 LastErr:0x00000000 State:Waiting 1044 Win32StartAddr:0x389b0926 LastErr:0x00000583 State:Waiting 1972 Win32StartAddr:0x694532fb LastErr:0x00000000 State:Waiting 4056 Win32StartAddr:0x75f9c83e LastErr:0x00000000 State:Waiting 1124 Win32StartAddr:0x777903e9 LastErr:0x00000000 State:Waiting 14.0.5123.5000 shp 0x2FDE0000 C:\Program Files\Microsoft Office\Office14\WINWORD.EXE 6.1.7601.17725 shp 0x77760000 C:\Windows\SYSTEM32\ntdll.dll 6.1.7601.17651 shp 0x75CE0000 C:\Windows\system32\kernel32.dll

The TEB, illustrated in Figure 5-9, is one of the data structures explained in this section that exists in the process address space (as opposed to the system space). Internally, it is made up of a header called the TIB (Thread Information Block), which mainly existed for compatibility with OS/2 and Win9x applications. It also allows exception and stack information to be kept into a smaller structure when creating new threads by using an Initial TIB.

The TEB stores context information for the image loader and various Windows DLLs. Because these components run in user mode, they need a data structure writable from user mode. That’s why this structure exists in the process address space instead of in the system space, where it would be writable only from kernel mode. You can find the address of the TEB with the kernel debugger !thread command.

Figure 5-9. Fields of the thread environment block

EXPERIMENT: Examining the TEB

Перейти на страницу:

Похожие книги