Chinaunix首页 | 论坛 | 博客
  • 博客访问: 165903
  • 博文数量: 36
  • 博客积分: 2160
  • 博客等级: 大尉
  • 技术积分: 382
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-27 01:48
个人简介

喝喝咖啡,做做开发

文章分类
文章存档

2014年(4)

2013年(1)

2012年(4)

2011年(2)

2010年(3)

2009年(9)

2008年(3)

2007年(10)

我的朋友

分类: WINDOWS

2011-08-24 10:53:16

要创建一个虚拟驱动器,需要使用API函数DefineDosDevice,该函数可以将指定目录与指定的驱动器进行关联,作为一个驱动器显示。
该API函数的C#定义:
[DllImport("kernel32.dll")]
static extern bool DefineDosDevice(uint dwFlags, string lpDeviceName, string lpTargetPath);
在windows内部,这被定义为设备名称和符号连接,设备名称分为NT的内部设备名称和MSDOS设备名称,
NT设备名称,如:\Device\CDRom0和\Device\Serial0之类的格式
MSDOS设备名称,是为方便访问NT设备名称之用,被称为到NT设备名称的符号连接。每个MSDOS设备名称最多可以指向一个内部NT设备,
但是,多个MSDOS设备名称可以指向单个设备。

可以使用API函数QueryDosDevice查询MSDOS设备名称与之相关联的NT设备名称。
[DllImport("kernel32.dll", SetLastError = true)]
static extern uint QueryDosDevice(string lpDeviceName, StringBuilder lpTargetPath,uint ucchMax);
比如在本机可以获取到D:的NT设备名称为:\Device\HarddiskVolume2
WIN32程序不能使用内部的NT设备名称来访问设备,因为系统API要求使用熟悉的MSDOS设备名称。

在创建虚拟驱动器调用DefineDosDevice函数时,需要使用的dwFlags参数定义如下:
internal const uint DDD_RAW_TARGET_PATH = 0x00000001;
internal const uint DDD_REMOVE_DEFINITION = 0x00000002;
internal const uint DDD_EXACT_MATCH_ON_REMOVE = 0x00000004;
internal const uint DDD_NO_BROADCAST_SYSTEM = 0x00000008; 

在创建虚拟驱动器时,使用参数DDD_RAW_TARGET_PATH。在删除虚拟驱动器时,使用参数组合:
DDD_RAW_TARGET_PATH|DDD_REMOVE_DEFINITION|DDD_EXACT_MATCH_ON_REMOVE
当使用DDD_RAW_TARGET_PATH参数时创建驱动器时,NT设备名称必须为:\Device\HarddiskVolume2格式,或在其后加目录
如果在创建时使用参数0,则可以直接使用MSDOS设备名称,作为连接参数。并且在删除时,只能使用DDD_REMOVE_DEFINITION|DDD_EXACT_MATCH_ON_REMOVE组合。

当使用非字母作为MSDOS设备名称时,在浏览器中不可见,但是在命令窗口中,可以进入。

在DOS命令里面,有一条命令,也可以实现NT设备名称与MSDOS设备名称之间的关联,或者删除,命令:subst
创建一个虚拟驱动器 subst a: d:\temp
删除创建的驱动器   subst a: /d
阅读(1935) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~