VcdRom 虚拟光驱驱动代码分析

简介:        VcdRom 是网上一个爱好者模拟微软虚拟驱动编写一个虚拟光驱程序,近日在研究虚拟磁盘驱动时,无意中看到了VcdRom的虚拟光驱的代码,不禁就开始研究了起来,希望以后能有用武之地。

       VcdRom 是网上一个爱好者模拟微软虚拟驱动编写一个虚拟光驱程序,近日在研究虚拟磁盘驱动时,无意中看到了VcdRom的虚拟光驱的代码,不禁就开始研究了起来,希望以后能有用武之地。

     

     VcdRom驱动的入口点函数

   在Windows 驱动中,不管是wdm还是WDF驱动开发模型,驱动的入口点函数一定是DriverEntry该函数的原型如下;

NTSTATUS DriverEntry ( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath )

    由于VcdRom驱动是传统的NT驱动程序,这个函数的主要目的是为了建立驱动对象和分发函数例程,例如IRP_MJ_CREATE等IRP,同时也负责建立驱动名称映射和连接,如下代码所示;

DriverObject->MajorFunction[IRP_MJ_CREATE] = VCDRomCreateClose; DriverObject->MajorFunction[IRP_MJ_CLOSE] = VCDRomCreateClose; DriverObject->MajorFunction[IRP_MJ_CLEANUP] = VCDRomCreateClose; DriverObject->MajorFunction[IRP_MJ_READ] = VCDRomRead; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = VCDRomDeviceControl; DriverObject->DriverUnload = VCDRomUnload; RtlInitUnicodeString(&device_name, DEVICE_DIR_NAME); status = IoCreateDevice( DriverObject, sizeof(DEVICE_EXTENSION), &device_name, FILE_DEVICE_CD_ROM, //0x02 FILE_REMOVABLE_MEDIA | FILE_READ_ONLY_DEVICE, //0x03 FALSE, &device_object ); ...... status = IoCreateSymbolicLink( &device_extension->SymbolicLinkName, &device_name);

 

     在这个函数当中还有另外一个函数起到了很关键的作用,这个函数就是VCDRomQueryDevice,查询已经存在光驱,当发现A~Z中有一个字符没有被占用则依据这个字符创建一个虚拟光驱,代码如下;

for(Index = 'A'; Index <= 'Z'; Index++) { RtlZeroMemory(QueryTable, sizeof(QueryTable)); RtlZeroMemory(wszQueryName, sizeof(wszQueryName)) QueryTableName.Buffer = wszQueryName; QueryTableName.Length = 0; QueryTableName.MaximumLength = sizeof(wszQueryName); //0xC8 RtlAppendUnicodeToString(&QueryTableName, L"Parameters//Device"); wszDriveName[0] = Index; wszDriveName[1] = L'/0'; RtlAppendUnicodeToString(&QueryTableName, wszDriveName); FileName.Buffer = wszFileName; FileName.Length = 0; FileName.MaximumLength = sizeof(wszFileName); //0xC8 QueryTable[0].Name = QueryTableName.Buffer; QueryTable[0].Flags = RTL_QUERY_REGISTRY_SUBKEY; //0x01 QueryTable[1].Name = L"IMAGE"; QueryTable[1].EntryContext = (PVOID)&FileName; QueryTable[1].Flags = RTL_QUERY_REGISTRY_DIRECT; //0x01 status = RtlQueryRegistryValues( RTL_REGISTRY_ABSOLUTE, //0x00 RegistryPath, &QueryTable[0], NULL, NULL); if (NT_SUCCESS(status)) { VCDRomCreate(DriverObject, Index, FileName.Buffer); }

 

     在这个函数中,其中VCDRomCreate又扮演着重要的最重要的角色,创建VCDRom虚拟光驱,第一步穿件虚拟光驱设备,第二步穿件文件操作对象即文件(HANDLE),如下代码;

 

ULONG VCDRomCreate( IN PDRIVER_OBJECT DriverObject, IN ULONG Index, IN PWSTR NameBuffer ) { PDEVICE_OBJECT DeviceObject; UNICODE_STRING FileName; RtlInitUnicodeString(&FileName, NameBuffer); DeviceObject = NULL; VCDRomCreateDevice(DriverObject, Index, &NameBuffer[1], &DeviceObject); VCDRomCreateFile(DeviceObject, &FileName); return 1; }

      完成上一步之后,入口函数的操作基本完成,接下来就是读写操作了。

      接下来就是处理VCDRomRead、VCDRomUnload等函数,这些代码,等以后有时间再做介绍。

目录
相关文章
|
3月前
|
前端开发 NoSQL 关系型数据库
如何开发研发项目管理中的需求管理板块?(附架构图+流程图+代码参考)
本文探讨了中小企业在研发或产品工作中常见的需求管理问题,如需求记录混乱、交付靠口头约定、变更无追踪等。通过系统化的需求管理,可实现“谁在做什么、为什么做、何时完成、谁验收”的可视化与责任归属,减少沟通成本,提升效率。文章详细介绍了需求管理的核心功能模块(如需求看板、处理流程、研发日报)、系统架构设计、前后端实现参考、开发技巧与落地建议,以及上线后的运营指标与实施路线图。最终目标是将松散的流程规范化、可追踪、可复用,助力企业构建高效的研发项目管理体系。
|
10月前
|
数据可视化 算法 数据挖掘
用傅里叶变换解码时间序列:从频域视角解析季节性模式
本文介绍了如何使用傅里叶变换和周期图分析来识别时间序列中的季节性模式,特别是在能源消耗数据中。通过Python实现傅里叶变换和周期图,可以有效提取并量化时间序列中的主要和次要频率成分,克服传统可视化分析的局限性。这对于准确捕捉时间序列中的季节性变化具有重要意义。文章以AEP能源消耗数据为例,展示了如何应用这些方法识别日、周、半年等周期模式。
444 3
用傅里叶变换解码时间序列:从频域视角解析季节性模式
|
存储 自然语言处理 安全
C++ STL标准库 《string原理与实战分析》
C++ STL标准库 《string原理与实战分析》
345 0
|
11月前
|
存储 消息中间件 小程序
转转平台IM系统架构设计与实践(一):整体架构设计
本文描述了转转IM为整个平台提供的支撑能力,给出了系统的整体架构设计,分析了系统架构的特性。
315 10
|
算法 Linux 调度
Docker的资源限制实战篇
本文详细介绍了如何利用Docker对容器的资源进行限制,包括内存和CPU的使用。文章首先概述了资源限制的重要性及其在Linux系统中的实现原理,并强调了不当设置可能导致的风险。接着,通过一系列实战案例展示了如何具体设置容器的内存限制,包括硬性限制、动态调整以及软限制等。最后,文章还提供了限制容器CPU访问的具体方法和示例,如指定容器使用的CPU核心数和基于`--cpu-shares`参数对CPU资源进行分配。通过这些实践,读者可以更好地理解和掌握Docker资源管理技巧。
894 14
Docker的资源限制实战篇
|
API Windows
[原创]MASM32新手指南
[原创]MASM32新手指南
|
存储 SQL 搜索推荐
业务系统架构实践总结
作者从2015年起至2022年,在业务平台(结算、订购、资金)、集团财务平台(应收应付、账务核算、财资、财务分析、预算)、本地生活财务平台(发票、结算、预算、核算、稽核)所经历的业务系统研发实践的一个总结。
|
存储 容器 数据格式
DuiLib消息处理剖析
本来想自己写写duilib的消息机制来帮助duilib的新手朋友,不过今天发现已经有人写过了,而且写得很不错,把duilib的主干消息机制都说明了,我就直接转载过来了,原地址:http://blog.
1862 0
|
数据可视化 Python
八种方法求π的近似值
八种方法求π的近似值
1891 0
八种方法求π的近似值
|
机器学习/深度学习 自然语言处理 算法
基于Bi-LSTM与CRF实现中文命名实体识别任务
基于Bi-LSTM与CRF实现中文命名实体识别任务
962 0
基于Bi-LSTM与CRF实现中文命名实体识别任务

热门文章

最新文章