当前位置: 首页 > news >正文

PipProcessStartPhase3中的PpQueryCompatibleIDs和IopPnPDispatch函数分析以ftdisk.sys为例

PipProcessStartPhase3中的PpQueryCompatibleIDs和IopPnPDispatch函数分析以ftdisk.sys为例


PpQueryHardwareIDs(
DeviceNode,
&hwIds,
&hwIdLength);

PpQueryCompatibleIDs(
DeviceNode,
&compatibleIds,
&compatibleIdLength);


0: kd> dv hwIds
hwIds = 0xe130ced8
0: kd> dx -r1 ((ntkrnlmp!unsigned short *)0xe130ced8)
((ntkrnlmp!unsigned short *)0xe130ced8) : 0xe130ced8 : 0x52 [Type: unsigned short *]
0x52 [Type: unsigned short]
0: kd> db 0xe130ced8
e130ced8 52 00 4f 00 4f 00 54 00-5c 00 46 00 54 00 44 00 R.O.O.T.\.F.T.D.
e130cee8 49 00 53 00 4b 00 00 00-00 00 b2 b2 b2 b2 b2 b2 I.S.K...........
e130cef8 05 06 21 0c 41 72 62 4c-00 00 e0 e6 00 00 00 00 ..!.ArbL........
e130cf08 ff ff ef e6 00 00


0: kd> kc
#
00 nt!PpIrpQueryID
01 nt!PpQueryID
02 nt!PipProcessStartPhase3
03 nt!PipProcessDevNodeTree
04 nt!PiProcessReenumeration
05 nt!PipDeviceActionWorker
06 nt!PipRequestDeviceAction
07 nt!PipAddDevicesToBootDriverWorker
08 nt!PipApplyFunctionToServiceInstances
09 nt!PipAddDevicesToBootDriver
0a nt!IopInitializeBootDrivers
0b nt!IoInitSystem
0c nt!Phase1Initialization
0d nt!PspSystemThreadStartup
0e nt!KiThreadStartup

0: kd> p
eax=00000000 ebx=f789a2e8 ecx=00000000 edx=e130ced8 esi=804edc6c edi=89986898
eip=80c97a07 esp=f789a244 ebp=f789a274 iopl=0 nv up ei ng nz ac pe cy
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000297
nt!PpIrpQueryID+0x3d:
80c97a07 8b5d0c mov ebx,dword ptr [ebp+0Ch] ss:0010:f789a280=00000002
0: kd> dv
DeviceObject = 0x899869f0 Device for "\Driver\PnpManager"
IDType = BusQueryCompatibleIDs (0n2)
ID = 0xf789a2ec
irpSp = struct _IO_STACK_LOCATION
status = 0n2
seed = {134110998500156250}


0: kd> g
Breakpoint 22 hit
eax=f789a250 ebx=00000002 ecx=00000000 edx=e130ced8 esi=f789a2ec edi=f789a274
eip=80c95c56 esp=f789a234 ebp=f789a274 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=f789a1e8 ebp=f789a200 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!PpIrpQueryID
04 nt!PpQueryID
05 nt!PipProcessStartPhase3
06 nt!PipProcessDevNodeTree
07 nt!PiProcessReenumeration
08 nt!PipDeviceActionWorker
09 nt!PipRequestDeviceAction
0a nt!PipAddDevicesToBootDriverWorker
0b nt!PipApplyFunctionToServiceInstances
0c nt!PipAddDevicesToBootDriver
0d nt!IopInitializeBootDrivers
0e nt!IoInitSystem
0f nt!Phase1Initialization
10 nt!PspSystemThreadStartup
11 nt!KiThreadStartup


case IRP_MN_QUERY_ID:
status = FtpQueryRootId(rootExtension, Irp);

if (NT_SUCCESS(status) || (status == STATUS_NOT_SUPPORTED)) {
if (NT_SUCCESS(status)) {
Irp->IoStatus.Status = status;
}

IoSkipCurrentIrpStackLocation(Irp);
return IoCallDriver(targetObject, Irp);
}
break;

