获得DISK的DeviceObject

Windows 驱动开发:借壳通信技术实践详解 本文详细介绍了 Windows 驱动开发中的借壳通信技术,通过示例代码展示了如何使用 ObReferenceObjectByName 函数实现借壳通信以及如何处理 IRP 控制请求。同时,我们回答了关于驱动对象类型、保存原有处理函数以及处理 IRP 控制请求的问题。希望本文能够帮助您更好地理解和应用借壳通信技术。 阅读详情

很久没有写代码了,最近简单的看了一下disk相关的东西,写了段代码share一下。

先用livekd看一下Disk.sys DriverObject的一些信息:

kd> !drvobj /driver/disk
Driver object (89885a08) is for:
/Driver/Disk
Driver Extension List: (id , addr)
(f763e3be 898858f0)
Device Object list:
8985ec68  8987fc68  8989ac68  89818ab8

然后看下这四个DeviceObject,分区数和硬盘数量不同,Device的数量也不同,我的机器只有三个分区,一块硬盘

kd> !devobj 8985ec68
Device object (8985ec68) is for:
DP(3)0×700a41e00-0xba11e0200+3 /Driver/Disk DriverObject 89885a08
Current Irp 00000000 RefCount 0 Type 00000007 Flags 000020d0
Vpb 89861b38 Dacl e1555b1c DevExt 8985ed20 DevObjExt 8985efd0 Dope 8989bad8
ExtensionFlags (0000000000)
Device queue is not busy.


kd> !devobj 8987fc68
Device object (8987fc68) is for:
DP(2)0×2002f3e00-0×500746200+2 /Driver/Disk DriverObject 89885a08
Current Irp 00000000 RefCount 0 Type 00000007 Flags 000020d0
Vpb 89862d78 Dacl e1555b1c DevExt 8987fd20 DevObjExt 8987ffd0 Dope 899260e8
ExtensionFlags (0000000000)
Device queue is not busy.


kd> !devobj 8989ac68
Device object (8989ac68) is for:
DP(1)0×7e00-0×2002e4200+1 /Driver/Disk DriverObject 89885a08
Current Irp 00000000 RefCount 0 Type 00000007 Flags 000000d0
Vpb 89886b38 Dacl e1555b1c DevExt 8989ad20 DevObjExt 8989afd0 Dope 899021a8
ExtensionFlags (0000000000)
Device queue is not busy.


kd> !devobj 89818ab8
Device object (89818ab8) is for:
DR0 /Driver/Disk DriverObject 89885a08
Current Irp 00000000 RefCount 0 Type 00000007 Flags 00000050
Vpb 89880008 Dacl e1555b1c DevExt 89818b70 DevObjExt 89818fd0 Dope 8985fbc8
ExtensionFlags (0000000000)
AttachedDevice (Upper) 89884a18*** ERROR: Module load completed but symbols could not be loaded for Apsx86.sys
/Driver/Shockprf
AttachedTo (Lower) 8989a9e8 /Driver/ACPI
Device queue is not busy.

ok,可以用下面的代码取出想要的DeviceObject


