DeviceNodeStarted状态下nt!PipEnumerateDevice函数调用nt!IopQueryDeviceRelations函数查询设备关系

DeviceNodeStarted状态下nt!PipEnumerateDevice函数调用nt!IopQueryDeviceRelations函数查询设备关系

case DeviceNodeStarted:

nextNode = ChildNode;

if (!ProcessOnlyIntermediateStates) {

if ((currentNode->Flags & DNF_REENUMERATE)) {

status = PipEnumerateDevice(currentNode, Synchronous);

if (NT_SUCCESS(status)) {

//

// Remember the bus we just enumerated.

//

enumeratedBus = currentNode;

nextNode = SameNode;

} else if (status == STATUS_PENDING) {

nextNode = SiblingNode;

}

}

}

break;

NTSTATUS

PipEnumerateDevice(

IN PDEVICE_NODE DeviceNode,

IN BOOLEAN Synchronous

)

{

NTSTATUS status;

PAGED_CODE();

//

// Clear the flag before the query so we dont lose an enum request.

//

DeviceNode->Flags &= ~DNF_REENUMERATE;

status = IopQueryDeviceRelations(BusRelations,

DeviceNode->PhysicalDeviceObject,

Synchronous,

&DeviceNode->OverUsed1.PendingDeviceRelations

);

return status;

}

0: kd> kc

00 nt!IopQueryDeviceRelations

01 nt!PipEnumerateDevice

02 nt!PipProcessDevNodeTree

03 nt!PiProcessReenumeration

04 nt!PipDeviceActionWorker

05 nt!PipRequestDeviceAction

06 nt!PipAddDevicesToBootDriverWorker

07 nt!PipApplyFunctionToServiceInstances

08 nt!PipAddDevicesToBootDriver

09 nt!IopInitializeBootDrivers

0a nt!IoInitSystem

0b nt!Phase1Initialization

0c nt!PspSystemThreadStartup

0d nt!KiThreadStartup

0: kd> dv

Relations = BusRelations (0n0)

DeviceObject = 0x899869f0 Device for "\Driver\PnpManager"

Synchronous = 0x01 ''

DeviceRelations = 0x89986978

irpSp = struct _IO_STACK_LOCATION

0: kd> g

Breakpoint 22 hit

eax=f789a2bc ebx=89986898 ecx=00000000 edx=899869f0 esi=89986898 edi=00000000

eip=80c95c56 esp=f789a2a4 ebp=f789a2e0 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!IopSynchronousCall:

80c95c56 55 push ebp

0: kd> g

Breakpoint 24 hit

eax=0000001b ebx=00000000 ecx=89543958 edx=899bf5b0 esi=899bf5b0 edi=89543530

eip=f738c938 esp=f789a258 ebp=f789a270 iopl=0 nv up ei ng nz na pe nc

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

ftdisk!FtDiskPnp:

f738c938 55 push ebp

0: kd> kc

00 ftdisk!FtDiskPnp

01 nt!IofCallDriver

02 nt!IopSynchronousCall

03 nt!IopQueryDeviceRelations

04 nt!PipEnumerateDevice

05 nt!PipProcessDevNodeTree

06 nt!PiProcessReenumeration

07 nt!PipDeviceActionWorker

08 nt!PipRequestDeviceAction

09 nt!PipAddDevicesToBootDriverWorker

0a nt!PipApplyFunctionToServiceInstances

0b nt!PipAddDevicesToBootDriver

0c nt!IopInitializeBootDrivers

0d nt!IoInitSystem

0e nt!Phase1Initialization

0f nt!PspSystemThreadStartup

10 nt!KiThreadStartup

case IRP_MN_QUERY_DEVICE_RELATIONS:

if (irpSp->Parameters.QueryDeviceRelations.Type != BusRelations) {

IoSkipCurrentIrpStackLocation(Irp);

return IoCallDriver(targetObject, Irp);

}

FtpAcquire(rootExtension);

n = 0;

for (l = rootExtension->VolumeList.Flink;

l != &rootExtension->VolumeList; l = l->Flink) {

n++;

}

size = FIELD_OFFSET(DEVICE_RELATIONS, Objects) +

n*sizeof(PDEVICE_OBJECT);

deviceRelations = (PDEVICE_RELATIONS)

ExAllocatePool(PagedPool, size);

if (!deviceRelations) {

FtpRelease(rootExtension);

status = STATUS_INSUFFICIENT_RESOURCES;

Irp->IoStatus.Information = 0;

break;

}

deviceRelations->Count = n;

n = 0;

for (l = rootExtension->VolumeList.Flink;

l != &rootExtension->VolumeList; l = l->Flink) {

e = CONTAINING_RECORD(l, VOLUME_EXTENSION, ListEntry);

deviceRelations->Objects[n++] = e->DeviceObject;

ObReferenceObject(e->DeviceObject);

}

