testdispatch.c
来自「usb开发」· C语言 代码 · 共 568 行 · 第 1/2 页
C
568 行
pTxdData,NULL,TxdLen,
0,
NULL
);
NtStatus=Call_USBDI(pdx,Urb);
if( !NT_SUCCESS(NtStatus) || !USBD_SUCCESS( Urb->UrbHeader.Status))
{
return STATUS_UNSUCCESSFUL;
DbgPrint("Write failed!");
}
*pWriteLen=Urb->UrbBulkOrInterruptTransfer.TransferBufferLength;
ExFreePool(Urb);
DbgPrint("Write successed!");
return NtStatus;
}
//
NTSTATUS TestIOCTL(IN PDEVICE_OBJECT fdo,IN PIRP Irp)
{
NTSTATUS ntStatus;
PIO_STACK_LOCATION IrpStack;
PDEVICE_EXTENSION pdx;
ULONG IoControlCode;
PVOID IoBuffer;
ULONG InputBufferLength;
ULONG OutputBufferLength;
ULONG length;
PUCHAR pch;
pdx = (PDEVICE_EXTENSION )fdo->DeviceExtension;
if (!LockDevice(fdo))
return CompleteRequest(Irp, STATUS_DELETE_PENDING, 0);
IrpStack = IoGetCurrentIrpStackLocation (Irp);
IoBuffer = Irp->AssociatedIrp.SystemBuffer;
InputBufferLength = IrpStack->Parameters.DeviceIoControl.InputBufferLength;
OutputBufferLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;
IoControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode;
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
switch (IoControlCode) {
case IOCTL_ghjusb_IN1:
Irp->IoStatus.Status=UsbReceIn1(pdx, IoBuffer, &length);
if(length)
{
Irp->IoStatus.Information = length;
Irp->IoStatus.Status = STATUS_SUCCESS;
}
else
{
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
}
break;
case IOCTL_ghjusb_VENDOR_REQUEST:
length = UsbVendorRequest (fdo, IoBuffer);
if (length)
{
Irp->IoStatus.Information = length;
Irp->IoStatus.Status = STATUS_SUCCESS;
}//执行成功.
else
{
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
}//执行失败.
break;
case IOCTL_ghjusb_GET_DEVICE_DESCRIPTOR:
{
length = UsbGetDeviceDescriptor (fdo, IoBuffer);
Irp->IoStatus.Information = length;
Irp->IoStatus.Status = STATUS_SUCCESS;
}
break;
case IOCTL_ghjusb_GET_STRING_DESCRIPTOR:
{
PGET_STRING_DESCRIPTOR_IN Input = IoBuffer;
if ((InputBufferLength = sizeof(GET_STRING_DESCRIPTOR_IN)) &&
(OutputBufferLength > 0)) {
length = UsbGetStringDescriptor (fdo,
Input->Index,
Input->LanguageId,
IoBuffer,
OutputBufferLength);
if (length) {
Irp->IoStatus.Information = length;
Irp->IoStatus.Status = STATUS_SUCCESS;
}
else
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
}
else
Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
}
break;
case IOCTL_ghjusb_GET_CONFIGURATION_DESCRIPTOR:
{
length = UsbGetConfigDescriptor (fdo, IoBuffer, OutputBufferLength);
Irp->IoStatus.Information = length;
Irp->IoStatus.Status = STATUS_SUCCESS;
}
break;
default:
Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
}
UnlockDevice(fdo);
ntStatus = Irp->IoStatus.Status;
IoCompleteRequest (Irp,IO_NO_INCREMENT);
return ntStatus;
}
//
ULONG UsbVendorRequest(IN PDEVICE_OBJECT fdo, IN char * pVendorRequest)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
PURB urb = NULL;
ULONG length = 0;
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 = *((unsigned short *)(pVendorRequest+6));//pVendorRequest->wLength;
urb->UrbControlVendorClassRequest.TransferBufferMDL = NULL;
urb->UrbControlVendorClassRequest.Request = *(pVendorRequest+1);//pVendorRequest->bRequest;
urb->UrbControlVendorClassRequest.Value = *((unsigned short *)(pVendorRequest+2));//pVendorRequest->wValue;
urb->UrbControlVendorClassRequest.Index = *((unsigned short *)(pVendorRequest+4));//pVendorRequest->wIndex;
if (*pVendorRequest&0X80)
{
urb->UrbControlVendorClassRequest.TransferFlags |= USBD_TRANSFER_DIRECTION_IN;
urb->UrbControlVendorClassRequest.TransferBuffer = pVendorRequest;
}
else
{
urb->UrbControlVendorClassRequest.TransferFlags = 0;
urb->UrbControlVendorClassRequest.TransferBuffer = pVendorRequest+8;
}
ntStatus = CallUSBDI(fdo, urb);
length = urb->UrbControlVendorClassRequest.TransferBufferLength;
ExFreePool(urb);
}
return length;
}
//
ULONG UsbGetDeviceDescriptor(IN PDEVICE_OBJECT fdo,
PVOID pvOutputBuffer)
{
NTSTATUS ntStatus = STATUS_SUCCESS;
PURB urb = NULL;
ULONG length = 0;
PDEVICE_EXTENSION pdx = NULL;
pdx = fdo->DeviceExtension;
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_DEVICE_DESCRIPTOR_TYPE,
0,
0,
pvOutputBuffer,
NULL,
sizeof(USB_DEVICE_DESCRIPTOR),
NULL);
ntStatus = CallUSBDI(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 = CallUSBDI(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 = CallUSBDI(fdo, urb);
if (NT_SUCCESS(ntStatus)) {
length = urb->UrbControlDescriptorRequest.TransferBufferLength;
}
else
length = 0;
ExFreePool(urb);
return length;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?