基于虚拟磁盘技术的应用.docx
- 文档编号:9540480
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:13
- 大小:50.49KB
基于虚拟磁盘技术的应用.docx
《基于虚拟磁盘技术的应用.docx》由会员分享,可在线阅读,更多相关《基于虚拟磁盘技术的应用.docx(13页珍藏版)》请在冰豆网上搜索。
基于虚拟磁盘技术的应用
基于虚拟磁盘技术的应用
——李季季
摘要:
通常情况下是在磁盘上建立文件系统即硬盘分区,文件系统驱动程序(FSD)已经实现了在硬盘上创建和管理文件,本系统主要实现将一个文件虚拟成一个相应的磁盘,在文件系统驱动程序的基础之上,实现基于虚拟设备的文件系统,这种虚拟技术得到了很多应用,例如虚拟光驱就是其中之一,我们将对磁盘进行相关的操作。
关键字:
函数加载模块读写操作卸载模块格式化
1.设计要求
1)、本系统将运行在WindowsXP平台上,分析一个具体的虚拟磁盘文件系统驱动程序。
2)理解文件系统驱动程序(FSD)在系统中的作用和工作机制。
3)分析所给出的虚拟磁盘文件系统设备驱动程序,掌握其结构和运作机制,同时理解其与(FSD)的关系。
4)完善所给虚拟设备文件系统驱动程序,加入虚拟光驱功能的支持。
5)将虚拟设备驱动程序安装到系统中,运行相应的应用程序进行测试分析。
2.设计目的
1)、了解文件系统及文件系统驱动程序的一般原理。
2)、学习开发文件系统驱动程序开发环境,了解其与DDK(DeviceDriversKit,设备驱动程序开发包)的关系。
3)、掌握虚拟磁盘技术,能够编译生成相应的驱动程序并在系统中安装实现。
4)、进一步掌握Windows2000/XP系统中驱动程序的一般结构。
5)、应用虚拟磁盘技术,实现对U盘的简单控制,在U盘上实现对虚拟磁盘的创建、格式化、关闭、连接等功能。
3.设计的描述:
通常情况下是在磁盘上建立文件系统即硬盘分区,文件系统驱动程序(FSD)已经实现了在硬盘上创建和管理文件,本系统主要实现将一个文件虚拟成一个相应的磁盘,在文件系统驱动程序的基础之上,实现基于虚拟设备的文件系统,这种虚拟技术得到了很多应用,例如虚拟光驱就是其中之一。
虚拟磁盘文件系统经过安装可以模拟真实的硬盘,支持各种文件系统功能。
4.基本的数据结构
5、相关函数介绍
1)、主函数入口DriverEntry:
该函数主要实现建立相应个数的磁盘对象和向I/O管理器注册4个分发例程以处理来自应用程序的相应请求。
2)、FileDiskCreateClose:
在这个函数中相应打开文件和关闭文件对象的请求,仅返回成功的标记,对应Create,Close操作。
3)、FileDiskReadWrite:
这个函数完成对虚拟磁盘的读写。
将IO包插入队列,然后调用KeSetEvent函数,激活事件对象,对应Read,Write操作。
4)、FileDiskDeviceControl:
该函数处理发送到虚拟磁盘的控制信息,用户程序调用DeviceIoControl的响应函数。
5)、FileDiskUnload:
用于卸载驱动程序。
通过调用辅助函数FileDiskDeleteDevice卸载本驱动程序创建的各设备对象和对应的设备对象工作线程。
6)、辅助函数:
辅助函数有FileDiskCreateDevice、FileDiskThread、FileDiskDeleteDevice、FileDiskOpenFile和FileDiskCloseFile这些辅助函数被前面的各个函数调用,以完成相应任务,其中最后两个函数在FileDiskThread中进行调用,完成相应的工作。
6、功能分析
此次运用虚拟磁技术需要完成的功能有三大块,即创建、关闭、连接。
1)、在U盘上创建虚拟磁盘
intVDiskTest1:
:
FileDiskMount(
intDeviceNumber,//设备号
POPEN_FILE_INFORMATIONOpenFileInformation,//存储模拟文件信息
BOOLEANCdImage//是否将磁盘设备对象类型设置为光驱
)
{
charVolumeName[]="\\\\.\\:
";
charDriveName[]=":
\\";
charDeviceName[255];//用来临时存储文件名字
HANDLEDevice;//用来保存返回的文件句柄
DWORDBytesReturned;//缓冲区
VolumeName[4]=OpenFileInformation->DriveLetter;//卷的名字
DriveName[0]=OpenFileInformation->DriveLetter;
Device=CreateFile(
VolumeName,
GENERIC_READ|GENERIC_WRITE,//文件访问权限
FILE_SHARE_READ|FILE_SHARE_WRITE,//文件分享权限
NULL,//返回文件指针是否可以被继承
OPEN_EXISTING,//文件不存在就返回错误
FILE_FLAG_NO_BUFFERING,//不是用系统的缓存空间
NULL
);
if(Device!
=INVALID_HANDLE_VALUE)//创建文件不成功是处理
{
CloseHandle(Device);
SetLastError(ERROR_BUSY);//设置文件系统忙的信息
VDiskTest1:
:
PrintLastError(&VolumeName[4]);
return-1;//返回错误
}
if(CdImage)//如果是要创建cdrom的虚拟文件格式
{
sprintf(DeviceName,DEVICE_NAME_PREFIX"Cd""%u",DeviceNumber);
}
else
{
sprintf(DeviceName,DEVICE_NAME_PREFIX"%u",DeviceNumber);
}
if(!
DefineDosDevice(
DDD_RAW_TARGET_PATH,//传入的(绝对)路径
&VolumeName[4],//卷标的名字如:
C:
D:
等
DeviceName//设备的名字
))
{
VDiskTest1:
:
PrintLastError(&VolumeName[4]);
return-1;
}
Device=CreateFile(
VolumeName,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_NO_BUFFERING,
NULL
);
//如果Device返回一个有效的句柄,这说明上次创建的没有成功,这返回错误信息,并将建立的符号链接断开
if(Device==INVALID_HANDLE_VALUE)
{
VDiskTest1:
:
PrintLastError(&VolumeName[4]);
DefineDosDevice(DDD_REMOVE_DEFINITION,&VolumeName[4],NULL);
return-1;
}
//IO设备操作——打开文件
if(!
DeviceIoControl(
Device,
IOCTL_FILE_DISK_OPEN_FILE,
OpenFileInformation,
sizeof(OPEN_FILE_INFORMATION)+OpenFileInformation->FileNameLength-1,
NULL,
0,
&BytesReturned,
NULL
))
{
//打开不成功则显示错误信息,并将建立的符号链接断开
VDiskTest1:
:
PrintLastError("FileDisk:
");
DefineDosDevice(DDD_REMOVE_DEFINITION,&VolumeName[4],NULL);
CloseHandle(Device);
return-1;
}
CloseHandle(Device);
SHChangeNotify(SHCNE_DRIVEADD,SHCNF_PATH,DriveName,NULL);
return0;
}
2)、在正常情况下关闭虚拟磁盘
intVDiskTest1:
:
FileDiskUmount(charDriveLetter)
{
charVolumeName[]="\\\\.\\:
";
charDriveName[]=":
\\";
HANDLEDevice;
DWORDBytesReturned;
VolumeName[4]=DriveLetter;
DriveName[0]=DriveLetter;
Device=CreateFile(//测试所指的虚拟磁盘是否存在
VolumeName,
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_FLAG_NO_BUFFERING,
NULL
);
//测试的结果又两种:
//1、返回一个有效的文件句柄,说明要卸载的虚拟磁盘存在
//2、返回一个无效的文件句柄,说明要卸载的文件系统根本不存在
//强行卸载会出现错误,此时要抛出错误信息
if(Device==INVALID_HANDLE_VALUE)
{
PrintLastError(&VolumeName[4]);
return-1;
}
//IO设备操作——锁定此文件
if(!
DeviceIoControl(
Device,
FSCTL_LOCK_VOLUME,//文件系统命令——关闭文件
NULL,
0,
NULL,
0,
&BytesReturned,
NULL
))
{
PrintLastError(&VolumeName[4]);//不成功就打印错误后返回
CloseHandle(Device);
return-1;
}
//IO设备操作——关闭文件
if(!
DeviceIoControl(
Device,
IOCTL_FILE_DISK_CLOSE_FILE,//IO的控制信息,关闭磁盘文件
NULL,
0,
NULL,
0,
&BytesReturned,
NULL
))
{
PrintLastError("FileDisk:
");//不成功就打印错误后返回
CloseHandle(Device);
return-1;
}
//IO设备操作——卸载文件
if(!
DeviceIoControl(
Device,
FSCTL_DISMOUNT_VOLUME,
NULL,
0,
NULL,
0,
&BytesReturned,//输出缓冲区的大小
NULL
))
{
PrintLastError(&VolumeName[4]);//不成功就打印错误后返回
CloseHandle(Device);
return-1;
}
//IO设备操作——解锁
if(!
DeviceIoControl(
Device,
FSCTL_UNLOCK_VOLUME,//将卷解锁,用于输入控制信息
NULL,
0,
NULL,
0,
&BytesReturned,//输出缓冲区的大小
NULL//不设置FILE_FLAG_OVERLAPPED()选项,此项无效
))
{
PrintLastError(&VolumeName[4]);//不成功就打印错误后返回
CloseHandle(Device);
return-1;
}
//释放文件(卷标)的句柄
CloseHandle(Device);
//如果成功,则在我的电脑中相应的虚拟磁盘的图像消失
//如果不成功,则抛出错误信息
if(!
DefineDosDevice(
DDD_REMOVE_DEFINITION,
&VolumeName[4],
NULL
))
{
PrintLastError(&VolumeName[4]);
return-1;
}
SHChangeNotify(SHCNE_DRIVEREMOVED,SHCNF_PATH,DriveName,NULL);
return0;
}
3)、虚拟磁盘的连接
voidVDiskTest1:
:
OnConnFile(BOOLEANCdImage)
{
CStringConFileName;
ConFileName.Empty();
charDriveLetter;
intDeviceNumber=0;
POPEN_FILE_INFORMATIONOpenFileInformation;
UpdateData(true);
DeviceNumber=m_No;
DriveLetter=m_Vol[0];
if(m_Vol=="\0")
{
MessageBox("卷标没有设置,请输入一个字符!
","提示:
",MB_OKCANCEL);
return;
}
CFileDialogtemdlg(
TRUE,
_T("*.bmp"),
"",
OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY,
"AllFiles(*.*)|*.*|vitualdDisk(*.tt)|*.tt||",
NULL
);
UCHARtitle[]={"打开虚拟文件"};
temdlg.m_ofn.lpstrTitle=(char*)title;
if(temdlg.DoModal()==IDOK)
{
ConFileName=temdlg.GetPathName();
m_fileName=ConFileName;
UpdateData(false);
UpdateData(true);
OpenFileInformation=
(POPEN_FILE_INFORMATION)malloc(sizeof(OPEN_FILE_INFORMATION)+strlen(ConFileName)+7);
memset(
OpenFileInformation,
0,
sizeof(OPEN_FILE_INFORMATION)+strlen(ConFileName)+7
);
strcpy((char*)OpenFileInformation->FileName,"\\?
?
\\");
strcat((char*)OpenFileInformation->FileName,ConFileName);
OpenFileInformation->FileNameLength=
(USHORT)(strlen)((char*)(OpenFileInformation->FileName));
OpenFileInformation->FileSize.QuadPart=
_atoi64(m_vDiskSize)*1024*1024;
OpenFileInformation->DriveLetter=m_Vol.GetAt(0);
inttest=FileDiskMount(DeviceNumber,OpenFileInformation,CdImage);
UpdateData(false);
}
}
7.需求分析:
随着信息技术的发展,电子文件的传输在人们的日常生活应用越来越广泛,用户对文件的保密意识越来越强,为了用户自身的信息安全和对私人移动设备中的文件进行保密,我们可以在移动设备中开辟一个虚拟的空间,将某些需要保密的文件存放在其中,该虚拟空间中的文件只能由该移动设备所有人通过权限认证来打开并使用,在没有通过权限认证的情况下则无法访问该虚拟空间中的文件。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 虚拟 磁盘 技术 应用