windows线程切换之一个线程的Quantum: -93都是在处理KDPC

windows线程切换之一个线程的Quantum: -93都是在处理KDPC----线程切换和KDPC没有关系

hal!HalRequestSoftwareInterrupt虽然运行了,但是没有激发nt!KiDispatchInterrupt

为什么?因为当前是处理kdpc的时候DISPATCH_LEVEL,irql=2,不能激发nt!KiDispatchInterrupt!!!和下文说的情况是一个意思。

KiExitDispatcher为什么要判断Prcb->DpcRoutineActive == FALSE和KiRetireDpcList设置Prcb->DpcRoutineActive有关--重要

https://chenghao.blog.csdn.net/article/details/156086387

1: kd> g

Breakpoint 16 hit

eax=ffdff000 ebx=895f2a78 ecx=00000002 edx=000013ea esi=00002707 edi=e73f7530

eip=804ee4f8 esp=f789e820 ebp=f789e838 iopl=0 nv up ei pl nz na pe nc

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

hal!HalRequestSoftwareInterrupt:

804ee4f8 643a0d95000000 cmp cl,byte ptr fs:[95h] fs:0030:00000095=00

0: kd> x nt!*tickcount

80b16f80 nt!KeTickCount = struct _KSYSTEM_TIME

80b16f80 nt!_KeTickCount = 0x105ee872

80a30bac nt!KeQueryTickCount (union _LARGE_INTEGER *)

80afc19a nt!_KiGetTickCount (void)

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

((ntkrnlmp!_KPRCB *)0xffdff120) : 0xffdff120 [Type: _KPRCB *]

