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


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

  • 相关阅读:
    Qt学习之路,part1
    1.获取状态栏的高度
    如何在Android Studio中上传代码到Gitee上
    关于类图
    外观模式
    关于类的实例
    SharedPreference中关于editor.apply()和editor.commit()
    活动的4种启动模式
    unittest中case批量管理
    unittest使用
  • 原文地址:https://www.cnblogs.com/pangblog/p/3398124.html
Copyright © 2020-2023  润新知