• 抬起头,继续前进吧,去把这个不完美的故事,变成你成所期望的样子
  • 登山路上我们会放弃很多东西,但这些被我们丢掉在我们登上山顶之际,都会一一回来
  • 不论开发还是逆向,数学水平的高低直接决定了”你的饭碗里有没有肉”
  • 万丈高楼平地起,勿在浮沙筑高台

Windows驱动开发-正确获取驱动对象的所有设备对象代码示例

C++ 菜鸟 11个月前 (01-30) 2507次浏览 已收录 0个评论

前言

        菜鸟在写完《Windows 驱动开发详解》的示例后,在 Win7 上测试基本正常,就是一调用IoDeviceDelete删除时就蓝屏,分析 Dump 看到了 C05,程序上上下下测试了好几遍也没解决。
        后来在看 MSDN 时,发现DEVICE_OBJECT结构体NextDevice是非文档化的成员,不推荐直接使用。菜鸟换成 API 获取设备对象后,问题就解决啦~ 获取代码奉上,希望后来者看到后可以少走点弯路^_^

涉及 API

IoEnumerateDeviceObjectList
ExAllocatePoolWithTag
ObDereferenceObject
ExFreePoolWithTag

代码示例

这段代码是从当时的驱动程序中直接截取的,可以有些变量的声明没看到,大家写的时候自己加上就好了。

PDEVICE_OBJECT *apstDeviceObejctList = NULL;
NTSTATUS ntStatus = STATUS_UNSUCCESSFUL;

do
{
    // Get number of device object.
    ntStatus = IoEnumerateDeviceObjectList(pstDriverObject,
                                           NULL,
                                           0,
                                           &ulDeviceObjectNumber);
    ulDeiveObjectListSize = sizeof(PDEVICE_OBJECT) * ulDeviceObjectNumber;

    // Allocate memory.
    apstDeviceObejctList = 
        (PDEVICE_OBJECT *)
        ExAllocatePoolWithTag(PagedPool,
                              ulDeiveObjectListSize,
                              DEVICE_OBJECT_LIST_TAG);
    if (NULL == apstDeviceObejctList)
    {
        KdPrint(("ExAllocatePoolWithTag failed.\r\n"));
        break;
    }

    // Get device object list.
    ntStatus = IoEnumerateDeviceObjectList(pstDriverObject,
                                           apstDeviceObejctList,
                                           ulDeiveObjectListSize,
                                           &ulDeviceObjectNumber);
    if (!NT_SUCCESS(ntStatus))
    {
        KdPrint(("IoEnumerateDeviceObjectList failed.\r\n"));
        break;
    }

    for (ULONG cntI = 0; cntI < ulDeviceObjectNumber; cntI++)
    {
        // Normal check.
        if (NULL == apstDeviceObejctList[cntI])
        {
            continue;
        }

        ObDereferenceObject(apstDeviceObejctList[cntI]);
        pstDeviceExtension = 
            (PDEVICE_EXTENSION)apstDeviceObejctList[cntI]->DeviceExtension;

        // TODO: Do your operation.
        ...
    }
} while (false); //! do 'Delete device and symbol' while END 

// Free memory.
if (NULL != apstDeviceObejctList)
{
    ExFreePoolWithTag(apstDeviceObejctList, DEVICE_OBJECT_LIST_TAG);
}

学习心得 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Windows 驱动开发-正确获取驱动对象的所有设备对象代码示例
喜欢 (0)
[]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址