DriverStudio 和 WDF驱动 通过GUID获取设备句柄的差别

简介: <p><strong>DriverStudio</strong></p> <p>/*****************************************************************************<br> * 功能: 通过GUID打开设备,获得设备句柄<br> * 参数: <br> ******************************

DriverStudio

/*****************************************************************************
* 功能: 通过GUID打开设备,获得设备句柄
* 参数: 
*****************************************************************************/
HANDLE lOpenByInterface(
  GUID* pClassGuid, // points to the GUID that identifies the interface class
  DWORD instance,  // specifies which instance of the enumerated devices to open
  PDWORD pError  // address of variable to receive error status
  )
{
 HANDLE hDev=0;
 
 CDeviceInterfaceClass DevClass(pClassGuid, pError);

 if (*pError != ERROR_SUCCESS)
  return INVALID_HANDLE_VALUE;

 CDeviceInterface DevInterface(&DevClass, instance, pError);

 if (*pError != ERROR_SUCCESS)
  return INVALID_HANDLE_VALUE;

 hDev = CreateFile(
  DevInterface.DevicePath(),
  GENERIC_READ | GENERIC_WRITE,
  FILE_SHARE_READ | FILE_SHARE_WRITE,
  NULL,
  OPEN_EXISTING,
  FILE_ATTRIBUTE_NORMAL,
  NULL
  );

 if (hDev == INVALID_HANDLE_VALUE)
  *pError = GetLastError();
 
 return hDev;
}

//WDF驱动

HANDLE CxDriverInterface::SetupDevInterfaces(DWORD dev_interface_index, int board_type)
{
 HANDLE hd_invalid = INVALID_HANDLE_VALUE;
 DWORD required_buf_size;
 GUID *pGuid = (LPGUID)&GUID_DEVINTERFACE_ATHENA;

 if ( board_type == Athena_EVK )
 {
  pGuid = (LPGUID)&GUID_DEVINTERFACE_ATHENA;
 }
 else if( (board_type == Atlas_Plus_EVK) || (board_type == Atlas_EVK) )
 {
  pGuid = (LPGUID)&GUID_DEVINTERFACE_ATLAS;
 }

 //Get handle to our device information set that contains requested device information elements
 HDEVINFO devInfoSetHandle = SetupDiGetClassDevs(pGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_INTERFACEDEVICE);
 if ( devInfoSetHandle == INVALID_HANDLE_VALUE )
 {
  TRACE("SetupDiGetClassDevs failed to find device GUID in system! \n");
  return hd_invalid;
 }

 SP_INTERFACE_DEVICE_DATA devInterfaceInfo;
 devInterfaceInfo.cbSize = sizeof(devInterfaceInfo);

 // Try to enumerate the device interfaces that are contained in device information set just retrieved
 if( !SetupDiEnumDeviceInterfaces( devInfoSetHandle, NULL, pGuid, dev_interface_index, &devInterfaceInfo ) )
 {
  TRACE("SetupDiEnumDeviceInterfaces failed to enumerate device GUID! \n");
  SetupDiDestroyDeviceInfoList(devInfoSetHandle);
  return hd_invalid;
 }

 // Get the required buffer size and allocate proper sized buffer
 SetupDiGetDeviceInterfaceDetail( devInfoSetHandle, &devInterfaceInfo, NULL, 0, &required_buf_size, NULL );
 PSP_INTERFACE_DEVICE_DETAIL_DATA devInterfaceDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA) malloc (required_buf_size);

 if( devInterfaceDetail == NULL )
 {
  TRACE("SetupDiGetDeviceInterfaceDetail failed! \n");
  SetupDiDestroyDeviceInfoList( devInfoSetHandle );
  return hd_invalid;
 }

 // Get details for the device interface
 devInterfaceDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
 if( !SetupDiGetDeviceInterfaceDetail( devInfoSetHandle, &devInterfaceInfo, devInterfaceDetail, required_buf_size, NULL, NULL) )
 {
  TRACE("SetupDiGetDeviceInterfaceDetail failed to set SP_INTERFACE_DEVICE_DETAIL_DATA! \n");
  SetupDiDestroyDeviceInfoList( devInfoSetHandle );
  delete devInterfaceDetail;
  return hd_invalid;
 }
 //前面这部分在Driverworks中用两个类来完成
 // Get device handle
 LPCWSTR dev_path = devInterfaceDetail->DevicePath;
 HANDLE dev_hd = CreateFile( devInterfaceDetail->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

 if( dev_hd == INVALID_HANDLE_VALUE )
 {
  TRACE("Failed to create device handleB!");
  exit(1);
 }

 delete devInterfaceDetail;

 if ( devInfoSetHandle )
  SetupDiDestroyDeviceInfoList( devInfoSetHandle );

 return dev_hd;
}

相关文章
|
Kubernetes 持续交付 开发者
探索并实践Kubernetes集群管理与自动化部署
探索并实践Kubernetes集群管理与自动化部署
268 4
|
11月前
|
存储 自然语言处理 数据库
Python字典操作实现文章敏感词检索
Python字典操作实现文章敏感词检索
207 0
|
供应链 搜索推荐 数据可视化
我用低代码平台,简单搭建了一套管理系统
我用低代码平台,简单搭建了一套管理系统
395 0
|
前端开发 JavaScript Android开发
【Uniapp 专栏】分析 Uniapp 与其他前端框架的异同
【5月更文挑战第16天】Uniapp是一个基于Vue.js的跨平台前端框架,能将代码编译成iOS、Android、H5等多个平台应用,简化跨平台开发。相比React和Angular,Uniapp更适合移动应用,减少平台适配工作。Vue.js的组件化和灵活性在Uniapp中得到延伸,增加了移动端特性。而Flutter性能优越,但学习成本高。开发者应根据项目需求和技术栈选择合适的框架。
389 4
【Uniapp 专栏】分析 Uniapp 与其他前端框架的异同
|
Kubernetes Linux Docker
Kubernetes(K8S) helm 安装
Kubernetes(K8S) helm 安装
387 1
|
监控 数据挖掘 数据安全/隐私保护
ERP系统中的业务流程优化与再造
【7月更文挑战第25天】 ERP系统中的业务流程优化与再造
889 2
|
编译器 C++ 开发者
C++一分钟之-返回值优化与Move Semantics
【6月更文挑战第19天】C++的RVO与移动语义提升效率,减少对象复制。RVO是编译器优化,避免临时对象的创建。移动语义通过右值引用和`std::move`转移资源所有权。注意RVO不是总有效,不应过度依赖。使用移动语义时,避免误用`std::move`导致对象无效。示例展示了RVO和移动构造函数的应用。理解并恰当使用这些机制能写出更高效代码。
165 3
|
前端开发 Java Maven
Maven 快照(SNAPSHOT)
Maven快照(SNAPSHOT)解决多团队协作问题。当开发data-service的团队频繁更新并需通知app-ui团队时,使用SNAPSHOT版本避免频繁修改pom.xml。SNAPSHOT表示开发中的特定阶段,Maven会检查远程仓库的最新快照,如data-service:1.0-SNAPSHOT,以保持同步。
|
前端开发 JavaScript
Promise.all中的错误处理
Promise.all中的错误处理
700 0
Promise.all中的错误处理
|
JavaScript 前端开发 API
强大的图片预览组件Viewer.js
1、 Viewer.js简介 2、Viewer.js支持的功能 3、Viewer.js的API 4 使用方法 4.1 引入方式 4.2 简单demo 5.viewer.js源码,js版本
2532 0
强大的图片预览组件Viewer.js