Добрый день. Столкнулся со следующими вопросами, ответить на которые сам не могу.
1. Как получить имя устройства если известен указатель PDEVICE_OBJECT?
2. Каким образом в ядре можно перечислить все устройства(DEVICE_OBJECT) или драйвера (DRIVER_OBJECT)?
3. Нужно получить указатель на device_object но он не всегда тот что нужен. см. ниже.
PDEVICE_OBJECT DeviceObject = GetDeviceObject(dev_name, &pfile);
if (DeviceObject)
{
// 2. Get pointer to the lowest device in stack
DeviceObject = GetLowestDevice(DeviceObject);
// for( move_to device with flag DO_DEVICE_HAS_NAME)
}
// ...
PDEVICE_OBJECT GetLowestDevice(__in PDEVICE_OBJECT DeviceObject)
{
PDEVICE_OBJECT pLowestDevice = DeviceObject;
PDEVOBJ_EXTENSION deviceExtension = pLowestDevice->DeviceObjectExtension;
while (deviceExtension->AttachedTo)
{
/* Gets the lowest device and its extension */
pLowestDevice = deviceExtension->AttachedTo;
deviceExtension = pLowestDevice->DeviceObjectExtension;
}
return pLowestDevice;
}
GetDeviceName возвращает указатель на устройство с использованием IoGetDeviceObjectPointer, а в таком случае это самый верхний девайс и не всегда тот который нужен. Поэтому использую GetLowestDevice чтобы пропустить все приаттаченные устройства. Но опять же и тут тоже не всё так классно так как нижнее устройство может быть не тем, что ожидалось. Вот тут то мне и требуется дополнительная проверка с именем устройства по указателю на PDEVICE_OBJECT.. I have no idea как это решить.