阅读:1738回复:9
谁能在ring0下实现下面一小段代码
下面的代码实现了将通过设备的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 如何实现呢 |
|
|
沙发#
发布于:2005-01-27 18:10
这三个函数都是SetupAPI的函数,一般来讲,是没办法在ring0实现的。
根据GUID获得设备名称,好像论坛里有讨论过的。可以先通过GUID获得设备对象handle,然后根据设备对象handle就可以获得其名称,不用像用户空间那样绕圈子。 |
|
|
板凳#
发布于:2005-01-27 18:15
好像前几天的帖子就是你发的,还没有搞定???
|
|
|
地板#
发布于:2005-01-27 18:31
是呀,有人提议将设备作为我使用的filter driver的下层设备来使用,这样就可以直接使用这个设备了,不用使用设备的名字了,可这样做又碰到两个问题:
1、如何将一个device driver作成一个filter driver的下层设备 2、如何得到下层设备的设备对象 想来想去可能比得到设备名字更复杂,现在我已经能用设备名字(当然是应用层得到的一个名字)正确控制设备了,GUID得到名字应该不难吧。 其实我也想过把名字由应用层存在一个地方,ring0来取,这样倒一定可以实现,可是这样真的很蠢,底层还必须得依靠应用层来工作,实在没脸皮这样做。 |
|
|
地下室#
发布于:2005-01-27 20:19
这是在win98下的程序吧?
|
|
|
5楼#
发布于:2005-01-28 09:19
是呀,有人提议将设备作为我使用的filter driver的下层设备来使用,这样就可以直接使用这个设备了,不用使用设备的名字了,可这样做又碰到两个问题: 个人认为GUID本身就是一个用户空间对象的唯一标识,在内核空间应该没有对应的处理函数。 你首先得通过GUID在用户空间获得一个内核可以处理的咚咚,再交由驱动去处理,很显然设备名字是最合适的了。 至于你说的这样很愚蠢,其实应该没那么惨,呵呵 建议你在驱动的DeviceControl例程里增加一个设置设备名称的接口,然后在用户空间通过设备控制方式将该参数传递给驱动,应该没什么问题。 |
|
|
6楼#
发布于:2005-01-28 16:29
没有愚蠢的方法,只要有效就是好方法.....
|
|
|
7楼#
发布于:2005-01-28 16:43
用IoGetDeviceInterfaces就可以,比应用层还要简单
|
|
|
8楼#
发布于:2005-01-28 17:38
搞定了?
给大伙说说吧 :) :) |
|
|
9楼#
发布于:2005-01-29 09:46
用IoGetDeviceInterfaces通过设备的GUID取得设备的符号连接名,之后就可以直接控制设备了
|
|
|