while (!IsListEmpty(&rootExtension->DeadVolumeList)) {

l = RemoveHeadList(&rootExtension->DeadVolumeList);

e = CONTAINING_RECORD(l, VOLUME_EXTENSION, ListEntry);

e->DeadToPnp = TRUE;

}

FtpRelease(rootExtension);

Irp->IoStatus.Status = STATUS_SUCCESS;

Irp->IoStatus.Information = (ULONG_PTR) deviceRelations;

IoSkipCurrentIrpStackLocation(Irp);

return IoCallDriver(targetObject, Irp);

0: kd> dt ROOT_EXTENSION 0x895435e8

ftdisk!ROOT_EXTENSION

+0x000 DeviceObject : 0x89543530 _DEVICE_OBJECT

+0x004 Root : 0x895435e8 ROOT_EXTENSION

+0x008 DeviceExtensionType : 0

+0x00c SpinLock : 0

+0x010 DriverObject : 0x89543958 _DRIVER_OBJECT

+0x014 TargetObject : 0x899869f0 _DEVICE_OBJECT

+0x018 Pdo : 0x899869f0 _DEVICE_OBJECT

+0x01c VolumeList : _LIST_ENTRY [ 0x89543604 - 0x89543604 ]

+0x024 DeadVolumeList : _LIST_ENTRY [ 0x8954360c - 0x8954360c ]

+0x02c NextVolumeNumber : 1

+0x030 DiskInfoSet : 0x8990f778 FT_LOGICAL_DISK_INFORMATION_SET

+0x034 WorkerThread : (null)

+0x038 WorkerQueue : _LIST_ENTRY [ 0x89543620 - 0x89543620 ]

+0x040 WorkerSemaphore : _KSEMAPHORE

+0x054 TerminateThread : 0n1

+0x058 ChangeNotifyIrpList : _LIST_ENTRY [ 0x89543640 - 0x89543640 ]

+0x060 Mutex : _KSEMAPHORE

+0x074 VolumeManagerInterfaceName : _UNICODE_STRING "\??\Root#ftdisk#0000#{53f5630e-b6bf-11d0-94f2-00a0c91efb8b}"

+0x07c PastBootReinitialize : 0 ''

+0x07d FtCodeLocked : 0 ''

+0x07e PastReinitialize : 0 ''

+0x080 DiskPerfRegistryPath : _UNICODE_STRING "\Registry\Machine\System\CurrentControlSet\Services\Ftdisk"

+0x088 PmWmiCounterLibContext : _PMWMICOUNTERLIB_CONTEXT

+0x09c ESPUniquePartitionGUID : _GUID {00000000-0000-0000-0000-000000000000}

+0x0ac NumberOfAttributeRevertEntries : 0

+0x0b0 GptAttributeRevertEntries : (null)

+0x0b4 PreExposureCount : 0

deviceRelations = (PDEVICE_RELATIONS)

ExAllocatePool(PagedPool, size);

if (!deviceRelations) {

FtpRelease(rootExtension);

status = STATUS_INSUFFICIENT_RESOURCES;

Irp->IoStatus.Information = 0;

break;

}

0: kd> p

eax=e13026d0 ebx=899bf5b0 ecx=00000002 edx=000003ff esi=895435e8 edi=00000000

eip=f738c9cc esp=f789a22c ebp=f789a254 iopl=0 nv up ei pl zr na pe nc

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

ftdisk!FtDiskPnp+0x94:

f738c9cc 3bc7 cmp eax,edi

0: kd> dt DEVICE_RELATIONS e13026d0

nt!DEVICE_RELATIONS

+0x000 Count : 0

+0x004 Objects : [1] 0xe134c009 _DEVICE_OBJECT

Irp->IoStatus.Status = STATUS_SUCCESS;

Irp->IoStatus.Information = (ULONG_PTR) deviceRelations;

0: kd> dx -id 0,0,899a2278 -r1 -nv (*((ftdisk!_IRP *)0x899bf5b0))

(*((ftdisk!_IRP *)0x899bf5b0)) [Type: _IRP]

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

