阅读:1631回复:6
如何打开ms_filter设备获得句柄?
在正确安装了设备驱动后,系统的设备管理里出现了与网卡对应的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该如何打开呢并获得句柄呢? |
|
沙发#
发布于:2002-07-29 13:17
你分析的原因不成立。
你确认在Administrator登录情况下可以打开? 你的设备是怎么创建的? |
|
|
板凳#
发布于: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\"); } |
|
地板#
发布于: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] |
|
|
地下室#
发布于:2002-07-29 16:04
刚刚看到你代码中的一点错误,CreateFile打开设备的时候参数怎么能用Open_Always呢?或许用了也不见得就不行,这个我没试过,但Msdn中明确提到 The dwCreationDisposition parameter must have the OPEN_EXISTING value.
|
|
|
5楼#
发布于:2002-07-29 16:44
passthru本身倒是的确不创建设备,但是只要passthru
绑定了网卡,那么就会创建设备,你就可以通过读注册表 得到所创建的设备。 我倒是没做过类似的测试,但总觉得不应该有问题。 |
|
|
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] |
|
|