📄 testdispatch.c
字号:
return STATUS_INVALID_PARAMETER;
UsbBuildGetDescriptorRequest(urb,
(USHORT) sizeof (struct _URB_CONTROL_DESCRIPTOR_REQUEST),
USB_DEVICE_DESCRIPTOR_TYPE,
0,
0,
pvOutputBuffer,
NULL,
sizeof(USB_DEVICE_DESCRIPTOR),
NULL);
ntStatus = UsbCallUSBDI(fdo, urb);
if (NT_SUCCESS(ntStatus)) {
length = urb->UrbControlDescriptorRequest.TransferBufferLength;
}
else
length = 0;
ExFreePool(urb);
return length;
}
//
ULONG UsbGetStringDescriptor(IN PDEVICE_OBJECT fdo,
UCHAR Index,
USHORT LanguageId,
PVOID pvOutputBuffer,
ULONG ulLength)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
PURB urb = NULL;
ULONG length = 0;
urb = ExAllocatePool(NonPagedPool,
sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST));
if (urb==NULL)
return STATUS_NO_MEMORY;
if (pvOutputBuffer==NULL)
return STATUS_INVALID_PARAMETER;
UsbBuildGetDescriptorRequest(urb,
(USHORT) sizeof (struct _URB_CONTROL_DESCRIPTOR_REQUEST),
USB_STRING_DESCRIPTOR_TYPE,
Index,
LanguageId,
pvOutputBuffer,
NULL,
ulLength,
NULL);
ntStatus = UsbCallUSBDI(fdo, urb);
if (NT_SUCCESS(ntStatus)) {
length = urb->UrbControlDescriptorRequest.TransferBufferLength;
}
else
length = 0;
ExFreePool(urb);
return length;
}
//
ULONG UsbGetConfigDescriptor(IN PDEVICE_OBJECT fdo,
PVOID pvOutputBuffer,
ULONG ulLength)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
PURB urb = NULL;
ULONG length = 0;
urb = ExAllocatePool(NonPagedPool,
sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST));
if (urb==NULL)
return STATUS_NO_MEMORY;
if (pvOutputBuffer==NULL)
return STATUS_INVALID_PARAMETER;
UsbBuildGetDescriptorRequest(urb,
(USHORT) sizeof (struct _URB_CONTROL_DESCRIPTOR_REQUEST),
USB_CONFIGURATION_DESCRIPTOR_TYPE,
0,
0,
pvOutputBuffer,
NULL,
ulLength,
NULL);
ntStatus = UsbCallUSBDI(fdo, urb);
if (NT_SUCCESS(ntStatus)) {
length = urb->UrbControlDescriptorRequest.TransferBufferLength;
}
else
length = 0;
ExFreePool(urb);
return length;
}
//
NTSTATUS Bulk_Read_Write(IN PDEVICE_OBJECT fdo,IN PIRP Irp)
{
NTSTATUS ntStatus;
PURB urb = NULL;
ULONG urbSize = 0;
ULONG transferFlags = 0;
PUSBD_INTERFACE_INFORMATION interfaceInfo = NULL;
PUSBD_PIPE_INFORMATION pipeInfo = NULL;
USBD_PIPE_HANDLE pipeHandle = NULL;
PDEVICE_EXTENSION pdx = fdo->DeviceExtension;
PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation (Irp);
PBULK_TRANSFER_CONTROL bulkControl = (PBULK_TRANSFER_CONTROL)Irp->AssociatedIrp.SystemBuffer;
ULONG bufferLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
interfaceInfo = pdx->Interface;
if (!interfaceInfo)
return STATUS_UNSUCCESSFUL;
if (bulkControl->pipeNum > interfaceInfo->NumberOfPipes)
return STATUS_INVALID_PARAMETER;
pipeInfo = &(interfaceInfo->Pipes[bulkControl->pipeNum]);
if (!((pipeInfo->PipeType == UsbdPipeTypeBulk) ||
(pipeInfo->PipeType == UsbdPipeTypeInterrupt)))
return STATUS_INVALID_PARAMETER;
pipeHandle = pipeInfo->PipeHandle;
if (!pipeHandle)
return STATUS_UNSUCCESSFUL;
if (bufferLength > pipeInfo->MaximumTransferSize)
return STATUS_INVALID_PARAMETER;
urbSize = sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER);
urb = ExAllocatePool(NonPagedPool,urbSize);
if (!urb)
return STATUS_NO_MEMORY;
transferFlags = USBD_SHORT_TRANSFER_OK;
if (USB_ENDPOINT_DIRECTION_IN(pipeInfo->EndpointAddress))
transferFlags |= USBD_TRANSFER_DIRECTION_IN;
UsbBuildInterruptOrBulkTransferRequest(urb,
(USHORT) urbSize,
pipeHandle,
NULL,
Irp->MdlAddress,
bufferLength,
transferFlags,
NULL);
ntStatus = UsbCallUSBDI(fdo, urb);
if (NT_SUCCESS(ntStatus))
Irp->IoStatus.Information = urb->UrbBulkOrInterruptTransfer.TransferBufferLength;
ExFreePool(urb);
return ntStatus;
}
//
ULONG UsbVendorRequest(IN PDEVICE_OBJECT fdo, IN PVENDOR_REQUEST_IN pVendorRequest)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
PURB urb = NULL;
ULONG length = 0;
PUCHAR buffer = NULL;
urb = ExAllocatePool(NonPagedPool,
sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST));
if (urb)
{
RtlZeroMemory(urb,sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST));
urb->UrbHeader.Length = sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST);
urb->UrbHeader.Function = URB_FUNCTION_VENDOR_DEVICE;
urb->UrbControlVendorClassRequest.TransferBufferLength = pVendorRequest->wLength;
urb->UrbControlVendorClassRequest.TransferBufferMDL = NULL;
urb->UrbControlVendorClassRequest.Request = pVendorRequest->bRequest;
urb->UrbControlVendorClassRequest.Value = pVendorRequest->wValue;
urb->UrbControlVendorClassRequest.Index = pVendorRequest->wIndex;
if (pVendorRequest->direction)
{
urb->UrbControlVendorClassRequest.TransferFlags |= USBD_TRANSFER_DIRECTION_IN;
urb->UrbControlVendorClassRequest.TransferBuffer = pVendorRequest;
}
else
{
urb->UrbControlVendorClassRequest.TransferFlags = 0;
buffer = ExAllocatePool(NonPagedPool, pVendorRequest->wLength);
urb->UrbControlVendorClassRequest.TransferBuffer = buffer;
if (pVendorRequest->wLength == 1)
{
buffer[0] = pVendorRequest->bData;
}
else
{
int i;
PUCHAR ptr = buffer;
for (i=0; i < pVendorRequest->wLength; i++)
{
*ptr = (UCHAR) i;
ptr++;
}
}
}
ntStatus = UsbCallUSBDI(fdo, urb);
if (pVendorRequest->direction)
{
length = urb->UrbControlVendorClassRequest.TransferBufferLength;
}
else
{
length = 0;
}
ExFreePool(urb);
if (buffer) ExFreePool(buffer);
}
return length;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -