要创建一个虚拟驱动器,需要使用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) |