+0x002\] Size : 0x190 \[Type: unsigned short

+0x004\] MdlAddress : 0x0 \[Type: _MDL \*

+0x008\] Flags : 0x0 \[Type: unsigned long

+0x00c\] AssociatedIrp \[Type: __unnamed

+0x010\] ThreadListEntry \[Type: _LIST_ENTRY

+0x018\] IoStatus \[Type: _IO_STATUS_BLOCK

+0x020\] RequestorMode : 0 \[Type: char

+0x021\] PendingReturned : 0x0 \[Type: unsigned char

+0x022\] StackCount : 2 \[Type: char

+0x023\] CurrentLocation : 2 \[Type: char

+0x024\] Cancel : 0x0 \[Type: unsigned char

+0x025\] CancelIrql : 0x0 \[Type: unsigned char

+0x026\] ApcEnvironment : 0 \[Type: char

+0x027\] AllocationFlags : 0x4 \[Type: unsigned char

+0x028\] UserIosb : 0xf789a294 \[Type: _IO_STATUS_BLOCK \*

+0x02c\] UserEvent : 0xf789a284 \[Type: _KEVENT \*

+0x030\] Overlay \[Type: __unnamed

+0x038\] CancelRoutine : 0x0 \[Type: void (\*)(_DEVICE_OBJECT \*,_IRP \*)

+0x03c\] UserBuffer : 0x0 \[Type: void \*

+0x040\] Tail \[Type: __unnamed

0: kd> dx -id 0,0,899a2278 -r1 (*((ftdisk!_IO_STATUS_BLOCK *)0x899bf5c8))

(*((ftdisk!_IO_STATUS_BLOCK *)0x899bf5c8)) [Type: _IO_STATUS_BLOCK]

+0x000\] Status : 0 \[Type: long

+0x000\] Pointer : 0x0 \[Type: void \*

+0x004\] Information : 0xe13026d0 \[Type: unsigned long

0: kd> p

eax=0000001b ebx=00000000 ecx=899873b0 edx=899bf5b0 esi=899bf5b0 edi=899869f0

eip=80a26758 esp=f789a210 ebp=f789a224 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!IofCallDriver+0x5e:

80a26758 ff548138 call dword ptr [ecx+eax*4+38h] ds:0023:89987454={nt!IopPnPDispatch (80cb0b36)}

0: kd> t

eax=0000001b ebx=00000000 ecx=899873b0 edx=899bf5b0 esi=899bf5b0 edi=899869f0

eip=80cb0b36 esp=f789a20c ebp=f789a224 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!IopPnPDispatch:

80cb0b36 55 push ebp

0: kd> kc

00 nt!IopPnPDispatch

01 nt!IofCallDriver

02 ftdisk!FtDiskPnp

03 nt!IofCallDriver

04 nt!IopSynchronousCall

05 nt!IopQueryDeviceRelations

06 nt!PipEnumerateDevice

07 nt!PipProcessDevNodeTree

08 nt!PiProcessReenumeration

09 nt!PipDeviceActionWorker

0a nt!PipRequestDeviceAction

0b nt!PipAddDevicesToBootDriverWorker

0c nt!PipApplyFunctionToServiceInstances

0d nt!PipAddDevicesToBootDriver

0e nt!IopInitializeBootDrivers

0f nt!IoInitSystem

10 nt!Phase1Initialization

11 nt!PspSystemThreadStartup

12 nt!KiThreadStartup

0: kd> dv

DeviceObject = 0x899869f0 Device for "\Driver\PnpManager"

Irp = 0x899bf5b0

information = 0x899869f0

length = 8

uiNumber = 0xf789a224

0: kd> dt IOPNP_DEVICE_EXTENSION 0x89986aa8

nt!IOPNP_DEVICE_EXTENSION

+0x000 CompatibleIdList : (null)

+0x004 CompatibleIdListSize : 0

if (Relations == BusRelations) {

deviceNode->CompletionStatus = status;

PipSetDevNodeState( deviceNode, DeviceNodeEnumerateCompletion, NULL );

status = STATUS_SUCCESS;

}

return status;

}

0: kd> p

Root\ftdisk\0000: DeviceNodeStarted => DeviceNodeEnumerateCompletion

eax=00000000 ebx=89986898 ecx=80ae0dfa edx=00000045 esi=89986898 edi=00000000

eip=80a2e406 esp=f789a2b4 ebp=f789a2e0 iopl=0 nv up ei ng nz na pe cy

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

nt!IopQueryDeviceRelations+0x4c:

80a2e406 33c0 xor eax,eax

case DeviceNodeStarted:

nextNode = ChildNode;

if (!ProcessOnlyIntermediateStates) {

if ((currentNode->Flags & DNF_REENUMERATE)) {

status = PipEnumerateDevice(currentNode, Synchronous); 返回到这里

if (NT_SUCCESS(status)) {

//

// Remember the bus we just enumerated.

//

enumeratedBus = currentNode;

nextNode = SameNode;

} else if (status == STATUS_PENDING) {

nextNode = SiblingNode;

}

}

}

break;

现在状态:DeviceNodeEnumerateCompletion下应该调用函数PipEnumerateCompleted

先一个节点类型是子节点。

case DeviceNodeEnumerateCompletion:

status = PipEnumerateCompleted(currentNode);

nextNode = ChildNode;

break;