qiaoroger
驱动牛犊
驱动牛犊
  • 注册日期2005-02-03
  • 最后登录2010-03-22
  • 粉丝0
  • 关注0
  • 积分111分
  • 威望92点
  • 贡献值1点
  • 好评度7点
  • 原创分0分
  • 专家分0分
阅读:1449回复:6

请高手把我的分拿走啊~~~FileDisk问题

楼主#
更多 发布于:2005-04-19 14:38
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的时候还是出错,郁闷

请高手救救兄弟啊~~~
qiaoroger
驱动牛犊
驱动牛犊
  • 注册日期2005-02-03
  • 最后登录2010-03-22
  • 粉丝0
  • 关注0
  • 积分111分
  • 威望92点
  • 贡献值1点
  • 好评度7点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-04-21 09:28
我是不是该用SetupDiXXXXX函数来实现??? :mad:
zhangshengyu
驱动老牛
驱动老牛
  • 注册日期2003-10-03
  • 最后登录2016-07-26
  • 粉丝0
  • 关注0
  • 积分792分
  • 威望696点
  • 贡献值41点
  • 好评度499点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2005-04-21 15:33
普通用户应该怎么去实现啊??

如果仅仅是因为这个问题,可以作个服务啊,要不就把创建符号链接放入倒驱动中创建。

---内核开发合作或提供基础技术服务QQ:22863668 ---
qiaoroger
驱动牛犊
驱动牛犊
  • 注册日期2005-02-03
  • 最后登录2010-03-22
  • 粉丝0
  • 关注0
  • 积分111分
  • 威望92点
  • 贡献值1点
  • 好评度7点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-04-21 16:08
如果仅仅是因为这个问题,可以作个服务啊,要不就把创建符号链接放入倒驱动中创建。

 

符号链接确实是在驱动中做的,但就是不行。我发现这和我创建的设备类型有关,如果是设备类型为FILE_DEVICE_DISK,那么用WinObj看普通用户权限只有读,CreateFile()获得驱动句柄就失败。而如果类型为FILE_DEVICE_UNKOWN则可R/W。那么CreateFile()获得驱动句柄就可以成功。

看了以前的一些贴子,现在不确定SetupDiXXXX这样的函数是否能够实现在普通用户权限下虚拟硬盘。

如果做成服务,驱动程序本身需要改动么?还是只在安装的时候改动,然后应用程序使用OpenSCManager->OpenService->StartService去调用?那么盘符如何定义到系统里呢?
zhangshengyu
驱动老牛
驱动老牛
  • 注册日期2003-10-03
  • 最后登录2016-07-26
  • 粉丝0
  • 关注0
  • 积分792分
  • 威望696点
  • 贡献值41点
  • 好评度499点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2005-04-22 09:48
[quote]如果仅仅是因为这个问题,可以作个服务啊,要不就把创建符号链接放入倒驱动中创建。

 

符号链接确实是在驱动中做的,但就是不行。我发现这和我创建的设备类型有关,如果是设备类型为FILE_DEVICE_DISK,那么用WinObj看普通用户权限只有读,CreateFile()获得驱动句柄就失败。而如果类型为FILE_DEVICE_UNKOWN则可R/W。那么CreateFile()获得驱动句柄就可以成功。

看了以前的一些贴子,现在不确定SetupDiXXXX这样的函数是否能够实现在普通用户权限下虚拟硬盘。

如果做成服务,驱动程序本身需要改动么?还是只在安装的时候改动,然后应用程序使用OpenSCManager->OpenService->StartService去调用?那么盘符如何定义到系统里呢? [/quote]

这个用过的 1000%的可以。只不过有点缺陷,就是不能自动在资源管理器里自动出现,所以才没用。
---内核开发合作或提供基础技术服务QQ:22863668 ---
zhangshengyu
驱动老牛
驱动老牛
  • 注册日期2003-10-03
  • 最后登录2016-07-26
  • 粉丝0
  • 关注0
  • 积分792分
  • 威望696点
  • 贡献值41点
  • 好评度499点
  • 原创分0分
  • 专家分0分
  • 社区居民
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
    );
---内核开发合作或提供基础技术服务QQ:22863668 ---
qiaoroger
驱动牛犊
驱动牛犊
  • 注册日期2005-02-03
  • 最后登录2010-03-22
  • 粉丝0
  • 关注0
  • 积分111分
  • 威望92点
  • 贡献值1点
  • 好评度7点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-04-25 20:18

NTSTATUS
  IoCreateSymbolicLink(
    IN PUNICODE_STRING  SymbolicLinkName,
    IN PUNICODE_STRING  DeviceName
    );


谢谢兄弟参与,偶放分了,不多:)。

我现在已经基本解决这个问题了。但方法要复杂很多。基本上只创建
SymbolicLink是不行的,如果我创建的设备是FILE_DEVICE_DISK类型的话,普通用户是不能通过CreateFile打开SymbolicLink来调用驱动的,好象只有读权限。所以我最先必须创建一个FILE_DEVICE_UNKOWN类型的设备,普通用户才能通过CreateFile打开SymbolicLink来取得驱动的句柄,然后通过IoControl去创建设备.....
当然也采用了服务的方式。
游客

返回顶部