开发者社区> andyro1984> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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等函数,这些代码,等以后有时间再做介绍。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
新编码神器Atom使用纪要
Atom是 Github 专门为程序员推出的一个跨平台文本编辑器。她很大程度上继承了SublimeText的美,而又不仅如此。有费了蛮大力气总结了一篇关于SublimeText文章: 如何优雅地使用Sublime Text,这其中可以感受个人对于Sublime的钟爱。
1247 0
+关注
andyro1984
本团队有11年以上的解决方案端到端开发经验,涉及的行业有云计算、应用软件(包括WEB)、嵌入式、分布式、大型服务程序(Windows/Linux)、操作系统等。
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载