📄 cioctl.c
字号:
NTSTATUS c_ResetPipe(
IN PDEVICE_OBJECT fdo,
ULONG PipeNum
)
/*++
Routine Description:
Reset a given USB pipe.
NOTE: this will reset the data toggle on the host as well
Arguments:
Return Value:
--*/
{
NTSTATUS ntStatus;
PDEVICE_EXTENSION pdx = fdo->DeviceExtension;
PUSBD_INTERFACE_INFORMATION interfaceInfo = NULL;
USBD_PIPE_HANDLE pipeHandle = NULL;
PURB urb;
USBD_VERSION_INFORMATION VersionInformation;
Ezusb_KdPrint (("EZUSB.SYS: Reset Pipe \n"));
//
// verify that the selected pipe is valid, and get a handle to it. If anything
// is wrong, return an error
//
interfaceInfo = pdx->Interface;
if (!interfaceInfo)
{
Ezusb_KdPrint(("Ezusb_ResetPipe() no interface info - Exiting\n"));
return STATUS_UNSUCCESSFUL;
}
if (PipeNum > interfaceInfo->NumberOfPipes)
{
Ezusb_KdPrint(("Ezusb_ResetPipe() invalid pipe - Exiting\n"));
return STATUS_INVALID_PARAMETER;
}
pipeHandle = interfaceInfo->Pipes[PipeNum].PipeHandle;
urb = ExAllocatePool(NonPagedPool,
sizeof(struct _URB_PIPE_REQUEST));
if (urb)
{
urb->UrbHeader.Length = (USHORT) sizeof (struct _URB_PIPE_REQUEST);
urb->UrbHeader.Function = URB_FUNCTION_RESET_PIPE;
urb->UrbPipeRequest.PipeHandle = pipeHandle;
//
// kludge. Win98 changed the size of the URB_PIPE_REQUEST.
// Check the USBDI version. If it is prior to win98 (0x101)
// make the structure smaller.
//
USBD_GetUSBDIVersion(&VersionInformation);
if (VersionInformation.USBDI_Version < 0x101)
{
Ezusb_KdPrint(("Ezusb_ResetPipe() Detected OSR2.1\n"));
urb->UrbHeader.Length -= sizeof(ULONG);
}
ntStatus = Ezusb_CallUSBD(fdo, urb);
ExFreePool(urb);
}
else
{
ntStatus = STATUS_INSUFFICIENT_RESOURCES;
}
return ntStatus;
}
NTSTATUS c_AbortPipe(
IN PDEVICE_OBJECT fdo,
IN USBD_PIPE_HANDLE PipeHandle
)
/*++
Routine Description:
cancel pending transfers for a pipe
Arguments:
Return Value:
--*/
{
NTSTATUS ntStatus;
PURB urb;
USBD_VERSION_INFORMATION VersionInformation;
Ezusb_KdPrint (("'EZUSB.SYS: Reset Pipe \n"));
urb = ExAllocatePool(NonPagedPool,
sizeof(struct _URB_PIPE_REQUEST));
if (urb)
{
RtlZeroMemory(urb,sizeof(struct _URB_PIPE_REQUEST));
urb->UrbHeader.Length = (USHORT) sizeof (struct _URB_PIPE_REQUEST);
urb->UrbHeader.Function = URB_FUNCTION_ABORT_PIPE;
urb->UrbPipeRequest.PipeHandle = PipeHandle;
//
// kludge. Win98 changed the size of the URB_PIPE_REQUEST.
// Check the USBDI version. If it is prior to win98 (0x101)
// make the structure smaller.
//
USBD_GetUSBDIVersion(&VersionInformation);
if (VersionInformation.USBDI_Version < 0x101)
{
Ezusb_KdPrint(("Ezusb_ResetPipe() Detected OSR2.1\n"));
urb->UrbHeader.Length -= sizeof(ULONG);
}
ntStatus = Ezusb_CallUSBD(fdo, urb);
ExFreePool(urb);
}
else
{
ntStatus = STATUS_INSUFFICIENT_RESOURCES;
}
return ntStatus;
}
ULONG c_GetCurrentFrameNumber(
IN PDEVICE_OBJECT fdo
)
{
PURB urb = NULL;
PDEVICE_EXTENSION pdx = NULL;
NTSTATUS ntStatus = STATUS_SUCCESS;
ULONG frameNumber = 0;
Ezusb_KdPrint (("Enter Ezusb_GetCurrentFrameNumber\n"));
pdx = fdo->DeviceExtension;
urb = ExAllocatePool(NonPagedPool,sizeof(struct _URB_GET_CURRENT_FRAME_NUMBER));
if (urb == NULL)
return 0;
RtlZeroMemory(urb,sizeof(struct _URB_GET_CURRENT_FRAME_NUMBER));
urb->UrbHeader.Length = sizeof(struct _URB_GET_CURRENT_FRAME_NUMBER);
urb->UrbHeader.Function = URB_FUNCTION_GET_CURRENT_FRAME_NUMBER;
ntStatus = Ezusb_CallUSBD(fdo, urb);
if (NT_SUCCESS(ntStatus))
{
frameNumber = urb->UrbGetCurrentFrameNumber.FrameNumber;
}
ExFreePool(urb);
return frameNumber;
}
ULONG c_GetDescriptor(
IN PDEVICE_OBJECT fdo,
PVOID DescriptorBuffer,
ULONG BufferLength,
UCHAR DescriptorType
)
/*++
Routine Description:
Gets a device descriptor from the given device object
Arguments:
fdo - pointer to our device object
DescriptorBuffer - buffer to accept the descriptor table
BufferLength - size of the allocated Descriptor Buffer
DescriptorType - Descriptor Type (per USB spec)
Return Value:
Number of valid bytes in data buffer
--*/
{
NTSTATUS ntStatus = STATUS_SUCCESS;
PURB urb = NULL;
ULONG length = 0;
PDEVICE_EXTENSION pdx = NULL;
Ezusb_KdPrint (("Enter Ezusb_GetDescriptor\n"));
pdx = fdo->DeviceExtension;
urb = ExAllocatePool(NonPagedPool,
sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST));
if (urb)
{
if (DescriptorBuffer)
{
UsbBuildGetDescriptorRequest(urb,
(USHORT) sizeof (struct _URB_CONTROL_DESCRIPTOR_REQUEST),
DescriptorType, //descriptor type
0, //index
0, //language ID
DescriptorBuffer, //transfer buffer
NULL, //MDL
BufferLength, //buffer length
NULL); //link
ntStatus = Ezusb_CallUSBD(fdo, urb);
// If successful, get the length from the Urb
if (NT_SUCCESS(ntStatus))
{
length = urb->UrbControlDescriptorRequest.TransferBufferLength;
}
}
else
{
ntStatus = STATUS_INVALID_PARAMETER;
}
Ezusb_KdPrint (("%d bytes of descriptor received\n",length));
ExFreePool(urb);
}
else
{
ntStatus = STATUS_NO_MEMORY;
}
// If unsuccessful, set the length to 0
if (!(NT_SUCCESS(ntStatus)))
{
length = 0;
}
Ezusb_KdPrint (("Leaving Ezusb_GetDescriptor\n"));
return length;
}
ULONG c_GetDeviceDescriptor(
IN PDEVICE_OBJECT fdo,
PVOID pvOutputBuffer
)
/*++
Routine Description:
Gets a device descriptor from the given device object
Arguments:
fdo - pointer to the sample device object
Return Value:
Number of valid bytes in data buffer
--*/
{
return (c_GetDescriptor(fdo,
pvOutputBuffer,
sizeof(USB_DEVICE_DESCRIPTOR),
USB_DEVICE_DESCRIPTOR_TYPE));
}
ULONG c_GetConfigDescriptor(
IN PDEVICE_OBJECT fdo,
PVOID pvOutputBuffer,
ULONG ulLength
)
/*++
Routine Description:
Gets a configuration descriptor from the given device object
Arguments:
fdo - pointer to the sample device object
pvOutputBuffer - pointer to the buffer where the data is to be placed
ulLength - length of the buffer
Return Value:
Number of valid bytes in data buffer
--*/
{
return (c_GetDescriptor(fdo,
pvOutputBuffer,
ulLength,
USB_CONFIGURATION_DESCRIPTOR_TYPE));
}
ULONG c_GetStringDescriptor(
IN PDEVICE_OBJECT fdo,
UCHAR Index,
USHORT LanguageId,
PVOID pvOutputBuffer,
ULONG ulLength
)
/*++
Routine Description:
Gets the specified string descriptor from the given device object
Arguments:
fdo - pointer to the sample device object
Index - Index of the string descriptor
LanguageId - Language ID of the string descriptor
pvOutputBuffer - pointer to the buffer where the data is to be placed
ulLength - length of the buffer
Return Value:
Number of valid bytes in data buffer
--*/
{
NTSTATUS ntStatus = STATUS_SUCCESS;
PURB urb = NULL;
ULONG length = 0;
Ezusb_KdPrint (("Enter Ezusb_GetStringDescriptor\n"));
urb = ExAllocatePool(NonPagedPool,
sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST));
if (urb)
{
if (pvOutputBuffer)
{
UsbBuildGetDescriptorRequest(urb,
(USHORT) sizeof (struct _URB_CONTROL_DESCRIPTOR_REQUEST),
USB_STRING_DESCRIPTOR_TYPE, //descriptor type
Index, //index
LanguageId, //language ID
pvOutputBuffer, //transfer buffer
NULL, //MDL
ulLength, //buffer length
NULL); //link
ntStatus = Ezusb_CallUSBD(fdo, urb);
}
else
{
ntStatus = STATUS_INVALID_PARAMETER;
}
// If successful, get the length from the Urb, otherwise set length to 0
if (NT_SUCCESS(ntStatus))
{
length = urb->UrbControlDescriptorRequest.TransferBufferLength;
}
else
length = 0;
Ezusb_KdPrint (("%d bytes of string descriptor received\n",length));
ExFreePool(urb);
}
else
{
ntStatus = STATUS_NO_MEMORY;
}
Ezusb_KdPrint (("Leaving Ezusb_GetStringDescriptor\n"));
return length;
}
NTSTATUS c_SetInterface(
IN PDEVICE_OBJECT fdo,
IN UCHAR InterfaceNumber,
IN UCHAR AlternateSetting
)
{
PUSBD_INTERFACE_INFORMATION interfaceInformation = NULL;
PUSB_INTERFACE_DESCRIPTOR interfaceDescriptor = NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -