chentqjl
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-01
  • 粉丝0
  • 关注0
  • 积分37分
  • 威望6点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
阅读:1737回复:9

谁能在ring0下实现下面一小段代码

楼主#
更多 发布于:2005-01-27 17:48
下面的代码实现了将通过设备的GUID得到设备名称的功能,请问在ring0下应该如何实现这段代码

HANDLE hDevice;

SP_DEVINFO_DATA devInfoData;
SP_DEVICE_INTERFACE_DATA  devInterfaceData;
PSP_INTERFACE_DEVICE_DETAIL_DATA   functionClassDeviceData;

ULONG requiredLength = 0;
int deviceNumber = 0;  // Can be other values if more than 1 device connected to driver

   HDEVINFO hwDeviceInfo = SetupDiGetClassDevs ( (LPGUID) &CYUSBDRV_GUID,
                                                  NULL,
                                                  NULL,
                                                  DIGCF_PRESENT|DIGCF_INTERFACEDEVICE);

   if (hwDeviceInfo != INVALID_HANDLE_VALUE)
   {
    
devInterfaceData.cbSize = sizeof(devInterfaceData);

if (SetupDiEnumDeviceInterfaces ( hwDeviceInfo, 0, (LPGUID) &CYUSBDRV_GUID,
                                       deviceNumber, &devInterfaceData))
{

SetupDiGetInterfaceDeviceDetail ( hwDeviceInfo, &devInterfaceData, NULL, 0,
                                         &requiredLength, NULL);

ULONG predictedLength = requiredLength;

functionClassDeviceData = (PSP_INTERFACE_DEVICE_DETAIL_DATA) malloc (predictedLength);
functionClassDeviceData->cbSize = sizeof (SP_INTERFACE_DEVICE_DETAIL_DATA);

devInfoData.cbSize = sizeof(devInfoData);

if (SetupDiGetInterfaceDeviceDetail (hwDeviceInfo,
                                            &devInterfaceData,
                                            functionClassDeviceData,
                                            predictedLength,
                                            &requiredLength,
                                            &devInfoData))
{

hDevice = CreateFile (functionClassDeviceData->DevicePath,
                             GENERIC_WRITE | GENERIC_READ,
                             FILE_SHARE_WRITE | FILE_SHARE_READ,
                             NULL,
                             OPEN_EXISTING,
                             FILE_FLAG_OVERLAPPED,
                             NULL);
free(functionClassDeviceData);
SetupDiDestroyDeviceInfoList(hwDeviceInfo);
}

}

   }


其中打开设备在ring0下可以使用IoGetDeviceObjectPointer,那么其他的三个函数
SetupDiGetClassDevs
SetupDiEnumDeviceInterfaces
SetupDiGetInterfaceDeviceDetail
如何实现呢
陈涛
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-01-27 18:10
这三个函数都是SetupAPI的函数,一般来讲,是没办法在ring0实现的。
根据GUID获得设备名称,好像论坛里有讨论过的。可以先通过GUID获得设备对象handle,然后根据设备对象handle就可以获得其名称,不用像用户空间那样绕圈子。
在交流中学习。。。
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-01-27 18:15
好像前几天的帖子就是你发的,还没有搞定???
在交流中学习。。。
chentqjl
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-01
  • 粉丝0
  • 关注0
  • 积分37分
  • 威望6点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-01-27 18:31
是呀,有人提议将设备作为我使用的filter driver的下层设备来使用,这样就可以直接使用这个设备了,不用使用设备的名字了,可这样做又碰到两个问题:
1、如何将一个device driver作成一个filter driver的下层设备
2、如何得到下层设备的设备对象
想来想去可能比得到设备名字更复杂,现在我已经能用设备名字(当然是应用层得到的一个名字)正确控制设备了,GUID得到名字应该不难吧。
其实我也想过把名字由应用层存在一个地方,ring0来取,这样倒一定可以实现,可是这样真的很蠢,底层还必须得依靠应用层来工作,实在没脸皮这样做。
陈涛
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-01-27 20:19
这是在win98下的程序吧?
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-01-28 09:19
是呀,有人提议将设备作为我使用的filter driver的下层设备来使用,这样就可以直接使用这个设备了,不用使用设备的名字了,可这样做又碰到两个问题:
1、如何将一个device driver作成一个filter driver的下层设备
2、如何得到下层设备的设备对象
想来想去可能比得到设备名字更复杂,现在我已经能用设备名字(当然是应用层得到的一个名字)正确控制设备了,GUID得到名字应该不难吧。
其实我也想过把名字由应用层存在一个地方,ring0来取,这样倒一定可以实现,可是这样真的很蠢,底层还必须得依靠应用层来工作,实在没脸皮这样做。


个人认为GUID本身就是一个用户空间对象的唯一标识,在内核空间应该没有对应的处理函数。
你首先得通过GUID在用户空间获得一个内核可以处理的咚咚,再交由驱动去处理,很显然设备名字是最合适的了。
至于你说的这样很愚蠢,其实应该没那么惨,呵呵
建议你在驱动的DeviceControl例程里增加一个设置设备名称的接口,然后在用户空间通过设备控制方式将该参数传递给驱动,应该没什么问题。
在交流中学习。。。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
6楼#
发布于:2005-01-28 16:29
没有愚蠢的方法,只要有效就是好方法.....
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
chentqjl
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-01
  • 粉丝0
  • 关注0
  • 积分37分
  • 威望6点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-01-28 16:43
用IoGetDeviceInterfaces就可以,比应用层还要简单
陈涛
fslife
驱动大牛
驱动大牛
  • 注册日期2004-06-07
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望49点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-01-28 17:38
搞定了?
给大伙说说吧
:) :)
在交流中学习。。。
chentqjl
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-01
  • 粉丝0
  • 关注0
  • 积分37分
  • 威望6点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2005-01-29 09:46
用IoGetDeviceInterfaces通过设备的GUID取得设备的符号连接名,之后就可以直接控制设备了
陈涛
游客

返回顶部