处理完ACPI!AcpiBuildRunMethodList链表后返回要检查acpi!AcpiBuildQueueList链表不空运行continue继续循环

处理完ACPI!AcpiBuildRunMethodList链表后返回要检查acpi!AcpiBuildQueueList链表不空运行continue继续循环

0: kd> g

Breakpoint 5 hit

eax=00000000 ebx=00000000 ecx=89906e40 edx=00000001 esi=89906e30 edi=80b019f4

eip=f73fb911 esp=f789ef68 ebp=f789ef84 iopl=0 nv up ei pl zr na pe nc

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

ACPI!ACPIBuildProcessGenericList+0x4d:

f73fb911 ff55f4 call dword ptr [ebp-0Ch] ss:0010:f789ef78={ACPI!ACPIBuildProcessGenericComplete (f73fb840)}

0: kd> t

Breakpoint 10 hit

eax=00000000 ebx=00000000 ecx=89906e40 edx=00000001 esi=89906e30 edi=80b019f4

eip=f73fb840 esp=f789ef64 ebp=f789ef84 iopl=0 nv up ei pl zr na pe nc

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

ACPI!ACPIBuildProcessGenericComplete:

f73fb840 55 push ebp

0: kd> kc

00 ACPI!ACPIBuildProcessGenericComplete

01 ACPI!ACPIBuildProcessGenericList

02 ACPI!ACPIBuildDeviceDpc

03 nt!KiRetireDpcList

04 nt!KiDispatchInterrupt

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

05 0x0

0: kd> dv

BuildRequest = 0x89906e30

deviceExtension = 0x89906e30

0: kd> gu

Breakpoint 6 hit

eax=00000000 ebx=00000000 ecx=00010001 edx=00000000 esi=89906e30 edi=80b019f4

eip=f73fb914 esp=f789ef6c ebp=f789ef84 iopl=0 nv up ei pl zr na pe nc

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

ACPI!ACPIBuildProcessGenericList+0x50:

f73fb914 85db test ebx,ebx

0: kd> dv tempEntry

tempEntry = 0xf743b870 [ 0xf743b870 - 0xf743b870 ]

0: kd> dx -r1 ((ACPI!_LIST_ENTRY *)0xf743b870)

((ACPI!_LIST_ENTRY *)0xf743b870) : 0xf743b870 [Type: _LIST_ENTRY *]

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

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

0: kd> u 0xf743b870

ACPI!AcpiBuildRunMethodList:

f743b870 70b8 jo ACPI!BuildRequestLookAsideList+0x4a (f743b82a)

f743b872 43 inc ebx

f743b873 f770b8 div eax,dword ptr [eax-48h]

f743b876 43 inc ebx

f743b877 f778b8 idiv eax,dword ptr [eax-48h]

f743b87a 43 inc ebx

f743b87b f778b8 idiv eax,dword ptr [eax-48h]

f743b87e 43 inc ebx

//

// If we have completed the request, then we should look at the

// at the next request, otherwise, we need to look at the current

// request again

if ( workDone == WORK_DONE_COMPLETE || workDone == WORK_DONE_FAILURE) {

currentEntry = tempEntry; 条件成立。

}

ACPI!AcpiBuildRunMethodList列表里面已经没有可以处理的!!!

while (currentEntry != ListEntry) { 不成立。

退出函数。

VOID

ACPIBuildDeviceDpc(

IN PKDPC Dpc,

IN PVOID DpcContext,

IN PVOID SystemArgument1,

IN PVOID SystemArgument2

)

{

//

// We actually care what this call returns. The reason we do

// is that we want all of the control methods to be run before

// we do any of the following steps

//

status = ACPIBuildProcessGenericList(

&AcpiBuildRunMethodList,

AcpiBuildRunMethodDispatch

);

//

// We must own the spin lock before we do the following...

//

KeAcquireSpinLockAtDpcLevel( &AcpiBuildQueueLock );

//

// If we got back STATUS_PENDING, that means that there's

// a method queued in the interpreter somewhere. This will

// cause the DPC to (eventually) become scheduled again.

// That means that we don't have to do anything special to

// handle it.

//

if (status == STATUS_PENDING) {

continue;

}

//

// The case that is special is where we are do get STATUS_SUCCESS

// back. This indicates that we've drained the list. The little

// fly in the ointment is that we might have scheduled other

// run requests, but those are stuck in the BuildQueue list. So

// what we need to do here is check to see if the BuildQueue list

// is non-empty and if it is, set the AcpiBuildWorkDone to TRUE

// so that we iterage again (and move the elements to the proper

// list).

//

if (!IsListEmpty( &AcpiBuildQueueList) ) {

AcpiBuildWorkDone = TRUE;

continue;

}