lilylily
驱动牛犊
驱动牛犊
  • 注册日期2002-07-11
  • 最后登录2004-03-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1631回复:6

如何打开ms_filter设备获得句柄?

楼主#
更多 发布于:2002-07-29 11:05
在正确安装了设备驱动后,系统的设备管理里出现了与网卡对应的Miniport驱动过滤虚拟设备ms_filter,在程序中用下面方法打开:
szMACFileName=\"\\\\\\\\.\\\\ms_sfilter\";
hDevice = CreateFile(
                szMACFileName,
                GENERIC_READ,
                FILE_SHARE_READ | FILE_SHARE_WRITE,//
                NULL,
                OPEN_EXISTING,//ALWAYS,//
                0,
                INVALID_HANDLE_VALUE
                );

if(hDevice == INVALID_HANDLE_VALUE)
{
AfxMessageBox(\"The MAC handle is invalid.\\n\");
DWORD err=GetLastError();
CString str;
str.Format(\"%d\",err);
AfxMessageBox(str);
hDevice = NULL;
}
else
AfxMessageBox(\"The MAC handle is OK.\\n\");

在administrator身份下这样打开是对的,返回正确;但在普通用户登陆时打开却不正确, CreateFile()返回INVALID_HANDLE_VALUE,显示打开miniport设备无效。调试时GetLastError()返回的数据值为0。

分析原因是不是设备文件名在普通用户下不能写成\"\\\\\\\\.\\\\ms_sfilter\"?
那么ms_filter该如何打开呢并获得句柄呢?

SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-07-29 13:17
你分析的原因不成立。
你确认在Administrator登录情况下可以打开?
你的设备是怎么创建的?
写驱动不如买足彩!!
lilylily
驱动牛犊
驱动牛犊
  • 注册日期2002-07-11
  • 最后登录2004-03-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-07-29 15:18
是的,调试了无数次,在administator下可以打开设备文件获得句柄。又调试了一下,问题确实出现在普通用户下CreateFile()函数上,我试了打开别的设备文件,出现的情况是打开软磁盘\"\\\\\\\\.\\\\A:\"成功,但是打开硬盘分区\"\\\\\\\\.\\\\C:\"却不成功。不知道是什么原因?
但可以证明问题和原来的设备ms_filter应该没有关系,是普通用户下如何获得权限打开设备的原因。

下面是一个最简单的测试程序:
main()
{
HANDLE file;
file=CreateFile(
\"\\\\\\\\.\\\\C:\",
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS, 0,
INVALID_HANDLE_VALUE
);
if(file==INVALID_HANDLE_VALUE)
printf(\"Open C: is Error!\\n\");
else
printf(\"Open C: is Ok!\\n\");

file=CreateFile(
\"\\\\\\\\.\\\\A:\",
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_ALWAYS, 0,
INVALID_HANDLE_VALUE
);
if(file==INVALID_HANDLE_VALUE)
printf(\"Open A: is Error!\\n\");
else
printf(\"Open A: is Ok!\\n\");
}

SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-07-29 15:57
我倒是没做过类似的测试,但总觉得不应该有问题。

Passthru本身是没有设备的,如果你创建的设备支持读写的话,应该可以打开。改天有空我也试试。

我记得前几天看到谁的一个帖子也是说Passthru guest登录情况,好像是说binding不成功还是怎么来着,记不清了,但我当时试了试肯定是没有问题的。

至于你说的打不开C盘,应该是你的C盘不允许guest访问吧。

如果果真是权限问题的话,你可以试着改改应用程序的权限。
方法如下:

HANDLE hToken;
TOKEN_PRIVILEGES tkp;
 
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return false;
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1;  
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);

对应于上面代码中的SE_DEBUG_NAME,winnt中定义了很多SE_XXX_NAME,可以选来试试,不知对你有无帮助。

[编辑 -  7/29/02 by  TonyHuyan]
写驱动不如买足彩!!
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-07-29 16:04
刚刚看到你代码中的一点错误,CreateFile打开设备的时候参数怎么能用Open_Always呢?或许用了也不见得就不行,这个我没试过,但Msdn中明确提到 The dwCreationDisposition parameter must have the OPEN_EXISTING value.
写驱动不如买足彩!!
HuYuguang
论坛版主
论坛版主
  • 注册日期2001-04-25
  • 最后登录2013-04-29
  • 粉丝3
  • 关注1
  • 积分92分
  • 威望11点
  • 贡献值0点
  • 好评度9点
  • 原创分1分
  • 专家分0分
5楼#
发布于:2002-07-29 16:44
passthru本身倒是的确不创建设备,但是只要passthru
绑定了网卡,那么就会创建设备,你就可以通过读注册表
得到所创建的设备。

我倒是没做过类似的测试,但总觉得不应该有问题。

Passthru本身是没有设备的,如果你创建的设备支持读写的话,应该可以打开。改天有空我也试试。

我记得前几天看到谁的一个帖子也是说Passthru guest登录情况,好像是说binding不成功还是怎么来着,记不清了,但我当时试了试肯定是没有问题的。

至于你说的打不开C盘,应该是你的C盘不允许guest访问吧。

如果果真是权限问题的话,你可以试着改改应用程序的权限。
方法如下:

HANDLE hToken;
TOKEN_PRIVILEGES tkp;
 
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return false;
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid);
tkp.PrivilegeCount = 1;  
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0);

对应于上面代码中的SE_DEBUG_NAME,winnt中定义了很多SE_XXX_NAME,可以选来试试,不知对你有无帮助。

[编辑 -  7/29/02 by  TonyHuyan]
不再回忆从前,我已经生活在幸福当中。
SharpShooter
驱动小牛
驱动小牛
  • 注册日期2002-04-07
  • 最后登录2013-07-05
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望40点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-07-31 10:11
 
passthru本身倒是的确不创建设备,但是只要passthru
绑定了网卡,那么就会创建设备,你就可以通过读注册表
得到所创建的设备。


多谢老大指点!
小弟没有打开过该设备,还想请教打开它有什么用处?以及对读写操作它会如何处理?

另外的问题请教Hu版主:
如何查询Modem的Total_Size、Frame_Size,和LookaheadBufferSize?

我知道绑定网卡后,上层会主动查询网卡的FrameSize,不知绑定Modem后上层是否会做类似的查询?

小弟对Modem一无所知,不知是否是查询Modem和查询网卡用的OID_Xxx不同?

[编辑 -  7/31/02 by  TonyHuyan]
写驱动不如买足彩!!
游客

返回顶部