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;

}

DriverStudio 和 WDF驱动 通过GUID获取设备句柄的差别的更多相关文章

  1. WDF驱动中KMDF与UMDF区别

    抄的 早期的Windows 95/98的设备驱动是VxD(Virtual Device Driver),其中x表示某一类设备.从Windows 2000开始,开发驱动程序必以WDM(Windows D ...

  2. WDF驱动的编译、调试、安装

    编译和调试使用WDK编译,源代码应包括wdf.h,ntddk.h以及KMDF_VERSION=1,编译使用/GS.KMDF包括以下库:1). WdfDriverEntry.lib(编译时绑定):驱动入 ...

  3. win7 vs2012+wdk8.0 搭建wdf驱动开发环境

    开发环境搭建:系统:win7 x64工具:vs2012 + WDK8.0插件:wdfcoinstaller.msi(1)先安装vs2012,再安装wdk8.0,这样在打开vs2012时可以创建wind ...

  4. vs2012+wdk8.0 搭建wdf驱动开发环境

    开发环境搭建: 系统:win7 x64 工具:vs2012 + WDK8.0 插件:wdfcoinstaller.msi (1)先安装vs2012,再安装wdk8.0,这样在打开vs2012时可以创建 ...

  5. 基于WDF的PCI/PCIe接口卡Windows驱动程序(4)- 驱动程序代码(源文件)

    原文出处:http://www.cnblogs.com/jacklu/p/4687325.html 本篇文章将对PCIe驱动程序的源文件代码作详细解释与说明.整个WDF驱动程序工程共包含4个头文件(已 ...

  6. 基于WDF的PCI/PCIe接口卡Windows驱动程序(2)-开发者需要了解的WDF中的一些重要的概念

    原文出处:http://www.cnblogs.com/jacklu/p/4646601.html 本科毕业设计是这方面的工作,所以想开几篇博客来介绍使用WDF开发PCI/PCIe接口卡的驱动程序方法 ...

  7. 用Setup系列函数完成驱动卸载安装[驱动安装卸载程序]

    // InstallWDFDriver.cpp : Defines the entry point for the console application. // #include "std ...

  8. windows设备驱动安装接口(自己仿写)

    /***************************************** Author:foo_hack This is File named:Setup.h The Funtion Im ...

  9. RT-Thread 设备驱动ADC浅析与改进

    OS版本:RT-Thread 4.0.0 芯片:STM32F407 下面时官方ADC提供的参考访问接口 访问 ADC 设备 应用程序通过 RT-Thread 提供的 ADC 设备管理接口来访问 ADC ...

随机推荐

  1. 20_Python字典总结

    字典: python内置了字典:dic全称dictionary.其他语言中成为map,使用key-value的存储,键-值.具有极快的查找速度类似与我们查字典,我们要查一个字1.从第一页往后翻,知道翻 ...

  2. 利用多进程获取猫眼电影top100

    猫眼电影top100 是数据是在加载网页时直接就已经加载了的,所以可以通过requests.get()方法去获取这个url的数据,能过对得到的数据进行分析从而获得top100的数据, 把获取的数据存入 ...

  3. 安装pcntl以实现php多进程

    pcntl 扩展包一般就在php源码的ext目录下. cd ./ext/pcntl /opt/server/php5/bin/phpize ./configure \ --with-php-confi ...

  4. centos6.8 安装gitlab记录

    sudo yum install -y curl policycoreutils-python openssh-server cronie sudo lokkit -s http -s ssh sud ...

  5. JdbcTemplate的使用

    NamedParameterJdbcTemplate中包含了一个JdbcTemplate,NamedParameterJdbcTemplate中的很多方法实际上还是交由JdbcTemplate去完成. ...

  6. UVA 12633 Super Rooks on Chessboard [fft 生成函数]

    Super Rooks on Chessboard UVA - 12633 题意: 超级车可以攻击行.列.主对角线3 个方向. R * C 的棋盘上有N 个超级车,问不被攻击的格子总数. 行列好好做啊 ...

  7. HibernateTemplate#setMaxResults()的坑

    如题所示,因为maxResults为实例属性,一经修改,则会应用于所有查询! 不是很清楚,Spring为什么要挖这个坑? 我的解决方案:如需设置返回结果集的大小,则通过HibernateCallbac ...

  8. ------- 软件调试——注销 QQ 过滤驱动设置的事件通知 CallBack (完)-------

    ---------------------------------------------------------------------------------- 本系列的最后一篇演示如何通过调试手 ...

  9. 谨慎升级到HTTPS

    我们的业务主要为两块,首先是h5商城,在商城里面会有很多很多的运营活动,点击进去是在后台配置的各种H5活动链接.而H5商城和运营活动是两个业务,两者的联系就是要在后台系统将运营活动的链接配置到商城中. ...

  10. href与src 区别

    src 是可替换的文本支撑,将指向的内容引入文档当前标签所在的位置, 当浏览器解析到该标签时,将暂停其它资源的下载处理, 请求该标签的src ,下载指向的外部资源并应用到当前文档, 所以js 脚本一般 ...