BOOL OpenContext::StartControlTransfer(LPUKWD_CONTROL_TRANSFER_INFO lpTransferInfo)
{
	MutexLocker lock(mMutex);
	DevicePtr dev (mDevice->GetDeviceList(), lpTransferInfo->lpDevice);
	if (!Validate(dev)) {
		SetLastError(ERROR_INVALID_HANDLE);
		return FALSE;
	}

	TRANSFERLIFETIME_MSG((TEXT("USBKWrapperDrv!OpenContext::StartControlTransfer() with ")
		TEXT("bmRequestType 0x%02x, bRequest 0x%02x, wValue 0x%04x, wIndex 0x%04x, wLength %d, flags 0x%08x and size %d\r\n"),
		lpTransferInfo->Header.bmRequestType, lpTransferInfo->Header.bRequest, lpTransferInfo->Header.wValue, 
		lpTransferInfo->Header.wIndex, lpTransferInfo->Header.wLength, lpTransferInfo->dwFlags, 
		lpTransferInfo->dwDataBufferSize));

	// Construct and start the control transfer
	ControlTransfer* ct = new (std::nothrow) ControlTransfer(
			this, dev, lpTransferInfo);
	if (!ct) {
		ERROR_MSG((TEXT("USBKWrapperDrv!OpenContext::StartControlTransfer() - failed to create control transfer, aborting\r\n")));
		SetLastError(ERROR_NOT_ENOUGH_MEMORY);
		return FALSE;
	}
	BOOL ret = ct->Start();
	mTransferList->PutTransfer(ct);
	ct = NULL;
	if (!ret) {
		ERROR_MSG((TEXT("USBKWrapperDrv!OpenContext::StartControlTransfer() - failed to start control transfer %d\r\n"), GetLastError()));
		return FALSE;
	}
	// Ownership of ct has passed to the transfer callback
	return TRUE;
}
BOOL OpenContext::StartBulkTransfer(LPUKWD_BULK_TRANSFER_INFO lpTransferInfo)
{
	MutexLocker lock(mMutex);
	DevicePtr dev (mDevice->GetDeviceList(), lpTransferInfo->lpDevice);
	if (!Validate(dev)) {
		SetLastError(ERROR_INVALID_HANDLE);
		return FALSE;
	}

	// Interface can't be used if device has closed
	if (dev->Closed()) {
		SetLastError(ERROR_INVALID_HANDLE);
		return FALSE;
	}

	// Find the interface for this transfer
	DWORD dwInterface;
	if (!dev->FindInterface(lpTransferInfo->Endpoint, dwInterface)) {
		ERROR_MSG((TEXT("USBKWrapperDrv!OpenContext::StartBulkTransfer() - ")
			TEXT("failed to find interface for endpoint %d on device 0x%08x\r\n"),
			lpTransferInfo->Endpoint, lpTransferInfo->lpDevice));
		SetLastError(ERROR_INVALID_PARAMETER);
		return FALSE;
	}

	// See if it's already been claimed
	if (!dev->InterfaceClaimed(dwInterface, this)) {
		WARN_MSG((TEXT("USBKWrapperDrv!OpenContext::StartBulkTransfer() - ")
			TEXT("using interface %d on device 0x%08x without claiming\r\n"),
			dwInterface, lpTransferInfo->lpDevice));
		if (!dev->ClaimInterface(dwInterface, this)) {
			return FALSE;
		}
	}

	TRANSFERLIFETIME_MSG((TEXT("USBKWrapperDrv!OpenContext::StartBulkTransfer() on ep %x, flag 0x%08x and size %d\r\n"),
		lpTransferInfo->Endpoint, lpTransferInfo->dwFlags, lpTransferInfo->dwDataBufferSize));

	// Construct and start the bulk transfer
	BulkTransfer* bt = new (std::nothrow) BulkTransfer(
			this, dev, dwInterface, lpTransferInfo);
	if (!bt) {
		ERROR_MSG((TEXT("USBKWrapperDrv!OpenContext::StartBulkTransfer() - failed to create bulk transfer, aborting\r\n")));
		SetLastError(ERROR_NOT_ENOUGH_MEMORY);
		return FALSE;
	}
	BOOL ret = bt->Start();
	mTransferList->PutTransfer(bt);
	bt = NULL;
	if (!ret) {
		ERROR_MSG((TEXT("USBKWrapperDrv!OpenContext::StartBulkTransfer() - failed to start bulk transfer %d\r\n"), GetLastError()));
		return FALSE;
	}
	// Ownership of ct has passed to the transfer callback
	return TRUE;
}
Example #3
0
BOOL OpenContext::CancelTransfer(LPUKWD_CANCEL_TRANSFER_INFO lpCancelInfo)
{
	MutexLocker lock(mMutex);
	TransferPtr transfer(this, lpCancelInfo->lpOverlapped);
	if (!transfer.Valid()) {
		TRANSFERLIFETIME_MSG((TEXT("USBKWrapperDrv!OpenContext::CancelTransfer() - failed to find transfer to cancel\r\n")));
		return FALSE;
	}
	return transfer->Cancel(lpCancelInfo->lpDevice, lpCancelInfo->dwFlags);
}