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;
}

相关文章
|
3月前
|
Go 开发工具 C++
2023驱动保护学习 -- 创建第一个驱动程序
2023驱动保护学习 -- 创建第一个驱动程序
30 0
|
4月前
|
存储 算法 数据安全/隐私保护
6.5 Windows驱动开发:内核枚举PspCidTable句柄表
在 Windows 操作系统内核中,PspCidTable 通常是与进程(Process)管理相关的数据结构之一。它与进程的标识和管理有关,每个进程都有一个唯一的标识符,称为进程 ID(PID)。与之相关的是客户端 ID,它是一个结构,其中包含唯一标识进程的信息。这样的标识符在进程管理、线程管理和内核对象的创建等方面都起到关键作用。
31 1
6.5 Windows驱动开发:内核枚举PspCidTable句柄表
|
4月前
|
Windows
5.1 Windows驱动开发:判断驱动加载状态
在驱动开发中我们有时需要得到驱动自身是否被加载成功的状态,这个功能看似没啥用实际上在某些特殊场景中还是需要的,如下代码实现了判断当前驱动是否加载成功,如果加载成功, 则输出该驱动的详细路径信息。该功能实现的核心函数是`NtQuerySystemInformation`这是一个微软未公开的函数,也没有文档化,不过我们仍然可以通过动态指针的方式调用到它,该函数可以查询到很多系统信息状态,首先需要定义一个指针。
39 0
5.1 Windows驱动开发:判断驱动加载状态
|
5月前
|
存储 API Windows
4.1 Windows驱动开发:内核中进程与句柄互转
在内核开发中,经常需要进行进程和句柄之间的互相转换。进程通常由一个唯一的进程标识符(PID)来标识,而句柄是指对内核对象的引用。在Windows内核中,`EProcess`结构表示一个进程,而HANDLE是一个句柄。为了实现进程与句柄之间的转换,我们需要使用一些内核函数。对于进程PID和句柄的互相转换,可以使用函数如`OpenProcess`和`GetProcessId`。OpenProcess函数接受一个PID作为参数,并返回一个句柄。GetProcessId函数接受一个句柄作为参数,并返回该进程的PID。
48 1
4.1 Windows驱动开发:内核中进程与句柄互转
|
7月前
|
传感器 数据采集 芯片
DS18B20驱动程序调试总结
DS18B20驱动程序调试总结
|
存储 算法 API
驱动开发:内核枚举PspCidTable句柄表
在上一篇文章`《驱动开发:内核枚举DpcTimer定时器》`中我们通过枚举特征码的方式找到了`DPC`定时器基址并输出了内核中存在的定时器列表,本章将学习如何通过特征码定位的方式寻找`Windows 10`系统下面的`PspCidTable`内核句柄表地址。
452 0
驱动开发:内核枚举PspCidTable句柄表