495417
驱动牛犊
驱动牛犊
  • 注册日期2002-02-26
  • 最后登录2002-06-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1558回复:7

请教:如何根据GUID得到一个符号连接?

楼主#
更多 发布于:2002-03-16 12:51
使用什么函数?

最新喜欢:

zl7910zl7910
肥鸟
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-03-16 13:47
驱动中使用:
NTSTATUS IoRegisterDeviceInterface(
       IN PDEVICE_OBJECT PhysicalDeviceObject,
       IN CONST GUID *InterfaceClassGuid,
       IN PUNICODE_STRING ReferenceString OPTIONAL,
       OUT PUNICODE_STRING SymbolicLinkName
       );
应用程序中:
标准的调用方法(见Chris Cant的WDM1TEST)

HANDLE GetDeviceViaInterface( GUID* pGuid, DWORD instance)
{
// Get handle to relevant device information set
HDEVINFO info = SetupDiGetClassDevs(pGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
if(info==INVALID_HANDLE_VALUE)
{
printf(\"No HDEVINFO available for this GUID\\n\");
return NULL;
}

// Get interface data for the requested instance
SP_INTERFACE_DEVICE_DATA ifdata;
ifdata.cbSize = sizeof(ifdata);
while(!SetupDiEnumDeviceInterfaces(info, NULL, pGuid, instance, &ifdata))
{
if(GetLastError()==ERROR_NO_MORE_ITEMS)
{
printf(\"No SP_INTERFACE_DEVICE_DATA available for this GUID instance\\n\");
SetupDiDestroyDeviceInfoList(info);
return NULL;
}
else
{
instance++;
}
}

// Get size of symbolic link name
DWORD ReqLen;
SetupDiGetDeviceInterfaceDetail(info, &ifdata, NULL, 0,
&ReqLen, NULL);
PSP_INTERFACE_DEVICE_DETAIL_DATA ifDetail =
(PSP_INTERFACE_DEVICE_DETAIL_DATA)(new char[ReqLen]);
if( ifDetail==NULL)
{
SetupDiDestroyDeviceInfoList(info);
return NULL;
}

// Get symbolic link name
ifDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
if( !SetupDiGetDeviceInterfaceDetail(info, &ifdata, ifDetail,
ReqLen, NULL, NULL))
{
SetupDiDestroyDeviceInfoList(info);
delete ifDetail;
return NULL;
}

printf(\"Symbolic link is %s\\n\",ifDetail->DevicePath);
// Open file
HANDLE rv = CreateFile( ifDetail->DevicePath,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
NULL);
if( rv==INVALID_HANDLE_VALUE) rv = NULL;

delete ifDetail;
SetupDiDestroyDeviceInfoList(info);
return rv;
}

犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2002-03-16 14:32
用户被禁言,该主题自动屏蔽!
495417
驱动牛犊
驱动牛犊
  • 注册日期2002-02-26
  • 最后登录2002-06-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-03-16 14:45
您所说的例子程序我看过了,不过那个程序是基于控制台的应用程序,当我写一个WIN32程序调用其中的函数时(比如SetupDiGetClassDevs),编译时出错,错误提示:error LNK2001: unresolved external symbol __imp__SetupDiGetClassDevsA@16
请问什么原因?
肥鸟
tigerzd
驱动老牛
驱动老牛
  • 注册日期2001-08-25
  • 最后登录2004-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-03-16 15:02
这是基本的道理啊,你要加上头文件setupapi.h,还有库文件,在project\\setting\\link\\object/lib中加入setupapi.lib(setupapi.lib在98ddk中)。
看来你对VC很不熟哦。 :(
犯强汉者,虽远必诛! [img]http://www.driverdevelop.com/forum/upload/tigerzd/2002-12-13_sf10.JPG[/img]
495417
驱动牛犊
驱动牛犊
  • 注册日期2002-02-26
  • 最后登录2002-06-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-03-16 15:05
例子程序是DOS提示符下的应用程序,我在WIN32下使用例子提供的函数(打开设备),编译会出错,头文件有了(setupapi.h),怎么回事啊?
肥鸟
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2002-03-16 15:15
用户被禁言,该主题自动屏蔽!
495417
驱动牛犊
驱动牛犊
  • 注册日期2002-02-26
  • 最后登录2002-06-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-03-16 15:20
问题解决了,多谢二位的热情回答。
肥鸟
游客

返回顶部