VBoxUsbTool.cpp revision e04781b223e38e3b0c386d7e7c1dd7f30e9f6e90
/* $Id$ */
/** @file
* Windows USB R0 Tooling.
*/
/*
* Copyright (C) 2011 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
#define INITGUID
#include "VBoxUsbTool.h"
#include <usbbusif.h>
#define VBOXUSBTOOL_MEMTAG 'TUBV'
{
return pvMem;
}
{
if (pvMem)
{
}
return pvMem;
}
{
}
{
if (!pUrb)
return NULL;
return pUrb;
}
{
if (!pUrb)
return NULL;
return pUrb;
}
{
return NULL;
return pUrb;
}
{
}
{
if (dwTimeoutMs == RT_INDEFINITE_WAIT)
return VBoxUsbToolIoInternalCtlSendSyncWithTimeout(pDevObj, IOCTL_INTERNAL_USB_SUBMIT_URB, pUrb, NULL, dwTimeoutMs);
}
VBOXUSBTOOL_DECL(NTSTATUS) VBoxUsbToolGetDescriptor(PDEVICE_OBJECT pDevObj, void *pvBuffer, int cbBuffer, int Type, int iIndex, int LangId, ULONG dwTimeoutMs)
{
if(!pUrb)
{
return STATUS_INSUFFICIENT_RESOURCES;
}
#ifdef DEBUG_misha
#endif
return Status;
}
VBOXUSBTOOL_DECL(VOID) VBoxUsbToolStringDescriptorToUnicodeString(PUSB_STRING_DESCRIPTOR pDr, PUNICODE_STRING pUnicode)
{
/* for some reason the string dr sometimes contains a non-null terminated string
* although we zeroed up the complete descriptor buffer
* this is why RtlInitUnicodeString won't work
* we need to init the scting length based on dr length */
pUnicode->Length = pUnicode->MaximumLength = pDr->bLength - RT_OFFSETOF(USB_STRING_DESCRIPTOR, bString);
}
VBOXUSBTOOL_DECL(NTSTATUS) VBoxUsbToolGetStringDescriptorA(PDEVICE_OBJECT pDevObj, char *pResult, ULONG cbResult, int iIndex, int LangId, ULONG dwTimeoutMs)
{
char aBuf[MAXIMUM_USB_STRING_LENGTH];
*pResult = 0;
NTSTATUS Status = VBoxUsbToolGetDescriptor(pDevObj, pDr, cbBuf, USB_STRING_DESCRIPTOR_TYPE, iIndex, LangId, dwTimeoutMs);
if (NT_SUCCESS(Status))
{
{
/* for some reason the string dr sometimes contains a non-null terminated string
* although we zeroed up the complete descriptor buffer
* this is why RtlInitUnicodeString won't work*/
if (NT_SUCCESS(Status))
{
/* just to make sure the string is null-terminated */
}
}
else
{
}
}
return Status;
}
VBOXUSBTOOL_DECL(NTSTATUS) VBoxUsbToolGetLangID(PDEVICE_OBJECT pDevObj, int *pLangId, ULONG dwTimeoutMs)
{
char aBuf[MAXIMUM_USB_STRING_LENGTH];
*pLangId = 0;
NTSTATUS Status = VBoxUsbToolGetDescriptor(pDevObj, pDr, cbBuf, USB_STRING_DESCRIPTOR_TYPE, 0, 0, dwTimeoutMs);
if (NT_SUCCESS(Status))
{
/* Just grab the first lang ID if available. In 99% cases, it will be US English (0x0409).*/
{
}
else
{
}
}
return Status;
}
{
if (!pIrp)
{
return STATUS_INSUFFICIENT_RESOURCES;
}
if (NT_SUCCESS(Status))
{
}
return Status;
}
{
if (!hPipe)
{
Log(("Resetting the control pipe??\n"));
return STATUS_SUCCESS;
}
if (!pUrb)
{
return STATUS_INSUFFICIENT_RESOURCES;
}
{
AssertMsgFailed((__FUNCTION__": vboxUsbToolRequest failed with %x (%x)\n", Status, pUrb->UrbHeader.Status));
}
return Status;
}
VBOXUSBTOOL_DECL(NTSTATUS) VBoxUsbToolCurrentFrame(PDEVICE_OBJECT pDevObj, PIRP pIrp, PULONG piFrame)
{
struct _URB_GET_CURRENT_FRAME_NUMBER Urb;
if (NT_SUCCESS(Status))
{
}
return Status;
}
{
if (!pUrb)
return STATUS_INSUFFICIENT_RESOURCES;
return Status;
}
VBOXUSBTOOL_DECL(PIRP) VBoxUsbToolIoBuildAsyncInternalCtl(PDEVICE_OBJECT pDevObj, ULONG uCtl, void *pvArg1, void *pvArg2)
{
if (!pIrp)
{
return NULL;
}
pSl->MinorFunction = 0;
return pIrp;
}
VBOXUSBTOOL_DECL(NTSTATUS) VBoxUsbToolIoInternalCtlSendSyncWithTimeout(PDEVICE_OBJECT pDevObj, ULONG uCtl, void *pvArg1, void *pvArg2, ULONG dwTimeoutMs)
{
/* since we're going to cancel the irp on timeout, we should allocate our own IRP rather than using the threaded one
* */
if (!pIrp)
{
return STATUS_INSUFFICIENT_RESOURCES;
}
return Status;
}
VBOXUSBTOOL_DECL(NTSTATUS) VBoxUsbToolIoInternalCtlSendAsync(PDEVICE_OBJECT pDevObj, ULONG uCtl, void *pvArg1, void *pvArg2,
{
if (!pIrp)
{
AssertMsgFailed(("IoBuildDeviceIoControlRequest failed!!\n"));
pIoStatus->Information = 0;
return STATUS_INSUFFICIENT_RESOURCES;
}
/* Get the next stack location as that is used for the new irp */
return Status;
}
VBOXUSBTOOL_DECL(NTSTATUS) VBoxUsbToolIoInternalCtlSendSync(PDEVICE_OBJECT pDevObj, ULONG uCtl, void *pvArg1, void *pvArg2)
{
IO_STATUS_BLOCK IoStatus = {0};
if (Status == STATUS_PENDING)
{
}
return Status;
}