IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX IOCTL (usbioctl.h)
A solicitação IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX recupera informações sobre uma porta USB e o dispositivo anexado à porta, se houver uma.
Os drivers de cliente devem enviar esse IOCTL em um IRQL de PASSIVE_LEVEL.
IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX é uma solicitação de controle de E/S no modo de usuário. Essa solicitação tem como destino o dispositivo de hub USB (GUID_DEVINTERFACE_USB_HUB).
Código principal
Buffer de entrada/saída
Os buffers de entrada e saída apontam para uma estrutura de USB_NODE_CONNECTION_INFORMATION_EX alocada pelo chamador. Na entrada, o membro ConnectionIndex dessa estrutura deve conter um número maior ou igual a 1 que indique o número da porta cujas informações de conexão devem ser relatadas. O driver do hub retorna informações de conexão nos membros restantes do USB_NODE_CONNECTION_INFORMATION_EX. O IRP, membro AssociatedIrp.SystemBuffer , aponta para a estrutura USB_NODE_CONNECTION_INFORMATION_EX .
Na saída, a estrutura USB_NODE_CONNECTION_INFORMATION_EX recebe informações sobre a conexão indicada do driver do hub USB.
Comprimento do buffer de entrada/saída
O tamanho de uma estrutura USB_NODE_CONNECTION_INFORMATION_EX .
Bloco de status
A pilha USB define Irp-IoStatus.Status> como STATUS_SUCCESS se a solicitação for bem-sucedida. Caso contrário, a pilha USB define Status como a condição de erro apropriada, como STATUS_INVALID_PARAMETER ou STATUS_INSUFFICIENT_RESOURCES.
Comentários
Aqui está um exemplo que mostra como obter a velocidade da porta do hub enviando essa solicitação.
A função especifica o link simbólico para o dispositivo de hub e o índice de porta a serem consultados. No retorno, pPortSpeed indica:
- Velocidade da porta
- SPEED_PATHERROR: se não for possível abrir o caminho.
- SPEED_IOCTLERROR: o IOCTL do Hub falhou.
void GetPortSpeed(const WCHAR *Path, ULONG PortIndex, UCHAR *pPortSpeed)
{
if (Path == NULL) { return; }
HANDLE handle = CreateFile(
Path,
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_WRITE | FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
NULL,
NULL
);
if (handle == INVALID_HANDLE_VALUE)
{
*pPortSpeed = SPEED_PATHERROR;
return;
}
PUSB_NODE_CONNECTION_INFORMATION_EX ConnectionInfo =
(PUSB_NODE_CONNECTION_INFORMATION_EX)
malloc(sizeof(USB_NODE_CONNECTION_INFORMATION_EX));
ConnectionInfo->ConnectionIndex = PortIndex;
ULONG bytes = 0;
BOOL success = DeviceIoControl(handle,
IOCTL_USB_GET_NODE_CONNECTION_INFORMATION_EX,
ConnectionInfo,
sizeof(USB_NODE_CONNECTION_INFORMATION_EX),
ConnectionInfo,
sizeof(USB_NODE_CONNECTION_INFORMATION_EX),
&bytes,
NULL);
CloseHandle(handle);
if (success == FALSE)
{
*pPortSpeed = SPEED_IOCTLERROR;
}
else
{
*pPortSpeed = (UCHAR)ConnectionInfo->Speed;
}
free(ConnectionInfo);
}
Requisitos
Requisito | Valor |
---|---|
Cliente mínimo com suporte | Windows XP, Windows Server 2003 e posterior. |
Cabeçalho | usbioctl.h (inclua Usbioctl.h) |