PDEVICE_OBJECT
GetDiskDeviceObject(
    VOID
)
{
    NTSTATUS        status = STATUS_SUCCESS;
    UNICODE_STRING    usDiskName;
    PDRIVER_OBJECT    pDiskDrvObj = NULL;
    PDEVICE_OBJECT    pDiskDevObj = NULL;
    DWORD            dwLength = 0;
    POBJECT_NAME_INFORMATION poni = NULL;
    poni = poni;

    RtlInitUnicodeString(&usDiskName, L"//Driver//Disk");

    status = ObReferenceObjectByName(
        &usDiskName,
        0x40,
        0,
        0,
        *IoDriverObjectType,
        0,
        NULL,
        &pDiskDrvObj
        );
    if(!NT_SUCCESS(status))
    {
        KdPrint(("[dsv] ObReferenceObjectByName() failed./n"));
        return NULL;
    }

    pDiskDevObj = pDiskDrvObj->DeviceObject;
    if(pDiskDevObj == NULL)
    {
        KdPrint(("[dsv] Disk DeviceObject is NULL./n"));
        ObDereferenceObject(pDiskDrvObj);
        return NULL;
    }

    while(pDiskDevObj != NULL)
    {
        if(pDiskDevObj->DeviceType != FILE_DEVICE_DISK)
        {
            KdPrint(("[dsv] DeviceObject is NOT for Disk./n"));
            pDiskDevObj = pDiskDevObj->NextDevice;
            continue;
        }

        if( !(pDiskDevObj->Flags & DO_DEVICE_HAS_NAME) )
        {
            KdPrint(("[dsv] DeviceObject DO NOT has a name./n"));
            pDiskDevObj = pDiskDevObj->NextDevice;
            continue;
        }

        status = ObQueryNameString(pDiskDevObj, poni, 0, &dwLength);
        if(STATUS_INFO_LENGTH_MISMATCH == status)
        {
            poni = (POBJECT_NAME_INFORMATION) np_malloc(dwLength);
            if(NULL == poni)
            {
                KdPrint(("[dsv] np_malloc() failed./n"));
                ObDereferenceObject(pDiskDrvObj);
                return NULL;
            }

            status = ObQueryNameString(pDiskDevObj, poni, dwLength, &dwLength);
            if(!NT_SUCCESS(status))
            {
                KdPrint(("[dsv] ObQueryNameString with length: %d failed./n", dwLength));
                free(poni);
                ObDereferenceObject(pDiskDrvObj);
                return NULL;
            }
        }
        else if( !NT_SUCCESS(status) )
        {
            KdPrint(("[dsv] ObQueryNameString() failed./n"));
            ObDereferenceObject(pDiskDrvObj);
            return NULL;
        }
        else
        {
            ; // Nothing.
        }

        KdPrint(("[dsv] %S/n", poni->Name.Buffer));

        //
        // TODO: Add code here.
        //

        free(poni);

        if(pDiskDevObj->NextDevice == NULL) break;

        pDiskDevObj = pDiskDevObj->NextDevice;
    }

    ObDereferenceObject(pDiskDrvObj);
    return pDiskDevObj;
}

还有两个例程的声明,如果装了ifs就不需要声明ObQueryNameString()了,写在下面(看我服务多周到^^)

NTSTATUS
ObQueryNameString(
    IN  PVOID Object,
    OUT POBJECT_NAME_INFORMATION ObjectNameInfo,
    IN  ULONG Length,
    OUT PULONG ReturnLength
    );

ObReferenceObjectByName(
    IN PUNICODE_STRING ObjectPath,
    IN ULONG Attributes,
    IN PACCESS_STATE PassedAccessState OPTIONAL,
    IN ACCESS_MASK DesiredAccess OPTIONAL,
    IN POBJECT_TYPE ObjectType,
    IN KPROCESSOR_MODE AccessMode,
    IN OUT PVOID ParseContext OPTIONAL,
    OUT PVOID *ObjectPtr
    );

 
键盘过滤驱动程序源代码 一个键盘记录驱动源代码,完整 慎用 支持USB键盘和PS/2键盘 立即下载

相关推荐

C# 与 TensorFlow.NET:深度神经网络构建与优化的终极指南

是一个由开源社区维护的 C# 库,它将 TensorFlow 框架的强大功能带到了 C# 开发者的手中。TensorFlow 本身是 Google 开发的一个机器学习框架,广泛应用于深度学习、强化学习等领域。通过 TensorFlow.NET,C# 开发者无需切换语言环境,可以直接在 C# 中构建、训练和优化深度神经网络模型。首先,我们需要定义一个神经网络。该网络将包含输入层、隐藏层和输出层。// 输入张量(XOR 输入,2 个特征)// 输出张量(标签,1 个输出)// 定义第一个隐藏层。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1456

利用IoDriverObjectType控制内核驱动加载

在edr或者其他类型的安全软件我们通常要监测当前系统的内核驱动的加载通常使用的方法是PsSetLoadImageNotifyRoutine设置模块加载回调例程来监控ring3模块以及ring0模块的加载,回调函数 eLoadImageNotifyRoutine 的第二个参数判断,如果 PID是0 ,则表示加载驱动,如果PID非零,则表示加载DLL。缺点当然也就是函数太底层,第二就是方法太通用几乎做过进程、线程监控的搞安全内核开发的人基本都晓得,也很容易被发现而且也会被摘链,而失效。...

weixin_60043341的博客 609

信捷 XDH Ethercat 正负极限配置详解与实战技巧

