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

时间: 2024-12-03 21:30:02

VcdRom 虚拟光驱驱动代码分析的相关文章

USB转串口驱动代码分析

1.USB插入时,创建设备 [plain] view plaincopy DriverObject->DriverExtension->AddDevice = USB2COM_PnPAddDevice;   步一.调用USB2COM_CreateDeviceObject创建功能设备对象(FDO) (1) IoCreateDevice系统API的原理为: [plain] view plaincopy NTKERNELAPI   NTSTATUS   IoCreateDevice(       I

Linux内核分析(四)----进程管理|网络子系统|虚拟文件系统|驱动简介

原文:Linux内核分析(四)----进程管理|网络子系统|虚拟文件系统|驱动简介 Linux内核分析(四) 两天没有更新了,上次博文我们分析了linux的内存管理子系统,本来我不想对接下来的进程管理子系统.网络子系统.虚拟文件系统在这个阶段进行分析的,但是为了让大家对内核有个整体的把握,今天还是简单的介绍一下剩余的几个子系统,我们对这几个子系统的分析,只要了解其作用和部分内容即可,不必深究,等我们写上几个驱动,到时候按照驱动再来分析这几个子系统我们就清晰多了. 在http://www.cnbl

微软的Windows虚拟光驱

昨天升级操作系统出现的蓝屏,根据我的分析,最大的可能性是因为我曾经安装过Daemon Tools这个虚拟光驱软件,而卸载Daemon Tools时候,Daemon Tools却不卸载自身的驱动,最终复制完文件重新启动,无法正常加载SPTD.SYS导致Windows蓝屏. 这种Windows升级过程中的蓝屏是可怕的,因为无法进入安全模式安装Windows,又无法恢复原有的操作系统,只能重新安装一个新的系统,因此,正确的升级方法是,在升级Windows之前先彻底删除Daemon Tools的所有驱动

WinCE虚拟串口驱动(一)

 //========================================================================  //TITLE:  //    WinCE虚拟串口驱动(一)  //AUTHOR:  //    norains  //DATE:  //    Saturday 28-March-2009  //Environment:  //    WINDOWS CE 5.0  //====================================

XP系统纯净版安装过虚拟光驱后光驱不读盘怎么解决

  XP系统纯净版安装过虚拟光驱后光驱不读盘怎么解决 1.在控制面板中找到你安装的虚拟光驱软件,然后完全卸载; 2.如果卸载虚拟光驱后还是不能读取光盘的话,那么我们打开"设备管理器"(我的电脑右键--属性--点击设备管理器); 3.点击菜单中的"查看",并勾选"显示隐藏的设备"; 4.展开"非即插即用驱动程序",然后在其中查找和你安装的虚拟光驱有光的驱动,并删除; 5.删除后重启XP系统即可.

win 7系统的重装教程 使用虚拟光驱简单安装方法

具体操作步骤: 一.将从网上下载的win7旗舰版ISO系统文件存放到D盘.(最新Windows7系统下载地址:http://www.xitonghome.com/soft/html/list1-1.html) 二.从网上下载虚拟光驱,打开安装后在任务栏右通知区显示"虚拟DAEMON管理器"图标,在我的电脑窗口显示虚拟光驱盘符. 三.右击任务栏右通知区"虚拟DAEMON管理器" 图标-虚拟CD-DVD-ROM-驱动器具0-安装映像文件,打开"选出择新的映像文

Windows7如何安装使用Daemon Tools虚拟光驱

  Daemon Tools是我们最为熟悉的虚拟光驱软件,很多时候不管是工作或者生活都会用上它,因此他对我们日常生活很重要.然而,令人遗憾的是Windows 7竟然无法顺利安装这个软件.难道,我们就只能退而求其次吗?到底有什么方法可以安装使用这个虚拟光驱软件呢. 让我们来研究下为何无法安装Daemon Tools吧,相信排除了Daemon Tools无法在Windows 7安家的障碍后,Windows 7照样可以使用这个软件. 我们平时使用Daemon Tools是免费版本,最新版本为4.30.

【ARM】Uboot代码分析

一.摘要 这篇文章主要对BootLoader(UBoot)的源码进行了分析,并对UBoot的移植略作提及.  BootLoader的总目标是正确调用内核的执行,由于大部分的BoorLoader都依赖于CPU的体系结构.因此大部分的BootLoader都分为两个步骤启动.依赖于CPU体系结构(如设备初始化等)的代码都放在stage1.而stage2一般使用C语言实现,能够实现更加复杂的功能,代码的可移植性也提高. 二.本文提纲 1. 摘要 2. 本文提纲 3. UBoot启动过程 4. Stage

Device Tree(三):代码分析【转】

转自:http://www.wowotech.net/linux_kenrel/dt-code-analysis.html Device Tree(三):代码分析 作者:linuxer 发布于:2014-6-6 16:03 分类:统一设备模型 一.前言 Device Tree总共有三篇,分别是: 1.为何要引入Device Tree,这个机制是用来解决什么问题的?(请参考引入Device Tree的原因) 2.Device Tree的基础概念(请参考DT基础概念) 3.ARM linux中和De