阅读:1449回复:6
请高手把我的分拿走啊~~~FileDisk问题
FileDisk是通过应用层调用DefineDosDevice()来映射盘符和驱动程序的。但是,调用DefineDosDevice()的用户必需要Administrator的权限才能成功。普通用户应该怎么去实现啊??
有兄弟说用设置挂装点的方法,MSDN的例子是这样的: bFlag = GetVolumeNameForVolumeMountPoint( argv[2], // input volume mount point or directory Buf, // output volume name buffer BUFSIZE // size of volume name buffer ); if (bFlag != TRUE) { printf( \"Retrieving volume name for %s failed.\\n\", argv[2] ); return (-2); } printf( \"Volume name of %s is %s\\n\", argv[2], Buf ); bFlag = SetVolumeMountPoint( argv[1], // mount point Buf // volume to be mounted ); 很困惑啊。假如我要用FileDisk虚拟一个G盘,GetVolumeNameForVolumeMountPoint(“G:\\”,Buf,BufSize )这时候返回错误,因为根本没有G盘啊?如果直接调用SetVolumeMountPoint,那第二个参数要求传如VolumeName,这如何获得?由驱动程序创建?把Symbolic Name建成VolumeName的样子就行了么?\\Volume{GUID}?? 但我创建了\\Volume{GUID}这样的Symbolic Name,在WinObj里也看到了,和C:,D:,的VolumeName一样的格式,但我SetVolumeMountPoint的时候还是出错,郁闷 请高手救救兄弟啊~~~ |
|
沙发#
发布于:2005-04-21 09:28
我是不是该用SetupDiXXXXX函数来实现??? :mad:
|
|
驱动老牛
|
板凳#
发布于:2005-04-21 15:33
普通用户应该怎么去实现啊?? 如果仅仅是因为这个问题,可以作个服务啊,要不就把创建符号链接放入倒驱动中创建。 |
|
地板#
发布于:2005-04-21 16:08
如果仅仅是因为这个问题,可以作个服务啊,要不就把创建符号链接放入倒驱动中创建。 符号链接确实是在驱动中做的,但就是不行。我发现这和我创建的设备类型有关,如果是设备类型为FILE_DEVICE_DISK,那么用WinObj看普通用户权限只有读,CreateFile()获得驱动句柄就失败。而如果类型为FILE_DEVICE_UNKOWN则可R/W。那么CreateFile()获得驱动句柄就可以成功。 看了以前的一些贴子,现在不确定SetupDiXXXX这样的函数是否能够实现在普通用户权限下虚拟硬盘。 如果做成服务,驱动程序本身需要改动么?还是只在安装的时候改动,然后应用程序使用OpenSCManager->OpenService->StartService去调用?那么盘符如何定义到系统里呢? |
|
驱动老牛
|
地下室#
发布于:2005-04-22 09:48
[quote]如果仅仅是因为这个问题,可以作个服务啊,要不就把创建符号链接放入倒驱动中创建。 符号链接确实是在驱动中做的,但就是不行。我发现这和我创建的设备类型有关,如果是设备类型为FILE_DEVICE_DISK,那么用WinObj看普通用户权限只有读,CreateFile()获得驱动句柄就失败。而如果类型为FILE_DEVICE_UNKOWN则可R/W。那么CreateFile()获得驱动句柄就可以成功。 看了以前的一些贴子,现在不确定SetupDiXXXX这样的函数是否能够实现在普通用户权限下虚拟硬盘。 如果做成服务,驱动程序本身需要改动么?还是只在安装的时候改动,然后应用程序使用OpenSCManager->OpenService->StartService去调用?那么盘符如何定义到系统里呢? [/quote] 这个用过的 1000%的可以。只不过有点缺陷,就是不能自动在资源管理器里自动出现,所以才没用。 |
|
驱动老牛
|
5楼#
发布于:2005-04-22 09:52
[quote][quote]如果仅仅是因为这个问题,可以作个服务啊,要不就把创建符号链接放入倒驱动中创建。 符号链接确实是在驱动中做的,但就是不行。我发现这和我创建的设备类型有关,如果是设备类型为FILE_DEVICE_DISK,那从米inObj看普通用户权限只有读,CreateFile()获得驱动句柄就失败。而如果类型为FILE_DEVICE_UNKOWN则可R/W。那么CreateFile()获得驱动句柄就可以成功。 看了以前的一些贴子,现在不确定SetupDiXXXX这样的函数是否能够实现在普通用户权限下虚拟硬盘。 如果做成服务,驱动程序本身需要改动么?还是只在安装的时候改动,然后应用程序使用OpenSCManager->OpenService->StartService去调用?那么盘符如何定义到系统里呢? [/quote] 这个用过的 1000%的可以。只不过有点缺陷,就是不能自动在资源管理器里自动出现,所以才没用。 [/quote] NTSTATUS IoCreateSymbolicLink( IN PUNICODE_STRING SymbolicLinkName, IN PUNICODE_STRING DeviceName ); |
|
6楼#
发布于:2005-04-25 20:18
谢谢兄弟参与,偶放分了,不多:)。 我现在已经基本解决这个问题了。但方法要复杂很多。基本上只创建 SymbolicLink是不行的,如果我创建的设备是FILE_DEVICE_DISK类型的话,普通用户是不能通过CreateFile打开SymbolicLink来调用驱动的,好象只有读权限。所以我最先必须创建一个FILE_DEVICE_UNKOWN类型的设备,普通用户才能通过CreateFile打开SymbolicLink来取得驱动的句柄,然后通过IoControl去创建设备..... 当然也采用了服务的方式。 |
|