本文详细解析了信捷XDH系列PLC通过EtherCAT总线配置伺服电机正负硬极限的完整流程与实战技巧。内容涵盖硬件开关选型安装、EtherCAT IO信号映射、软件参数设置(包括关键的极性配置)、调试验证方法,以及硬极限与软极限的协同策略。重点阐述了如何避免常见配置错误,确保运动控制系统的最后一道物理安全防线可靠有效,为工程师提供从理论到实践的全面指导。

wdx012345的博客 601

KbdClass键盘过滤驱动以及书中几处错误

《寒江独钓》这本书中的键盘过滤驱动例子中,照着书上的例子抄完,代码有些错误的地方! 书上的例子有3处错误,分别如下: 1)对象类型声明错误 extern POBJECT_TYPE IoDriverObjectType; 修改为以下正确方式 extern POBJECT_TYPE *IoDriverObjectType; 在使用的*IoDriverObjectType地方,也需要修改成正确的方式...

Sven的忘却日记 2049

如何安装PyFluent

PyFluent 是PyAnsys生态系统的一部分, 允许您在所选的 Python 环境中结合使用 Fluent 与其他 PyAnsys 库和外部 Python 库一起使用。PyFluent 实现了客户端-服务器体系结构。它使用谷歌遥控器 过程调用或 gRPC 接口,用于启动或连接正在运行的 Fluent 进程作为服务器。但是,您只需要与 Python 交互接口。可以使用 PyFluent 以编程方式创建、交互和控制 Fluent 会话,用于创建您自己的自定义工作区。

B_etter_Man的博客 2924

【安徽理工大学】一文带你高分拿下计算机考研复试(85+的秘密)

一文带你高分拿下安徽理工大学计算机考研复试(85+的秘密)

猫天意的博客 1523

8.2.1 找到所有的键盘设备

找到所有的键盘设备 先打开驱动对象KbdClass,然后绑定它下面的所有设备

张昆 632

Open3D (C++) KD tree的使用【2025最新版】

Open3D (C++) KD tree的使用,博客长期更新,本文最近更新时间为:2025年1月6日。

点云侠的博客 1566

U 盘文件监控

很简单的一个小玩意 就是监控U盘插上后记录创建 改名字 删除操作。 不过我这个是MINIFILTER架构;并且没有通知用户层 直接在C盘目录下创建文件记录操作的。 后来改了改;用于记录某些EXE安装过程中;出现了哪些SYS文件;方便分析同我的《关于隐藏文件夹附代码》一样否是从MINIFILTER的PASSTHROUGH框架改出的在PASSTHROUGH框架上逐步添加的一些代码 1.监控U

stecdeng的专栏 2456

华为OD机试真题 新系统【进制转换后自定义排序】

华为OD机试 新系统真题【进制转换后自定义排序】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【进制转换后自定义排序】多语言题解。

qq_45776114的博客 594

基于双向GRU LSTM DNN水电站水文数据的每日径流量预测 完整代码+数据 可直接运行

基于双向GRU LSTM DNN水电站水文数据的每日径流量预测 完整代码+数据 可直接运行

1902

异步I/O 设备内核对象,事件内核对象,可提醒I/O 接收I/O通知

CreateFile SetFilePointerEx SetEndOfFile FlushFileBuffers 类似FILE_FLAG_WRITE_THROUGH功能 在异步I/O请求完成之前,一定不能移动或是销毁在发出I/O请求时所使用的数据缓存和OVERLAPPED结构。 BOOL WINAPI CancelIo(   __in  HANDLE hFile ); 取消同给定

零点起步 605

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

内核中获取进程路径学习