NTSTATUS
FtpQueryRootId(
IN PROOT_EXTENSION Extension,
IN PIRP Irp
)
{

switch (irpSp->Parameters.QueryId.IdType) {

case BusQueryDeviceID:
RtlInitUnicodeString(&string, L"ROOT\\FTDISK");
break;

case BusQueryHardwareIDs:
RtlInitUnicodeString(&string, L"ROOT\\FTDISK");
break;

case BusQueryInstanceID:
RtlInitUnicodeString(&string, L"0000");
break;

default:
return STATUS_NOT_SUPPORTED ; //这里返回了!!!


这次没有兼容ID,上次有HardwareID

0: kd> p
eax=0000001b ebx=00000000 ecx=899873b0 edx=899bf5b0 esi=899bf5b0 edi=899869f0
eip=80a26758 esp=f789a1a0 ebp=f789a1b4 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=f789a19c ebp=f789a1b4 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!PpIrpQueryID
06 nt!PpQueryID
07 nt!PipProcessStartPhase3
08 nt!PipProcessDevNodeTree
09 nt!PiProcessReenumeration
0a nt!PipDeviceActionWorker
0b nt!PipRequestDeviceAction
0c nt!PipAddDevicesToBootDriverWorker
0d nt!PipApplyFunctionToServiceInstances
0e nt!PipAddDevicesToBootDriver
0f nt!IopInitializeBootDrivers
10 nt!IoInitSystem
11 nt!Phase1Initialization
12 nt!PspSystemThreadStartup
13 nt!KiThreadStartup
0: kd> dv
DeviceObject = 0x899869f0 Device for "\Driver\PnpManager"
Irp = 0x899bf5b0
information = 0x899869f0
length = 8
uiNumber = 0xf789a1b4
id = 0x00000000


PIOPNP_DEVICE_EXTENSION deviceExtension = DeviceObject->DeviceExtension;


0: kd> dt IOPNP_DEVICE_EXTENSION 0x89986aa8
nt!IOPNP_DEVICE_EXTENSION
+0x000 CompatibleIdList : (null)
+0x004 CompatibleIdListSize : 0

NTSTATUS
IopPnPDispatch(
IN PDEVICE_OBJECT DeviceObject,
IN OUT PIRP Irp
)
{

case IRP_MN_QUERY_ID:
if (DeviceObject != IopRootDeviceNode->PhysicalDeviceObject &&
(!NT_SUCCESS(Irp->IoStatus.Status) || !Irp->IoStatus.Information)) {

deviceNode = (PDEVICE_NODE)DeviceObject->DeviceObjectExtension->DeviceNode;
switch (irpSp->Parameters.QueryId.IdType) {

case BusQueryInstanceID:
case BusQueryDeviceID:

id = (PWCHAR)ExAllocatePool(PagedPool, deviceNode->InstancePath.Length);
if (id) {
ULONG separatorCount = 0;

RtlZeroMemory(id, deviceNode->InstancePath.Length);
information = id;
status = STATUS_SUCCESS;
wp = deviceNode->InstancePath.Buffer;
if (irpSp->Parameters.QueryId.IdType == BusQueryDeviceID) {
while(*wp) {
if (*wp == OBJ_NAME_PATH_SEPARATOR) {
separatorCount++;
if (separatorCount == 2) {
break;
}
}
*id = *wp;
id++;
wp++;
}
} else {
while(*wp) {
if (*wp == OBJ_NAME_PATH_SEPARATOR) {
separatorCount++;
if (separatorCount == 2) {
wp++;
break;
}
}
wp++;
}
while (*wp) {
*id = *wp;
id++;
wp++;
}
}
} else {
status = STATUS_INSUFFICIENT_RESOURCES;
}
break;

case BusQueryCompatibleIDs:

if((Irp->IoStatus.Status != STATUS_NOT_SUPPORTED) ||
(deviceExtension == NULL)) {

//
// Upper driver has given some sort of reply or this device
// object wasn't allocated to handle these requests.
//

status = Irp->IoStatus.Status;
break;
}

if(deviceExtension->CompatibleIdListSize != 0) { 不符合条件!!!

id = ExAllocatePool(PagedPool,
deviceExtension->CompatibleIdListSize);

if(id == NULL) {
status = STATUS_INSUFFICIENT_RESOURCES;
break;
}

RtlCopyMemory(id,
deviceExtension->CompatibleIdList,
deviceExtension->CompatibleIdListSize);

information = id;
status = STATUS_SUCCESS;
break;
}

0: kd> gu
eax=c00000bb ebx=f789a2e8 ecx=00000000 edx=00000000 esi=89986898 edi=89986898
eip=80c8a3a6 esp=f789a288 ebp=f789a29c 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!PpQueryID+0x80:
80c8a3a6 33c9 xor ecx,ecx
0: kd> dv
DeviceNode = 0x89986898
IDType = BusQueryCompatibleIDs (0n2)
ID = 0xf789a2ec
IDLength = 0xf789a2e8
status = 0n-141974808
reason = ""
0: kd> dx -r1 ((ntkrnlmp!unsigned short * *)0xf789a2ec)
((ntkrnlmp!unsigned short * *)0xf789a2ec) : 0xf789a2ec [Type: unsigned short * *]
0x0 [Type: unsigned short *]


0: kd> gu
eax=c00000bb ebx=00000000 ecx=00000000 edx=00000000 esi=804edc6c edi=89986898
eip=80c923b1 esp=f789a2b4 ebp=f789a300 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!PipProcessStartPhase3+0x8b:
80c923b1 395df0 cmp dword ptr [ebp-10h],ebx ss:0010:f789a2f0=e130ced8
0: kd> dv compatibleIds
compatibleIds = 0x00000000
0: kd> dv compatibleIdLength
compatibleIdLength = 0

http://www.rkmt.cn/news/159123.html

相关文章:

  • 什么是 RESTful API?凭什么能流行 20 多年?
  • IRC协议:穿越时光的互联网实时聊天奠基者
  • ModelEngine测评——Aido在线Agent应用创建测试
  • 《ESP32-S3使用指南—IDF版 V1.6》第五十七章 乐鑫AI库简介
  • 3P游戏动作为何总对不上位移?
  • ModelEngine二番测评之Nexent智能体的APIKey是在哪来的
  • Palantir 架构
  • 2025年12月四川成都市政管道、波纹管、骨架管、给水管、电力管公司推荐榜 - 2025年品牌推荐榜
  • 专科生必看!9个高效降aigc工具推荐,轻松过审不踩坑
  • pg_waldump 和 pg_xlogdump
  • 一个简单想法的实验随笔-胜任能力
  • 2025年12月江苏徐州变压器系列,智能变电站,新能源配套,高低压配电柜,智慧电力系统厂家选择指南 - 2025年品牌推荐榜
  • 2025年门式冲洗装置直销厂家权威推荐榜单:液压水力冲洗门/水力冲洗门/智能控制拍门源头厂家精选 - 品牌推荐官
  • 哪家上海装修公司口碑最好?21年零投诉实力验证 - 品牌排行榜
  • ModelEngine的Aido智能体【娱乐生涯 AI 助手】升级计划——工作流编排精确制导AI应用
  • 新手前端必看:5分钟搞懂IIFE的作用与实战妙用
  • 2025升降机厂家TOP10推荐 国内靠谱品牌榜单出炉,苏州卓高9.99分登顶 - 品牌智鉴榜
  • OpenCSG社区:激发城市AI主权创新引擎
  • 美团战略携手赚转鱼科技 定义黄金回收“即时服务”新时代
  • 2025年12月市政管道、波纹管、骨架管、给水管、电力管厂家推荐 - 2025年品牌推荐榜
  • RAG应用性能优化入门指南
  • 17、做中学 | 初三下期 Golang档案操作
  • 基于大数据的国内篮球联赛数据分析与可视化系统(毕设源码+文档)
  • 2025年目前口碑好的仓库货架定制厂家口碑推荐榜单,重型货架/仓储货架/货架/阁楼货架/层板货架,仓库货架产品口碑排行榜 - 品牌推荐师
  • 基于 YOLOv5n 的课堂手机检测系统:让“低头族”无处遁形
  • AI浪潮下的前端范式转移:从代码实现者到思维架构师
  • 如何禁止C++类对象的禁止拷贝操作
  • PLC ethercat总线伺服资料 信捷PLC EtherCat总线9轴凸轮伺服,包括PLC...
  • 2025年12月江苏徐州装修、装修设计、装修施工、设计工作室、别墅设计哪家专业可靠 - 2025年品牌推荐榜
  • 铜箔加工制造商推荐:一站式服务+快速打样(附案例) - 品牌排行榜