+0x000\] MinorVersion : 0x1 \[Type: unsigned short

+0x002\] MajorVersion : 0x1 \[Type: unsigned short

+0x004\] CurrentThread : 0x895f2a78 \[Type: _KTHREAD \*

+0x008\] NextThread : 0x89555268 \[Type: _KTHREAD \*

+0x928\] ReadySummary : 0x1000 \[Type: unsigned long

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

((ntkrnlmp!_KTHREAD *)0x895f2a78) : 0x895f2a78 [Type: _KTHREAD *]

+0x000\] Header \[Type: _DISPATCHER_HEADER

+0x010\] MutantListHead \[Type: _LIST_ENTRY

+0x018\] InitialStack : 0xba1b1000 \[Type: void \*

+0x01c\] StackLimit : 0xba1ad000 \[Type: void \*

+0x020\] KernelStack : 0xba1b0c5c \[Type: void \*

+0x024\] ThreadLock : 0x0 \[Type: unsigned long

+0x028\] ContextSwitches : 0x470 \[Type: unsigned long

+0x02c\] State : 0x2 \[Type: unsigned char

+0x02d\] NpxState : 0xa \[Type: unsigned char

+0x02e\] WaitIrql : 0x0 \[Type: unsigned char

+0x02f\] WaitMode : 1 \[Type: char

+0x030\] Teb : 0x7ffd5000 \[Type: void \*

+0x034\] ApcState \[Type: _KAPC_STATE

+0x04c\] ApcQueueLock : 0x0 \[Type: unsigned long

+0x050\] WaitStatus : 258 \[Type: long

+0x054\] WaitBlockList : 0x895f2b18 \[Type: _KWAIT_BLOCK \*

+0x058\] Alertable : 0x0 \[Type: unsigned char

+0x059\] WaitNext : 0x0 \[Type: unsigned char

+0x05a\] WaitReason : 0x6 \[Type: unsigned char

+0x05b\] Priority : 13 '\\r' \[Type: char

+0x05c\] EnableStackSwap : 0x1 \[Type: unsigned char

+0x05d\] SwapBusy : 0x0 \[Type: unsigned char

+0x05e\] Alerted \[Type: unsigned char \[2\]

+0x060\] WaitListEntry \[Type: _LIST_ENTRY

+0x060\] SwapListEntry \[Type: _SINGLE_LIST_ENTRY

+0x068\] Queue : 0x0 \[Type: _KQUEUE \*

+0x06c\] WaitTime : 0x105ee7d7 \[Type: unsigned long

+0x070\] KernelApcDisable : 0 \[Type: short

+0x072\] SpecialApcDisable : 0 \[Type: short

+0x070\] CombinedApcDisable : 0x0 \[Type: unsigned long

+0x078\] Timer \[Type: _KTIMER

+0x0a0\] WaitBlock \[Type: _KWAIT_BLOCK \[4\]

+0x100\] QueueListEntry \[Type: _LIST_ENTRY

+0x108\] ApcStateIndex : 0x0 \[Type: unsigned char

+0x109\] ApcQueueable : 0x1 \[Type: unsigned char

+0x10a\] Preempted : 0x1 \[Type: unsigned char

+0x10b\] ProcessReadyQueue : 0x0 \[Type: unsigned char

+0x10c\] KernelStackResident : 0x1 \[Type: unsigned char

+0x10d\] Saturation : 0 \[Type: char

+0x10e\] IdealProcessor : 0x0 \[Type: unsigned char

+0x10f\] NextProcessor : 0x0 \[Type: unsigned char

+0x110\] BasePriority : 13 '\\r' \[Type: char

+0x111\] Spare4 : 0x0 \[Type: unsigned char

+0x112\] PriorityDecrement : 0 \[Type: char

+0x113\] Quantum : -93 \[Type: char

+0x114\] SystemAffinityActive : 0x0 \[Type: unsigned char

+0x115\] PreviousMode : 1 \[Type: char

+0x116\] ResourceIndex : 0x1 \[Type: unsigned char

+0x117\] DisableBoost : 0x0 \[Type: unsigned char

+0x118\] UserAffinity : 0x3 \[Type: unsigned long

+0x11c\] Process : 0x8954e020 \[Type: _KPROCESS \*

+0x120\] Affinity : 0x3 \[Type: unsigned long

+0x124\] ServiceTable : 0x80b207a0 \[Type: void \*

+0x128\] ApcStatePointer \[Type: _KAPC_STATE \* \[2\]

+0x130\] SavedApcState \[Type: _KAPC_STATE

+0x148\] CallbackStack : 0x0 \[Type: void \*

+0x14c\] Win32Thread : 0xe17c0d18 \[Type: void \*

+0x150\] TrapFrame : 0xba1b0d64 \[Type: _KTRAP_FRAME \*

+0x154\] KernelTime : 0x12 \[Type: unsigned long

+0x158\] UserTime : 0x4 \[Type: unsigned long

+0x15c\] StackBase : 0xba1b1000 \[Type: void \*

+0x160\] SuspendApc \[Type: _KAPC

+0x190\] SuspendSemaphore \[Type: _KSEMAPHORE

+0x1a4\] TlsArray : 0x0 \[Type: void \*

+0x1a8\] LegoData : 0x0 \[Type: void \*

+0x1ac\] ThreadListEntry \[Type: _LIST_ENTRY

+0x1b4\] LargeStack : 0x1 \[Type: unsigned char

+0x1b5\] PowerState : 0x0 \[Type: unsigned char

+0x1b6\] NpxIrql : 0x0 \[Type: unsigned char

+0x1b7\] Spare5 : 0x0 \[Type: unsigned char

+0x1b8\] AutoAlignment : 0x0 \[Type: unsigned char

+0x1b9\] Iopl : 0x0 \[Type: unsigned char

+0x1ba\] FreezeCount : 0 \[Type: char

+0x1bb\] SuspendCount : 0 \[Type: char

+0x1bc\] Spare0 \[Type: unsigned char \[1\]

+0x1bd\] UserIdealProcessor : 0x0 \[Type: unsigned char

+0x1be\] DeferredProcessor : 0x0 \[Type: unsigned char

+0x1bf\] AdjustReason : 0x0 \[Type: unsigned char

+0x1c0\] AdjustIncrement : 0 \[Type: char

+0x1c1\] Spare2 \[Type: unsigned char \[3\]

0: kd> g

Breakpoint 49 hit

eax=0000001b ebx=804edc6c ecx=80b16802 edx=00000000 esi=00000000 edi=f7737120

eip=80a4002e esp=f78aed64 ebp=f78aed80 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!KiExitDispatcher+0x42:

80a4002e 807dfc02 cmp byte ptr [ebp-4],2 ss:0010:f78aed7c=02

1: kd> g

Breakpoint 16 hit

eax=ffdff000 ebx=895f2a78 ecx=00000002 edx=000013ea esi=00002707 edi=e741d78a

eip=804ee4f8 esp=f789e818 ebp=f789e830 iopl=0 nv up ei pl nz na pe nc

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

hal!HalRequestSoftwareInterrupt:

804ee4f8 643a0d95000000 cmp cl,byte ptr fs:[95h] fs:0030:00000095=00

0: kd> g

Breakpoint 49 hit

eax=0000001b ebx=804edc6c ecx=80b16802 edx=00000000 esi=00000000 edi=ffdff120

eip=80a4002e esp=f789ed88 ebp=f789eda4 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!KiExitDispatcher+0x42:

80a4002e 807dfc02 cmp byte ptr [ebp-4],2 ss:0010:f789eda0=02

0: kd> g

Breakpoint 49 hit

eax=0000001b ebx=804edc6c ecx=80b16802 edx=00000000 esi=00000000 edi=ffdff120

eip=80a4002e esp=f789ed88 ebp=f789eda4 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!KiExitDispatcher+0x42:

80a4002e 807dfc02 cmp byte ptr [ebp-4],2 ss:0010:f789eda0=02

0: kd> kc

00 nt!KiExitDispatcher

01 nt!KeSetEvent

02 HIDCLASS!HidpSubmitInterruptRead

03 HIDCLASS!HidpInterruptReadComplete

04 nt!IopfCompleteRequest

05 USBPORT!USBPORT_CompleteTransfer

06 USBPORT!USBPORT_DoneTransfer

07 USBPORT!USBPORT_FlushDoneTransferList

08 USBPORT!USBPORT_DpcWorker

09 USBPORT!USBPORT_IsrDpcWorker

0a USBPORT!USBPORT_IsrDpc

0b nt!KiRetireDpcList

0c nt!KiDispatchInterrupt

WARNING: Frame IP not in any known module. Following frames may be wrong.

0d 0x0