1. при чем тут были глобальные переменные?)
Так вот и я не понимаю почему в крашдампе были указаны адреса глобальных переменных
2. "тот же бсод" - это относилось к какой части этой сотни строчек?
Переделал вот так
if (oldrel)
size = sizeof(DEVICE_RELATIONS) + (oldrel->Count) * sizeof(PDEVICE_OBJECT);
else
size = sizeof(DEVICE_RELATIONS);
newrel = (PDEVICE_RELATIONS) ExAllocatePool(PagedPool, size);
if (newrel) {
if (oldrel) { // copy & extend
RtlCopyMemory(newrel, oldrel, size - sizeof(PDEVICE_OBJECT));
ExFreePool(oldrel);
}
else
newrel->Count = 0;
newrel->Objects[newrel->Count] = BusDeviceObject;
newrel->Count++;
ObReferenceObject(BusDeviceObject);
Irp->IoStatus.Information = (ULONG_PTR) newrel;
} // build new list
else
status = STATUS_INSUFFICIENT_RESOURCES;
Irp->IoStatus.Status = status;
Всё-равно бсодит
3. почему вы читаете oldrel = (PDEVICE_RELATIONS) Irp->IoStatus.Information; когда Irp->IoStatus вроде всегда был выходным параметром? что вы пытаетесь оттуда прочесть если вы туда еще не писали?
На случай, если вышестоящее устройство тоже создаст свой PDO