NTSTATUS AndroidUsbDeviceObject::OnEvtDeviceReleaseHardware(
    WDFCMRESLIST resources_translated) {
  ASSERT_IRQL_PASSIVE();

  // It's possible that Preparehardware failed half way thru. So make
  // sure the target device exists.
  if (!IsTaretDeviceCreated())
    return STATUS_SUCCESS;

  // Cancel all the currently queued I/O. This is better than sending an
  // explicit USB abort request down because release hardware gets
  // called even when the device surprise-removed.
  WdfIoTargetStop(WdfUsbTargetDeviceGetIoTarget(wdf_target_device()),
                  WdfIoTargetCancelSentIo);

  // Unselect all selected configurations
  WDF_USB_DEVICE_SELECT_CONFIG_PARAMS config_params;
  WDF_USB_DEVICE_SELECT_CONFIG_PARAMS_INIT_DECONFIG(&config_params);

  NTSTATUS status = WdfUsbTargetDeviceSelectConfig(wdf_target_device(),
                                                   WDF_NO_OBJECT_ATTRIBUTES,
                                                   &config_params);
  ASSERT(NT_SUCCESS(status) || (STATUS_DEVICE_NOT_CONNECTED == status));
  return status;
}
Exemplo n.º 2
0
// 此函数类似于WDM中的PNP_MN_STOP_DEVICE函数,在设备移除时被调用。
// 当个函数被调用时候,设备仍处于工作状态。
NTSTATUS DrvClass::PnpReleaseHardware(IN WDFCMRESLIST ResourceListTranslated)
{
	KDBG(DPFLTR_INFO_LEVEL, "[PnpReleaseHardware]");

	// 如果PnpPrepareHardware调用失败,UsbDevice为空;
	// 这时候直接返回即可。
	if (m_hUsbDevice == NULL)
		return STATUS_SUCCESS;

	// 取消USB设备的所有IO操作。它将连带取消所有Pipe的IO操作。
	WdfIoTargetStop(WdfUsbTargetDeviceGetIoTarget(m_hUsbDevice), WdfIoTargetCancelSentIo);

	// Deconfiguration或者“反配置”
	WDF_USB_DEVICE_SELECT_CONFIG_PARAMS  configParams;
	WDF_USB_DEVICE_SELECT_CONFIG_PARAMS_INIT_DECONFIG(&configParams);
	return WdfUsbTargetDeviceSelectConfig(m_hUsbDevice, WDF_NO_OBJECT_ATTRIBUTES, &configParams);
}