zoukankan      html  css  js  c++  java
  • DriverStudio 和 WDF驱动 通过GUID获取设备句柄的差别 分类: windows驱动程序WDM 2013-10-30 08:56 812人阅读 评论(0) 收藏

    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! ");
      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! ");
      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! ");
      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! ");
      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;
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    选项卡
    使用script创建标签添加属性值和添加样式
    判断表单不能为空(表格形式的)
    数组
    关于meta元信息元素
    js判断数据类型
    Ising模型的Metropolis模拟中的组态阻塞和振荡
    python 画能级图
    python 调用 shell 命令,制作用户界面
    打包 python 程序,变成一个可执行文件
  • 原文地址:https://www.cnblogs.com/mao0504/p/4706744.html
Copyright © 2011-2022 走看看