nt!KiSwapThread函数分析之nt!KiFindReadyThread和nt!KiSwapContext汇编代码和分析
第一部分:
当前处理器为1号处理器,对应的KPCR f7737000没有NextThread
和ReadySummary =0。的情况。
LONG_PTR
FASTCALL
KiSwapThread (
IN PKTHREAD OldThread,
IN PKPRCB CurrentPrcb
)
{
if ((NewThread = CurrentPrcb->NextThread) != NULL) {
//
// Clear the next thread address, set the current thread address, and
// set the thread state to running.
//
CurrentPrcb->NextThread = NULL;
CurrentPrcb->CurrentThread = NewThread;
NewThread->State = Running;
} else {
//
// Attempt to select a thread from the current processor dispatcher
// ready queues.
//
if ((NewThread = KiSelectReadyThread(0, CurrentPrcb)) != NULL) {
CurrentPrcb->CurrentThread = NewThread;
NewThread->State = Running;
} else {
第二部分:
1: kd> g
Breakpoint 30 hit
eax=ffdff120 ebx=f7737120 ecx=00000001 edx=ffdff120 esi=00000000 edi=80a059f8
eip=80a429d8 esp=f75f6948 ebp=f75f697c iopl=0 nv up ei pl nz na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000206
nt!KiFindReadyThread:
80a429d8 55 push ebp
1: kd> kc
00 nt!KiFindReadyThread
01 nt!KiSwapThread
02 nt!KeWaitForMultipleObjects
03 win32k!xxxMsgWaitForMultipleObjects
04 win32k!xxxDesktopThread
05 win32k!xxxCreateSystemThreads
06 win32k!NtUserCallOneParam
07 nt!_KiSystemService
08 SharedUserData!SystemCallStub
09 winsrv!NtUserCallOneParam
1: kd> !pcr
KPCR for Processor 1 at f7737000:
1: kd> dt KPCR f7737000
basesrv!KPCR
+0x000 NtTib : _NT_TIB
+0x000 Used_ExceptionList : 0xf75f6260 _EXCEPTION_REGISTRATION_RECORD
+0x004 Used_StackBase : (null)
+0x008 PerfGlobalGroupMask : (null)
+0x00c TssCopy : 0xf7737ef0 Void
+0x010 ContextSwitches : 0x8a1e
+0x014 SetMemberCopy : 2
+0x018 Used_Self : 0x7ffd8000 Void
+0x01c SelfPcr : 0xf7737000 _KPCR
+0x020 Prcb : 0xf7737120 _KPRCB
1: kd> dx -id 0,0,89831250 -r1 ((basesrv!_KPRCB *)0xf7737120)
((basesrv!_KPRCB *)0xf7737120) : 0xf7737120 [Type: _KPRCB *]
+0x000\] MinorVersion : 0x1 \[Type: unsigned short
+0x002\] MajorVersion : 0x1 \[Type: unsigned short
+0x004\] CurrentThread : 0x89804020 \[Type: _KTHREAD \*
+0x008\] NextThread : 0x0 \[Type: _KTHREAD \*
+0x928\] ReadySummary : 0x0 \[Type: unsigned long
+0x92c\] SelectNextLast : 0x0 \[Type: unsigned long
+0x930\] DispatcherReadyListHead \[Type: _LIST_ENTRY \[32\]
+0xa30\] DeferredReadyListHead \[Type: _SINGLE_LIST_ENTRY
+0xa34\] PrcbPad72 \[Type: unsigned long \[11\]
+0xa60\] ChainedInterruptList : 0x0 \[Type: void \*
+0xa64\] LookasideIrpFloat : 32720 \[Type: long
+0xa68\] SpareFields0 \[Type: unsigned long \[4\]
+0xa78\] VendorString \[Type: unsigned char \[13\]
+0xa85\] InitialApicId : 0x1 \[Type: unsigned char
+0xa86\] LogicalProcessorsPerPhysicalProcessor : 0x2 \[Type: unsigned char
+0xa88\] MHz : 0xe0f \[Type: unsigned long
+0xa8c\] FeatureBits : 0x33fff \[Type: unsigned long
+0xa90\] UpdateSignature : {876173328384} \[Type: _LARGE_INTEGER
+0xa98\] IsrTime : 0x0 \[Type: unsigned __int64
+0xaa0\] NpxSaveArea \[Type: _FX_SAVE_AREA
+0xcb0\] PowerState \[Type: _PROCESSOR_POWER_STATE
1: kd> kv
ChildEBP RetAddr Args to Child
00 f75f6944 80a43dd9 f7737120 89804020 89804080 nt!KiFindReadyThread (FPO: [Non-Fpo]) (CONV: fastcall) [d:\srv03rtm\base\ntos\ke\thredsup.c @ 722]
01 f75f697c 80a358c7 00000000 e1639460 00000002 nt!KiSwapThread+0x315 (FPO: [Non-Fpo]) (CONV: fastcall) [d:\srv03rtm\base\ntos\ke\thredsup.c @ 1854]
02 f75f69b4 bf8a4685 00000003 89804b50 00000001 nt!KeWaitForMultipleObjects+0x3b5 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\ke\wait.c @ 816]
03 f75f6a04 bf8b123e 00000002 89804b50 bf8fe215 win32k!xxxMsgWaitForMultipleObjects+0xeb (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\windows\core\ntuser\kernel\queue.c @ 4540]
04 f75f6d1c bf8b21ba bfa70aa0 00000001 f75f6d48 win32k!xxxDesktopThread+0x437 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\windows\core\ntuser\kernel\desktop.c @ 594]
05 f75f6d2c bf806d52 bfa70aa0 f75f6d58 008cfff4 win32k!xxxCreateSystemThreads+0x9c (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\windows\core\ntuser\kernel\desktop.c @ 347]
06 f75f6d48 80afbcb2 00000000 00000022 80afb956 win32k!NtUserCallOneParam+0xa0 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\windows\core\ntuser\kernel\ntstubs.c @ 4789]
07 f75f6d48 7ffe0304 00000000 00000022 80afb956 nt!_KiSystemService+0x13f (FPO: [0,3] TrapFrame @ f75f6d64) (CONV: cdecl) [d:\srv03rtm\base\ntos\ke\i386\trap.asm @ 1328]
08 008cffe0 75340774 75318a89 00000000 00000022 SharedUserData!SystemCallStub+0x4 (FPO: [0,0,0])
09 008cffe8 00000000 00000022 00000004 00000000 winsrv!NtUserCallOneParam+0xc (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\windows\core\umode\daytona\obj\i386\usrstubs.c @ 2683]
windbg> .open -a ffffffff80a43dd9
1: kd> dx -id 0,0,89831250 -r1 ((basesrv!_KPRCB *)0xffdff120)
((basesrv!_KPRCB *)0xffdff120) : 0xffdff120 [Type: _KPRCB *]
+0x000\] MinorVersion : 0x1 \[Type: unsigned short
+0x002\] MajorVersion : 0x1 \[Type: unsigned short
+0x004\] CurrentThread : 0x895f2a78 \[Type: _KTHREAD \*
+0x008\] NextThread : 0x0 \[Type: _KTHREAD \*
+0x928\] ReadySummary : 0x4000 \[Type: unsigned long
+0x92c\] SelectNextLast : 0x0 \[Type: unsigned long
+0x930\] DispatcherReadyListHead \[Type: _LIST_ENTRY \[32\]
1: kd> dx -id 0,0,89831250 -r1 (*((basesrv!_LIST_ENTRY (*)[32])0xffdffa50))
(*((basesrv!_LIST_ENTRY (*)[32])0xffdffa50)) [Type: _LIST_ENTRY [32]]
14\] \[Type: _LIST_ENTRY
1: kd> dx -id 0,0,89831250 -r1 (*((basesrv!_LIST_ENTRY *)0xffdffac0))
(*((basesrv!_LIST_ENTRY *)0xffdffac0)) [Type: _LIST_ENTRY]
+0x000\] Flink : 0x895552c8 \[Type: _LIST_ENTRY \*
+0x004\] Blink : 0x895552c8 \[Type: _LIST_ENTRY \*
if (RemoveEntryList(&Thread->WaitListEntry) != FALSE) {
Prcb->ReadySummary ^= PRIORITY_MASK(HighPriority);
}
Thread->NextProcessor = (UCHAR)Number;
return Thread;
PrioritySet = Prcb->ReadySummary; edi=00004000
ASSERT(PrioritySet != 0);
1: kd> p
eax=ffdff120 ebx=ffdff120 ecx=00000001 edx=ffdff120 esi=00000000 edi=00004000
eip=80a429e9 esp=f75f6920 ebp=f75f6944 iopl=0 nv up ei ng nz ac po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000292
nt!KiFindReadyThread+0x11:
80a429e9 85ff test edi,edi
KeFindFirstSetLeftMember(PrioritySet, &HighPriority);
1: kd> p
eax=00000002 ebx=ffdffac0 ecx=00000001 edx=ffdff120 esi=89555268 edi=00004000
eip=80a42a92 esp=f75f6920 ebp=f75f6944 iopl=0 nv up ei ng nz na po cy
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000283
nt!KiFindReadyThread+0xba:
80a42a92 858620010000 test dword ptr [esi+120h],eax ds:0023:89555388=00000003
Thread = CONTAINING_RECORD(NextEntry, KTHREAD, WaitListEntry);
if ((Thread->Affinity & AFFINITY_MASK(Number)) != 0) {
1: kd> p
eax=00000002 ebx=ffdffac0 ecx=00000001 edx=ffdff120 esi=89555268 edi=00004000
eip=80a42a92 esp=f75f6920 ebp=f75f6944 iopl=0 nv up ei ng nz na po cy
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000283
nt!KiFindReadyThread+0xba:
80a42a92 858620010000 test dword ptr [esi+120h],eax ds:0023:89555388=00000003
1: kd> dt kthread 89555268
CSRSRV!KTHREAD
+0x000 Header : _DISPATCHER_HEADER
+0x010 MutantListHead : _LIST_ENTRY [ 0x89555278 - 0x89555278 ]
+0x018 InitialStack : 0xf75d7000 Void
+0x01c StackLimit : 0xf75d4000 Void
+0x020 KernelStack : 0xf75d6a18 Void
+0x024 ThreadLock : 0
+0x028 ContextSwitches : 0xa10
+0x02c State : 0x1 ''
+0x120 Affinity : 3
if (RemoveEntryList(&Thread->WaitListEntry) != FALSE) {
Prcb->ReadySummary ^= PRIORITY_MASK(HighPriority);
}
1: kd> dx -id 0,0,89831250 -r1 ((basesrv!_KPRCB *)0xffdff120)
+0x928\] ReadySummary : 0x0 \[Type: unsigned long
1: kd> dx -id 0,0,89831250 -r1 (*((basesrv!_LIST_ENTRY (*)[32])0xffdffa50))
14\] \[Type: _LIST_ENTRY
1: kd> dx -id 0,0,89831250 -r1 (*((basesrv!_LIST_ENTRY *)0xffdffac0))
(*((basesrv!_LIST_ENTRY *)0xffdffac0)) [Type: _LIST_ENTRY]
+0x000\] Flink : 0xffdffac0 \[Type: _LIST_ENTRY \*
+0x004\] Blink : 0xffdffac0 \[Type: _LIST_ENTRY \*
Thread->NextProcessor = (UCHAR)Number;
return Thread;
}
1: kd> p
eax=89555268 ebx=80a05ee8 ecx=ffdffac0 edx=ffdff120 esi=89555268 edi=ffdff120
eip=80a42b5e esp=f75f6920 ebp=f75f6944 iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
nt!KiFindReadyThread+0x186:
80a42b5e 5f pop edi
if ((NewThread = CurrentPrcb->NextThread) == NULL) {
if ((TargetPrcb->ReadySummary != 0) &&
(NewThread = KiFindReadyThread(Processor,
TargetPrcb)) != NULL) { 返回到这里:
1: kd> p
eax=89555268 ebx=f7737120 ecx=ffdffac0 edx=ffdff120 esi=00000000 edi=80a059f8
eip=80a43dd9 esp=f75f694c ebp=f75f697c iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
nt!KiSwapThread+0x315:
80a43dd9 8bf0 mov esi,eax
NewThread = KiFindReadyThread(Processor,
TargetPrcb) =eax=89555268
//
// A new thread has been found to run on the
// current processor.
//
NewThread->State = Running;
KiReleasePrcbLock(TargetPrcb);
CurrentPrcb->CurrentThread = NewThread; CurrentThread : 0x89555268
1: kd> dt kthread 89555268
CSRSRV!KTHREAD
+0x000 Header : _DISPATCHER_HEADER
+0x010 MutantListHead : _LIST_ENTRY [ 0x89555278 - 0x89555278 ]
+0x018 InitialStack : 0xf75d7000 Void
+0x01c StackLimit : 0xf75d4000 Void
+0x020 KernelStack : 0xf75d6a18 Void
+0x024 ThreadLock : 0
+0x028 ContextSwitches : 0xa10
+0x02c State : 0x2 '' Running
+0x10f NextProcessor : 0x1 ''
1: kd>
((ntkrnlmp!_KPRCB *)0xf7737120) : 0xf7737120 [Type: _KPRCB *]
+0x000\] MinorVersion : 0x1 \[Type: unsigned short
+0x002\] MajorVersion : 0x1 \[Type: unsigned short
[+0x004] CurrentThread : 0x89555268 [Type: _KTHREAD *]
+0x008\] NextThread : 0x0 \[Type: _KTHREAD \*
+0x00c\] IdleThread : 0xf7739fa0 \[Type: _KTHREAD \*
+0x010\] Number : 1 \[Type: char
//
// Clear idle on the current processor and
// update the idle summary SMT set to indicate
// the physical processor is not entirely idle.
//
KiClearIdleSummary(AFFINITY_MASK(Processor));
KiClearSMTSummary(CurrentPrcb->MultiThreadProcessorSet);
goto ThreadFound; 马上交换线程。
#if !defined(_WIN64)
#define KiAffinityArray KiMask32Array
#endif
extern const ULONG_PTR KiAffinityArray[];
#define AFFINITY_MASK(n) (KiAffinityArray[n])
1: kd> x nt!KiIdleSummary
80b16e80 nt!KiIdleSummary = 0
1: kd> dv Processor
Processor = 1
+0x4d0\] MultiThreadProcessorSet : 0x3 \[Type: unsigned long
} else {
Pending = KiSwapContext(OldThread, NewThread);
}
;++
;
; BOOLEAN
; KiSwapContext (
; IN PKTHREAD OldThread
; IN PKTHREAD NewThread
; )
;
; Routine Description:
;
; This function is a small wrapper, callable from C code, that marshalls
; arguments and calls the actual swap context routine.
;
; Arguments:
;
; OldThread (ecx) - Supplies the address of the old thread ecx=89804020
; NewThread (edx) - Supplies the address of the new thread. edx=89555268
;
; Return Value:
;
; If a kernel APC is pending, then a value of TRUE is returned. Otherwise,
; a value of FALSE is returned.
;
;--
cPublicFastCall KiSwapContext, 2
.fpo (0, 0, 0, 4, 1, 0)
1: kd> p
eax=00000000 ebx=89804020 ecx=89804020 edx=89555268 esi=89555268 edi=80a059f8
eip=80a440e6 esp=f75f694c ebp=f75f697c iopl=0 nv up ei pl nz ac pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000216
nt!KiSwapThread+0x622:
80a440e6 e8edc50b00 call nt!KiSwapContext (80b006d8)
1: kd> t
eax=00000000 ebx=89804020 ecx=89804020 edx=89555268 esi=89555268 edi=80a059f8
eip=80b006d8 esp=f75f6948 ebp=f75f697c iopl=0 nv up ei pl nz ac pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000216
nt!KiSwapContext:
80b006d8 83ec10 sub esp,10h
1: kd> kc
00 nt!KiSwapContext
01 nt!KiSwapThread
WARNING: Frame IP not in any known module. Following frames may be wrong.
02 0x0
第三部分:
cPublicFastCall KiSwapContext, 2
.fpo (0, 0, 0, 4, 1, 0)
;
; N.B. The following registers MUST be saved such that ebp is saved last.
; This is done so the debugger can find the saved ebp for a thread
; that is not currently in the running state.
;
sub esp, 4*4
mov [esp+12], ebx ; save registers
mov [esp+8], esi ;
mov [esp+4], edi ;
mov [esp+0], ebp ;
mov ebx, PCR[PcSelfPcr] ; set address of PCR
mov edi, ecx ; set old thread address
mov esi, edx ; set next thread address
movzx ecx, byte ptr [edi].ThWaitirql ; set APC interrupt bypass disable
CAPSTART <@KiSwapContext@8,SwapContext>
call SwapContext ; swap context
CAPEND <@KiSwapContext@8>
mov ebp, [esp+0] ; restore registers
mov edi, [esp+4] ;
mov esi, [esp+8] ;
mov ebx, [esp+12] ;
add esp, 4*4 ;
fstRET KiSwapContext ;
fstENDP KiSwapContext
1: kd> p
eax=00000000 ebx=89804020 ecx=89804020 edx=89555268 esi=89555268 edi=80a059f8
eip=80a440e6 esp=f75f694c ebp=f75f697c iopl=0 nv up ei pl nz ac pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000216
nt!KiSwapThread+0x622:
80a440e6 e8edc50b00 call nt!KiSwapContext (80b006d8)
1: kd> t
eax=00000000 ebx=89804020 ecx=89804020 edx=89555268 esi=89555268 edi=80a059f8
eip=80b006d8 esp=f75f6948 ebp=f75f697c iopl=0 nv up ei pl nz ac pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000216
nt!KiSwapContext:
80b006d8 83ec10 sub esp,10h
1: kd> p
eax=00000000 ebx=89804020 ecx=89804020 edx=89555268 esi=89555268 edi=80a059f8
eip=80b006db esp=f75f6938 ebp=f75f697c iopl=0 nv up ei ng nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000282
nt!KiSwapContext+0x3:
80b006db 895c240c mov dword ptr [esp+0Ch],ebx ss:0010:f75f6944=00000316
1: kd> p
eax=00000000 ebx=89804020 ecx=89804020 edx=89555268 esi=89555268 edi=80a059f8
eip=80b006df esp=f75f6938 ebp=f75f697c iopl=0 nv up ei ng nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000282
nt!KiSwapContext+0x7:
80b006df 89742408 mov dword ptr [esp+8],esi ss:0010:f75f6940=00000008
1: kd> p
eax=00000000 ebx=89804020 ecx=89804020 edx=89555268 esi=89555268 edi=80a059f8
eip=80b006e3 esp=f75f6938 ebp=f75f697c iopl=0 nv up ei ng nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000282
nt!KiSwapContext+0xb:
80b006e3 897c2404 mov dword ptr [esp+4],edi ss:0010:f75f693c={nt!KiSwapContext (80b006d8)}
1: kd> p
eax=00000000 ebx=89804020 ecx=89804020 edx=89555268 esi=89555268 edi=80a059f8
eip=80b006e7 esp=f75f6938 ebp=f75f697c iopl=0 nv up ei ng nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000282
nt!KiSwapContext+0xf:
80b006e7 892c24 mov dword ptr [esp],ebp ss:0010:f75f6938=00000000
1: kd> p
eax=00000000 ebx=89804020 ecx=89804020 edx=89555268 esi=89555268 edi=80a059f8
eip=80b006ea esp=f75f6938 ebp=f75f697c iopl=0 nv up ei ng nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000282
nt!KiSwapContext+0x12:
80b006ea 648b1d1c000000 mov ebx,dword ptr fs:[1Ch] fs:0030:0000001c=f7737000
1: kd> p
eax=00000000 ebx=f7737000 ecx=89804020 edx=89555268 esi=89555268 edi=80a059f8
eip=80b006f1 esp=f75f6938 ebp=f75f697c iopl=0 nv up ei ng nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000282
nt!KiSwapContext+0x19:
80b006f1 8bf9 mov edi,ecx
1: kd> p
eax=00000000 ebx=f7737000 ecx=89804020 edx=89555268 esi=89555268 edi=89804020
eip=80b006f3 esp=f75f6938 ebp=f75f697c iopl=0 nv up ei ng nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000282
nt!KiSwapContext+0x1b:
80b006f3 8bf2 mov esi,edx
1: kd> p
eax=00000000 ebx=f7737000 ecx=89804020 edx=89555268 esi=89555268 edi=89804020
eip=80b006f5 esp=f75f6938 ebp=f75f697c iopl=0 nv up ei ng nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000282
nt!KiSwapContext+0x1d:
80b006f5 0fb64f2e movzx ecx,byte ptr [edi+2Eh] ds:0023:8980404e=00
1: kd> p
eax=00000000 ebx=f7737000 ecx=00000000 edx=89555268 esi=89555268 edi=89804020
eip=80b006f9 esp=f75f6938 ebp=f75f697c iopl=0 nv up ei ng nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000282
nt!KiSwapContext+0x21:
80b006f9 e8f2000000 call nt!SwapContext (80b007f0)
1: kd> p
eax=00000000 ebx=f7737000 ecx=00000000 edx=80010031 esi=89555268 edi=89804020
eip=80b006fe esp=f75d6a24 ebp=89831250 iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
nt!KiSwapContext+0x26:
80b006fe 8b2c24 mov ebp,dword ptr [esp] ss:0010:f75d6a24=f75d6a68
1: kd> p
eax=00000000 ebx=f7737000 ecx=00000000 edx=80010031 esi=89555268 edi=89804020
eip=80b00701 esp=f75d6a24 ebp=f75d6a68 iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
nt!KiSwapContext+0x29:
80b00701 8b7c2404 mov edi,dword ptr [esp+4] ss:0010:f75d6a28={nt!`string' (80a059f8)}
1: kd> p
eax=00000000 ebx=f7737000 ecx=00000000 edx=80010031 esi=89555268 edi=80a059f8
eip=80b00705 esp=f75d6a24 ebp=f75d6a68 iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
nt!KiSwapContext+0x2d:
80b00705 8b742408 mov esi,dword ptr [esp+8] ss:0010:f75d6a2c=89836020
1: kd> p
eax=00000000 ebx=f7737000 ecx=00000000 edx=80010031 esi=89836020 edi=80a059f8
eip=80b00709 esp=f75d6a24 ebp=f75d6a68 iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
nt!KiSwapContext+0x31:
80b00709 8b5c240c mov ebx,dword ptr [esp+0Ch] ss:0010:f75d6a30=89555268
1: kd> p
eax=00000000 ebx=89555268 ecx=00000000 edx=80010031 esi=89836020 edi=80a059f8
eip=80b0070d esp=f75d6a24 ebp=f75d6a68 iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
nt!KiSwapContext+0x35:
80b0070d 83c410 add esp,10h
1: kd> p
eax=00000000 ebx=89555268 ecx=00000000 edx=80010031 esi=89836020 edi=80a059f8
eip=80b00710 esp=f75d6a34 ebp=f75d6a68 iopl=0 nv up ei ng nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000282
nt!KiSwapContext+0x38:
80b00710 c3 ret
1: kd> kc
00 nt!KiSwapContext
01 nt!KiSwapThread
WARNING: Frame IP not in any known module. Following frames may be wrong.
02 0x0
1: kd> !thread
THREAD 89555268 Cid 01b0.01dc Teb: 7ffd9000 Win32Thread: e1601268 RUNNING on processor 1
IRP List:
897fe008: (0006,0190) Flags: 00000970 Mdl: 00000000
897569a0: (0006,0190) Flags: 00000970 Mdl: 00000000
Not impersonating
DeviceMap e10003d8
Owning Process 89831250 Image: csrss.exe
Attached Process N/A Image: N/A
Wait Start TickCount 274655230 Ticks: 8 (0:00:00:00.125)
Context Switch Count 2577 IdealProcessor: 0 LargeStack
UserTime 00:00:00.000
KernelTime 00:00:00.625
Stack Init f75d7000 Current f75d6a18 Base f75d7000 Limit f75d4000 Call 00000000
Priority 14 BasePriority 13 PriorityDecrement 0 IoPriority 0 PagePriority 0
ChildEBP RetAddr Args to Child
f75d6a30 80a440eb f7737120 89555268 895552c8 nt!KiSwapContext+0x38 (FPO: [Uses EBP] [0,0,4]) [d:\srv03rtm\base\ntos\ke\i386\ctxswap.asm @ 144]
00000000 f000ff53 f000e2c3 f000ff53 f000ff53 nt!KiSwapThread+0x627 (FPO: [Non-Fpo]) (CONV: fastcall) [d:\srv03rtm\base\ntos\ke\thredsup.c @ 2000]
WARNING: Frame IP not in any known module. Following frames may be wrong.
30000000 00000000 00000000 00000000 00000000 0xf000ff53
#if !defined(NT_UP)
if (OldThread == NewThread) {
KiSetContextSwapIdle(OldThread);
Pending = (BOOLEAN)((NewThread->ApcState.KernelApcPending != FALSE) &&
(NewThread->SpecialApcDisable == 0) &&
(WaitIrql == 0));
} else {
Pending = KiSwapContext(OldThread, NewThread); 新线程返回到这里:
}
#else
Pending = KiSwapContext(OldThread, NewThread);
#endif
//
// If a kernel APC should be delivered, then deliver it now.
//
WaitStatus = OldThread->WaitStatus;
if (Pending != FALSE) {
1: kd> p
eax=00000000 ebx=89555268 ecx=00000000 edx=80010031 esi=89836020 edi=80a059f8
eip=80a440eb esp=f75d6a38 ebp=f75d6a68 iopl=0 nv up ei ng nz na po nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000282
nt!KiSwapThread+0x627:
80a440eb 84c0 test al,al
1: kd> kc
00 nt!KiSwapThread
01 nt!KeWaitForMultipleObjects
02 win32k!RawInputThread
03 win32k!xxxCreateSystemThreads
04 win32k!NtUserCallOneParam
05 nt!_KiSystemService
06 SharedUserData!SystemCallStub
07 winsrv!NtUserCallOneParam
1: kd> !thread
THREAD 89555268 Cid 01b0.01dc Teb: 7ffd9000 Win32Thread: e1601268 RUNNING on processor 1
IRP List:
897fe008: (0006,0190) Flags: 00000970 Mdl: 00000000
897569a0: (0006,0190) Flags: 00000970 Mdl: 00000000
Not impersonating
DeviceMap e10003d8
Owning Process 89831250 Image: csrss.exe
Attached Process N/A Image: N/A
Wait Start TickCount 274655230 Ticks: 8 (0:00:00:00.125)
Context Switch Count 2577 IdealProcessor: 0 LargeStack
UserTime 00:00:00.000
KernelTime 00:00:00.625
Stack Init f75d7000 Current f75d6a18 Base f75d7000 Limit f75d4000 Call 00000000
Priority 14 BasePriority 13 PriorityDecrement 0 IoPriority 0 PagePriority 0
ChildEBP RetAddr Args to Child
f75d6a68 80a358c7 bfa03214 bfa01624 00000000 nt!KiSwapThread+0x627 (FPO: [Non-Fpo]) (CONV: fastcall) [d:\srv03rtm\base\ntos\ke\thredsup.c @ 2000]
f75d6aa0 bf891bbd 00000007 89489d08 00000001 nt!KeWaitForMultipleObjects+0x3b5 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\base\ntos\ke\wait.c @ 816]
f75d6d1c bf8b21b0 00000002 00000002 f75d6d48 win32k!RawInputThread+0x712 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\windows\core\ntuser\kernel\ntinput.c @ 6349]
f75d6d2c bf806d52 f75c64a0 f75d6d58 0088fff4 win32k!xxxCreateSystemThreads+0x92 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\windows\core\ntuser\kernel\desktop.c @ 338]
f75d6d48 80afbcb2 00000000 00000022 80afb956 win32k!NtUserCallOneParam+0xa0 (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\windows\core\ntuser\kernel\ntstubs.c @ 4789]
f75d6d48 7ffe0304 00000000 00000022 80afb956 nt!_KiSystemService+0x13f (FPO: [0,3] TrapFrame @ f75d6d64) (CONV: cdecl) [d:\srv03rtm\base\ntos\ke\i386\trap.asm @ 1328]
0088ffe0 75340774 75318a89 00000000 00000022 SharedUserData!SystemCallStub+0x4 (FPO: [0,0,0])
0088ffe8 00000000 00000022 00000004 00000000 winsrv!NtUserCallOneParam+0xc (FPO: [Non-Fpo]) (CONV: stdcall) [d:\srv03rtm\windows\core\umode\daytona\obj\i386\usrstubs.c @ 2683]
WaitStatus = OldThread->WaitStatus;
if (Pending != FALSE) {
1: kd> p
eax=00000000 ebx=89555268 ecx=00000000 edx=80010031 esi=89836020 edi=80a059f8
eip=80a440ed esp=f75d6a38 ebp=f75d6a68 iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
nt!KiSwapThread+0x629:
80a440ed 8b5b50 mov ebx,dword ptr [ebx+50h] ds:0023:895552b8=00000001
1: kd> p
eax=00000000 ebx=00000001 ecx=00000000 edx=80010031 esi=89836020 edi=80a059f8
eip=80a440f0 esp=f75d6a38 ebp=f75d6a68 iopl=0 nv up ei pl zr na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000246
nt!KiSwapThread+0x62c:
80a440f0 8b350431a080 mov esi,dword ptr [nt!_imp_KfLowerIrql (80a03104)] ds:0023:80a03104={hal!KfLowerIrql (804edc30)}