winlogon源代码分析之nt!KiRetireDpcList函数分析和重要全局变量nt!KiTimerTableListHead的关系--非常重要

winlogon源代码分析之nt!KiRetireDpcList函数分析和重要全局变量nt!KiTimerTableListHead的关系--非常重要

VOID

FASTCALL

KiRetireDpcList (

PKPRCB Prcb

)

{

//

// If the timer hand value is nonzero, then process expired timers.

//

if (Prcb->TimerRequest != 0) {

TimerHand = Prcb->TimerHand;

Prcb->TimerRequest = 0;

_enable();

KiTimerExpiration(NULL, NULL, (PVOID) TimerHand, NULL);

_disable();

}

+0x8a0\] DpcLastCount : 0x136e \[Type: unsigned long

+0x8a4\] TimerHand : 0x105ee57c \[Type: unsigned long

+0x8a8\] TimerRequest : 0xf75c6c60 \[Type: unsigned long

0: kd> t

eax=105ee57c ebx=ffdff120 ecx=ffdff120 edx=f75c6c48 esi=00000000 edi=ffdff980

eip=80a40bfe esp=f789efa0 ebp=f789eff4 iopl=0 nv up ei ng nz na pe nc

cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000286

nt!KiTimerExpiration:

80a40bfe 55 push ebp

0: kd> dv

TimerDpc = 0x00000000

DeferredContext = 0x00000000

SystemArgument1 = 0x105ee57c

SystemArgument2 = 0x00000000

CurrentTime = {0xf789eff4ffdff120}

TimersExamined = 0

DpcTable = struct _DPC_ENTRY [4]

OldIrql = 0x10 ''

Period = 0n0

SystemTime = {0xffdff98000000030}

TimersProcessed = 8

DpcCount = 0x80a40bfe

Interval = {0}

HandLimit = 0n35

Index = 0n-1

SystemArgument1 = 0x105ee57c 滴答数

If the timer table has not wrapped, then start with the specified timer table index value, and scan for timer entries that have expired.

Otherwise, start with the specified timer table index value and scan the entire table for timer entries that have expired.

如果计时器表尚未包装,则从指定的计时器表索引值开始,并扫描已过期的计时器条目。

否则,从指定的计时器表索引值开始,扫描整个表以查找已过期的计时器条目。

Index = PtrToLong(SystemArgument1);

if ((ULONG)(HandLimit - Index) >= TIMER_TABLE_SIZE) {

HandLimit = Index + TIMER_TABLE_SIZE - 1;

}

Index -= 1;

HandLimit &= (TIMER_TABLE_SIZE - 1);

do {

Index = (Index + 1) & (TIMER_TABLE_SIZE - 1);

ListHead = &KiTimerTableListHead[Index];

NextEntry = ListHead->Flink;

0: kd> dv

TimerDpc = 0x00000000

DeferredContext = 0x00000000

SystemArgument1 = 0x105ee57c

SystemArgument2 = 0x00000000

CurrentTime = {0x2707e03765c2}

TimersExamined = 0x18

DpcTable = struct _DPC_ENTRY [4]

OldIrql = 0x02 ''

Period = 0n-2136732671

SystemTime = {0x1dc6727c288bdad}

TimersProcessed = 4

DpcCount = 0

Interval = {0}

HandLimit = 0n127

Index = 0n48

KiRemoveTreeTimer(Timer);

#if DBG

#define KiRemoveTreeTimer(Timer) \

(Timer)->Header.Inserted = FALSE; \

RemoveEntryList(&(Timer)->TimerListEntry); \

(Timer)->TimerListEntry.Flink = NULL; \

(Timer)->TimerListEntry.Blink = NULL

#else

#define KiRemoveTreeTimer(Timer) \

(Timer)->Header.Inserted = FALSE; \

RemoveEntryList(&(Timer)->TimerListEntry)

#endif

0: kd> dt ktimer baa7c6d0

CSRSRV!KTIMER

+0x000 Header : _DISPATCHER_HEADER

+0x010 DueTime : _ULARGE_INTEGER 0x00002707`e02ed07e

+0x018 TimerListEntry : _LIST_ENTRY [ 0xbaa7c740 - 0x80b20c40 ]

+0x020 Dpc : 0xbaa7c6b0 _KDPC

+0x024 Period : 0n100

0: kd> dx -id 0,0,8954e020 -r1 (*((CSRSRV!_DISPATCHER_HEADER *)0xbaa7c6d0))

(*((CSRSRV!_DISPATCHER_HEADER *)0xbaa7c6d0)) [Type: _DISPATCHER_HEADER]

+0x000\] Type : 0x8 \[Type: unsigned char

+0x001\] Absolute : 0x0 \[Type: unsigned char

+0x002\] Size : 0xa \[Type: unsigned char

+0x003\] Inserted : 0x0 \[Type: unsigned char

+0x003\] DebugActive : 0x0 \[Type: unsigned char

+0x000\] Lock : 655368 \[Type: long

+0x004\] SignalState : 1 \[Type: long

+0x008\] WaitListHead \[Type: _LIST_ENTRY

0: kd> dx -id 0,0,8954e020 -r1 (*((CSRSRV!_LIST_ENTRY *)0xbaa7c6d8))

(*((CSRSRV!_LIST_ENTRY *)0xbaa7c6d8)) [Type: _LIST_ENTRY]

+0x000\] Flink : 0xbaa7c6d8 \[Type: _LIST_ENTRY \*

+0x004\] Blink : 0xbaa7c6d8 \[Type: _LIST_ENTRY \*

0: kd> dx -id 0,0,8954e020 -r1 ((CSRSRV!_KDPC *)0xbaa7c6b0)

((CSRSRV!_KDPC *)0xbaa7c6b0) : 0xbaa7c6b0 [Type: _KDPC *]

+0x000\] Type : 19 \[Type: short

+0x002\] Number : 0x20 \[Type: unsigned char

+0x003\] Importance : 0x1 \[Type: unsigned char

+0x004\] DpcListEntry \[Type: _LIST_ENTRY

+0x00c\] DeferredRoutine : 0xbaa4083e \[Type: void (\*)(_KDPC \*,void \*,void \*,void \*)

+0x010\] DeferredContext : 0xbaa7c6a0 \[Type: void \*

+0x014\] SystemArgument1 : 0x0 \[Type: void \*

+0x018\] SystemArgument2 : 0x0 \[Type: void \*

+0x01c\] DpcData : 0x0 \[Type: void \*

0: kd> u baa4083e

tcpip!TCBTimeoutdpc [d:\srv03rtm\net\tcpip\driver\tcp\tcb.c @ 172]:

baa4083e 55 push ebp

baa4083f 8bec mov ebp,esp

baa40841 8b450c mov eax,dword ptr [ebp+0Ch]

baa40844 ff700c push dword ptr [eax+0Ch]

baa40847 50 push eax

baa40848 ff5008 call dword ptr [eax+8]

baa4084b 5d pop ebp

baa4084c c21000 ret 10h

0: kd> dv

TimerDpc = 0x00000000

DeferredContext = 0x00000000

SystemArgument1 = 0x105ee57c

SystemArgument2 = 0x00000000

CurrentTime = {0x2707e03765c2}

TimersExamined = 0x17

DpcTable = struct _DPC_ENTRY [4]

OldIrql = 0x02 ''

Period = 0n-2136732671

SystemTime = {0x1dc6727c288bdad}

TimersProcessed = 3

DpcCount = 0

Interval = {0}

HandLimit = 0n127

Index = 0n124 Index = 0n124

注意: Index = 0n124的由来

Index -= 1;

HandLimit &= (TIMER_TABLE_SIZE - 1);

//

// Acquire the dispatcher database lock and read the current interrupt

// time to determine which timers have expired.

//

DpcCount = 0;

TimersExamined = MAXIMUM_TIMERS_EXAMINED;

TimersProcessed = MAXIMUM_TIMERS_PROCESSED;

KiLockDispatcherDatabase(&OldIrql);

do {

Index = (Index + 1) & (TIMER_TABLE_SIZE - 1);

SystemArgument1 = 0x105ee57c

0: kd> ?0x105ee57c&ff

Evaluate expression: 124 = 0000007c

注意: Index = 0n124的由来

注意: HandLimit = 0n127的由来

0: kd> p

eax=00002707 ebx=ffdff120 ecx=e03765c2 edx=f75c6c48 esi=00000000 edi=ffdff980

eip=80a40c42 esp=f789ef0c ebp=f789ef9c iopl=0 nv up di pl zr na pe nc

cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000046

nt!KiTimerExpiration+0x44:

80a40c42 8b0d806fb180 mov ecx,dword ptr [nt!_KeTickCount (80b16f80)] ds:0023:80b16f80=105ee57f

参考现在的:

0: kd> x nt!_KeTickCount

80b16f80 nt!KeTickCount = struct _KSYSTEM_TIME

80b16f80 nt!_KeTickCount = 0x105ee580

0: kd> dx -r1 (*((ntkrnlmp!_KSYSTEM_TIME *)0x80b16f80))

(*((ntkrnlmp!_KSYSTEM_TIME *)0x80b16f80)) [Type: _KSYSTEM_TIME]

+0x000\] LowPart : 0x105ee580 \[Type: unsigned long

+0x004\] High1Time : 0 \[Type: long

+0x008\] High2Time : 0 \[Type: long

注意: HandLimit = 0n127的由来

0: kd> dx -r1 -c 100 (*((ntkrnlmp!_LIST_ENTRY (*)[256])0x80b20860))

(*((ntkrnlmp!_LIST_ENTRY (*)[256])0x80b20860)) [Type: _LIST_ENTRY [256]]

100\] \[Type: _LIST_ENTRY

124\] \[Type: _LIST_ENTRY

第1个节点:

0: kd> dx -r1 (*((ntkrnlmp!_LIST_ENTRY *)0x80b20c40))

(*((ntkrnlmp!_LIST_ENTRY *)0x80b20c40)) [Type: _LIST_ENTRY]

+0x000\] Flink : 0xbaa7c6e8 \[Type: _LIST_ENTRY \*

+0x004\] Blink : 0x89764408 \[Type: _LIST_ENTRY \*

0: kd> dt ktimer 0xbaa7c6e8-18

CSRSRV!KTIMER

+0x000 Header : _DISPATCHER_HEADER

+0x010 DueTime : _ULARGE_INTEGER 0x00002707`e02ed07e <0xe03765c2过期了。

+0x018 TimerListEntry : _LIST_ENTRY [ 0xbaa7c740 - 0x80b20c40 ]

+0x020 Dpc : 0xbaa7c6b0 _KDPC

+0x024 Period : 0n100

0: kd> dt nt!CurrentTime

Local var @ 0xf789ef88 Type _ULARGE_INTEGER

0x00002707`e03765c2

+0x000 LowPart : 0xe03765c2

+0x004 HighPart : 0x2707

+0x000 u : __unnamed

+0x000 QuadPart : 0x00002707`e03765c2

第2个节点:

0: kd> dx -id 0,0,8954e020 -r1 (*((CSRSRV!_LIST_ENTRY *)0xbaa7c6e8))

(*((CSRSRV!_LIST_ENTRY *)0xbaa7c6e8)) [Type: _LIST_ENTRY]

+0x000\] Flink : 0xbaa7c740 \[Type: _LIST_ENTRY \*

+0x004\] Blink : 0x80b20c40 \[Type: _LIST_ENTRY \*

0: kd> dt ktimer 0xbaa7c740-18

CSRSRV!KTIMER

+0x000 Header : _DISPATCHER_HEADER

+0x010 DueTime : _ULARGE_INTEGER 0x00002707`e02ed07e

+0x018 TimerListEntry : _LIST_ENTRY [ 0x899ab8b8 - 0x80b20c40 ]

+0x020 Dpc : 0xbaa7c708 _KDPC

+0x024 Period : 0n100

第3个节点:

0: kd> dx -id 0,0,8954e020 -r1 ((CSRSRV!_LIST_ENTRY *)0xbaa7c740)

((CSRSRV!_LIST_ENTRY *)0xbaa7c740) : 0xbaa7c740 [Type: _LIST_ENTRY *]

+0x000\] Flink : 0x899ab8b8 \[Type: _LIST_ENTRY \*

+0x004\] Blink : 0xbaa7c6e8 \[Type: _LIST_ENTRY \*

0: kd> dt ktimer 0x899ab8b8-18

CSRSRV!KTIMER

+0x000 Header : _DISPATCHER_HEADER

+0x010 DueTime : _ULARGE_INTEGER 0x00002707`e29298b4 >0xe03765c2没到期

+0x018 TimerListEntry : _LIST_ENTRY [ 0x89764408 - 0xbaa7c740 ]

+0x020 Dpc : 0x899ab8c8 _KDPC

+0x024 Period : 0n10000

第4个节点:

0: kd> dx -id 0,0,8954e020 -r1 ((CSRSRV!_LIST_ENTRY *)0x899ab8b8)

((CSRSRV!_LIST_ENTRY *)0x899ab8b8) : 0x899ab8b8 [Type: _LIST_ENTRY *]

+0x000\] Flink : 0x89764408 \[Type: _LIST_ENTRY \*

+0x004\] Blink : 0xbaa7c740 \[Type: _LIST_ENTRY \*

0: kd> dt ktimer 0x89764408-18

CSRSRV!KTIMER

+0x000 Header : _DISPATCHER_HEADER

+0x010 DueTime : _ULARGE_INTEGER 0x00002707`e29298b4

+0x018 TimerListEntry : _LIST_ENTRY [ 0x80b20c40 - 0x899ab8b8 ]

+0x020 Dpc : 0x89764418 _KDPC

+0x024 Period : 0n10000

到链表头了。

0: kd> dx -id 0,0,8954e020 -r1 ((CSRSRV!_LIST_ENTRY *)0x89764408)

((CSRSRV!_LIST_ENTRY *)0x89764408) : 0x89764408 [Type: _LIST_ENTRY *]

+0x000\] Flink : 0x80b20c40 \[Type: _LIST_ENTRY \*

+0x004\] Blink : 0x899ab8b8 \[Type: _LIST_ENTRY \*

124\] \[Type: _LIST_ENTRY

0: kd> dx -r1 (*((ntkrnlmp!_LIST_ENTRY *)0x80b20c40))

(*((ntkrnlmp!_LIST_ENTRY *)0x80b20c40)) [Type: _LIST_ENTRY]

+0x000\] Flink : 0xbaa7c6e8 \[Type: _LIST_ENTRY \*

+0x004\] Blink : 0x89764408 \[Type: _LIST_ENTRY \*

125\] \[Type: _LIST_ENTRY

0: kd> dx -r1 (*((ntkrnlmp!_LIST_ENTRY *)0x80b20c48))

(*((ntkrnlmp!_LIST_ENTRY *)0x80b20c48)) [Type: _LIST_ENTRY]

+0x000\] Flink : 0x80b20c48 \[Type: _LIST_ENTRY \*

+0x004\] Blink : 0x80b20c48 \[Type: _LIST_ENTRY \*

126\] \[Type: _LIST_ENTRY

0: kd> dt ntkrnlmp!_LIST_ENTRY 0x80b20c48+8*1

0xba8d6cb8 - 0xba8d6cb8

+0x000 Flink : 0xba8d6cb8 _LIST_ENTRY [ 0x80b20c50 - 0x80b20c50 ]

+0x004 Blink : 0xba8d6cb8 _LIST_ENTRY [ 0x80b20c50 - 0x80b20c50 ]

0: kd> dt ktimer 0xba8d6cb8-18

CSRSRV!KTIMER

+0x000 Header : _DISPATCHER_HEADER

+0x010 DueTime : _ULARGE_INTEGER 0x00002707`e033de70 <0xe03765c2到期

+0x018 TimerListEntry : _LIST_ENTRY [ 0x80b20c50 - 0x80b20c50 ]

+0x020 Dpc : 0xba8d6ce0 _KDPC

+0x024 Period : 0n0

0: kd> dt ntkrnlmp!_LIST_ENTRY 0x80b20c48+8*2

0x8978eee0 - 0x8980c6e0

+0x000 Flink : 0x8978eee0 _LIST_ENTRY [ 0x8952bca8 - 0x80b20c58 ]

+0x004 Blink : 0x8980c6e0 _LIST_ENTRY [ 0x80b20c58 - 0x898d46e0 ]

0: kd> dt ktimer 0x8978eee0-18

CSRSRV!KTIMER

+0x000 Header : _DISPATCHER_HEADER

+0x010 DueTime : _ULARGE_INTEGER 0x00002707`e0357d7a <0xe03765c2到期

+0x018 TimerListEntry : _LIST_ENTRY [ 0x8952bca8 - 0x80b20c58 ]

+0x020 Dpc : (null)

+0x024 Period : 0n0

0: kd> dx -id 0,0,8954e020 -r1 ((ntkrnlmp!_LIST_ENTRY *)0x8978eee0)

((ntkrnlmp!_LIST_ENTRY *)0x8978eee0) : 0x8978eee0 [Type: _LIST_ENTRY *]

+0x000\] Flink : 0x8952bca8 \[Type: _LIST_ENTRY \*

+0x004\] Blink : 0x80b20c58 \[Type: _LIST_ENTRY \*

0: kd> dt ktimer 0x8952bca8-18

CSRSRV!KTIMER

+0x000 Header : _DISPATCHER_HEADER

+0x010 DueTime : _ULARGE_INTEGER 0x00002707`e035f78c <0xe03765c2到期

+0x018 TimerListEntry : _LIST_ENTRY [ 0x898d46e0 - 0x8978eee0 ]

+0x020 Dpc : (null)

+0x024 Period : 0n0

0: kd> dx -id 0,0,8954e020 -r1 ((ntkrnlmp!_LIST_ENTRY *)0x8952bca8)

((ntkrnlmp!_LIST_ENTRY *)0x8952bca8) : 0x8952bca8 [Type: _LIST_ENTRY *]

+0x000\] Flink : 0x898d46e0 \[Type: _LIST_ENTRY \*

+0x004\] Blink : 0x8978eee0 \[Type: _LIST_ENTRY \*

0: kd> dt ktimer 0x898d46e0-18

CSRSRV!KTIMER

+0x000 Header : _DISPATCHER_HEADER

+0x010 DueTime : _ULARGE_INTEGER 0x00002707`e03765c1 <0xe03765c2到期

+0x018 TimerListEntry : _LIST_ENTRY [ 0x8980c6e0 - 0x8952bca8 ]

+0x020 Dpc : 0x898d46a8 _KDPC

+0x024 Period : 0n0

0: kd> dx -id 0,0,8954e020 -r1 ((ntkrnlmp!_LIST_ENTRY *)0x898d46e0)

((ntkrnlmp!_LIST_ENTRY *)0x898d46e0) : 0x898d46e0 [Type: _LIST_ENTRY *]

+0x000\] Flink : 0x8980c6e0 \[Type: _LIST_ENTRY \*

+0x004\] Blink : 0x8952bca8 \[Type: _LIST_ENTRY \*

0: kd> dt ktimer 0x8980c6e0-18

CSRSRV!KTIMER

+0x000 Header : _DISPATCHER_HEADER

+0x010 DueTime : _ULARGE_INTEGER 0x00002707`e03765c1 <0xe03765c2到期

+0x018 TimerListEntry : _LIST_ENTRY [ 0x80b20c58 - 0x898d46e0 ]

+0x020 Dpc : 0x8980c6a8 _KDPC

+0x024 Period : 0n0

到达链表头:

0: kd> dx -id 0,0,8954e020 -r1 ((ntkrnlmp!_LIST_ENTRY *)0x8980c6e0)

((ntkrnlmp!_LIST_ENTRY *)0x8980c6e0) : 0x8980c6e0 [Type: _LIST_ENTRY *]

+0x000\] Flink : 0x80b20c58 \[Type: _LIST_ENTRY \*

+0x004\] Blink : 0x898d46e0 \[Type: _LIST_ENTRY \*

0: kd> dt ntkrnlmp!_LIST_ENTRY 0x80b20c48+8*3

0x8981b218 - 0x8981b218

+0x000 Flink : 0x8981b218 _LIST_ENTRY [ 0x80b20c60 - 0x80b20c60 ]

+0x004 Blink : 0x8981b218 _LIST_ENTRY [ 0x80b20c60 - 0x80b20c60 ]

0: kd> dt ktimer 0x8981b218-18

CSRSRV!KTIMER

+0x000 Header : _DISPATCHER_HEADER

+0x010 DueTime : _ULARGE_INTEGER 0x00002707`ee87e41c

+0x018 TimerListEntry : _LIST_ENTRY [ 0x80b20c60 - 0x80b20c60 ]

+0x020 Dpc : 0x8981b258 _KDPC

+0x024 Period : 0n0

0: kd> dt ntkrnlmp!_LIST_ENTRY 0x80b20c48+8*4

0x898397d0 - 0x898397d0

+0x000 Flink : 0x898397d0 _LIST_ENTRY [ 0x80b20c68 - 0x80b20c68 ]

+0x004 Blink : 0x898397d0 _LIST_ENTRY [ 0x80b20c68 - 0x80b20c68 ]

0: kd> dt ktimer 0x898397d0-18

CSRSRV!KTIMER

+0x000 Header : _DISPATCHER_HEADER

+0x010 DueTime : _ULARGE_INTEGER 0x00002707`e500de76

+0x018 TimerListEntry : _LIST_ENTRY [ 0x80b20c68 - 0x80b20c68 ]

+0x020 Dpc : (null)

+0x024 Period : 0n0