<br />NTSTATUS PsGetProcessPathByPid( IN ULONG Pid ,char* FilePath) { NTSTATUS status; char path[256] = {0}; char disk[10] = {0}; STRING ansi_path; STRING ansi_disk; UNICODE_STRING uni_path; UNICODE_STRING un

Rootkit ﹏ 776

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

终极内核驱动开发指南:Windows Kernel Programming Book Samples中的设备对象创建与符号链接技巧

Windows内核驱动开发是系统级编程的核心领域,而设备对象创建与符号链接管理是构建驱动程序的基础。本文将通过分析**Windows Kernel Programming Book Samples**项目中的实战代码,带你掌握设备对象创建的完整流程、符号链接配置技巧以及错误处理最佳实践,让内核驱动开发不再神秘! ## 一、设备对象创建的核心步骤 🚀 设备对象(DEVICE_OBJECT)是内

gitblog_00473的博客 389

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Windows内核开发:NTSTATUS状态码详解与应用

NTSTATUS是Windows内核开发中的核心状态编码系统,采用32位结构化存储方式记录操作结果。作为系统级错误处理机制,其编码结构包含严重性级别、设施代码和状态标识等关键信息段,广泛应用于驱动开发、系统调用和内核调试等场景。通过位域解析技术,开发者可以准确诊断STATUS_ACCESS_DENIED等常见问题,并利用WinDbg等工具进行深度分析。在文件系统过滤驱动等实际项目中,合理的NTSTATUS处理能显著提升系统稳定性,同时与Win32错误代码的转换机制为跨层调试提供便利。掌握NTSTATUS编码

weixin_33713350的博客 343

VPB结构

VPB是Windows I/O Manager子系统的一个重要的数据结构,全称为 Volume Parameter Block。它的任务是绑定卷设备(如磁盘分区或虚拟磁盘)和接管此卷设备的文件系统(如FastFat,NTFS)。Windows系统上的挂载点(Mount Point,如盘符C:)只能定位至卷设备(如\Device\HarddiskVolume1),Windows Object Manager(对象管理器)在解析路径名时(即Name Parsing过程)还要通过卷设备的VPB信息进一步定位至接管

qq_41490873的博客 2198

深入理解Arsenal Image Mounter架构:从Storport驱动到用户态组件

Arsenal Image Mounter是一款功能强大的开源工具,它能够在Microsoft Windows系统中将磁盘镜像内容作为完整磁盘挂载。本文将带你深入探索其底层架构,从核心的Storport驱动到丰富的用户态组件,全面解析这款工具如何实现高效的磁盘镜像挂载功能。 ## 核心驱动层:Storport与SCSI Miniport的协作 Arsenal Image Mounter的核心驱

gitblog_00599的博客 930

设备对象(DEVICE_OBJECT)-----------------设备名称

通常设备对象都把自己的名字放到\Device目录中。在Windows 2000中,设备的名称有两个用途。第一个用途,设备命名后,其它内核模式部件可以通过调用IoGetDeviceObjectPointer函数找到该设备,找到设备对象后,就可以向该设备的驱动程序发送IRP。 另一个用途,允许应用程序打开命名设备的句柄,这样它们就可以向驱动程序发送IRP。应用程序可以使用标准的CreateFile ...

weixin_30922589的博客 644

IO Manager and Device Driver

1, Driver Objects:It describes where a driver is loaded in physical memory,the driver's size,and its main entry points. Device Objects:It resprents a physical or logical device that can be the targe

知了112的专栏 708

Vanguard内核级防作弊系统:深度解析与实战部署指南

Vanguard是Riot Games官方发布的开源内核级防作弊系统,专为《英雄联盟》和《瓦洛兰特》等竞技游戏提供高级安全防护。这款驱动程序通过运行在操作系统内核层面,实现了对游戏进程和系统活动的实时监控,从根本上解决了传统客户端防作弊手段的局限性。本文将深入剖析Vanguard的技术架构、实现原理,并提供完整的实战部署指南。 ## 技术架构深度解析 ### 内核级驱动程序的核心设计 Van

gitblog_00403的博客 454

yuzu 模拟器 7 个 Mainline 版本完整选型指南:如何选版本、配参数、验帧率

yuzu-downloads 归档了 2024-02-27 至 2024-03-04 发布的 7 个 yuzu Switch 模拟器 Mainline Build,每个版本都含 Linux AppImage 与 Windows zip。照做版结论:主流玩家用 `d839edbda`(2024-03-02)配 1080p + FXAA + 2x 渲染;低配机器用 `120358cf6`(2024-0

gitblog_00929的博客 905

reactos操作系统实现(120)

 CreateDiskDeviceObject函数主要就是为了物理设备创建磁盘对象,并且查找磁盘上每个分区和创建相应的对象。具体实现代码如下:#001  NTSTATUS#002  NTAPI#003  CreateDiskDeviceObject(#004      IN PDRIVER_OBJECTDriverObject,#005      IN PUNICODE_S

大坡3D软件开发 1855
上一篇: 内核时差计算器
下一篇: Windows对象 (Object) 的组织
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值