📄 ioctliso.c
字号:
/*++
Module Name:
ioctliso.c
--*/
#include "wdm.h"
#include "stdarg.h"
#include "stdio.h"
#include "usbdi.h"
#include "usbdlib.h"
#include "usb100.h"
#include "Iso82930.h"
#include "IsoUsb.h"
#include "usbdlib.h"
NTSTATUS
IsoUsb_ProcessIOCTL(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
/*++
Routine Description:
Dispatch table handler for IRP_MJ_DEVICE_CONTROL;
Handle DeviceIoControl() calls from User mode
Return Value:
NT status code
--*/
{
PIO_STACK_LOCATION irpStack;
PVOID ioBuffer;
ULONG inputBufferLength;
ULONG outputBufferLength;
PDEVICE_EXTENSION deviceExtension;
ULONG ioControlCode;
NTSTATUS ntStatus;
ULONG length;
PUCHAR pch;
PURB urb;
USHORT temp;
USHORT temp2;
PUSB_CONFIGURATION_DESCRIPTOR configurationDescriptor;
IsoUsb_IncrementIoCount(DeviceObject);
deviceExtension = DeviceObject->DeviceExtension;
if ( !IsoUsb_CanAcceptIoRequests( DeviceObject ) )
{
ntStatus = STATUS_DELETE_PENDING;
Irp->IoStatus.Status = ntStatus;
Irp->IoStatus.Information = 0;
IoCompleteRequest( Irp, IO_NO_INCREMENT );
IsoUsb_DecrementIoCount(DeviceObject);
return ntStatus;
}
irpStack = IoGetCurrentIrpStackLocation (Irp);
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = 0;
ioBuffer = Irp->AssociatedIrp.SystemBuffer;
inputBufferLength = irpStack->Parameters.DeviceIoControl.InputBufferLength;
outputBufferLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
ioControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;
switch (ioControlCode)
{
case 4: //Implemented for Compatability with Cypress Thermometer Driver.
pch = (PUCHAR) ioBuffer;
switch(pch[0])
{
case 0x0E: // Set LED Brightness
temp = pch[1]; // Store Brightness
length = VendorCommand(DeviceObject,
0x03, // WriteRAM
0x2C, // gbLEDBrightness
(USHORT)pch[1],
ioBuffer);
length = VendorCommand(DeviceObject,
0x03, // WriteRAM
0x2B, // gbLEDBrightnessUpdate
0x01, // TRUE
ioBuffer);
pch[0] = 0; //Status
pch[1] = temp; //Brightness
Irp->IoStatus.Information = 2;
Irp->IoStatus.Status = STATUS_SUCCESS;
ntStatus = STATUS_SUCCESS;
break;
case 0x0B: // Read Thermometer
length = VendorCommand(DeviceObject,
0x02, // ReadRAM
0x33, // gbThermTempRead
0,
ioBuffer);
temp = pch[1]; // Store Temperature
length = VendorCommand(DeviceObject,
0x02, // ReadRAM
0x34, // gbThermTempRead2
0,
ioBuffer);
temp2 = pch[1]; // Store Sign
length = VendorCommand(DeviceObject,
0x02, // ReadRAM
0x7A, // gbButtonPushed
0,
ioBuffer);
pch[3] = pch[1]; //Move Button
pch[0] = 0; //Status
pch[1] = temp; //Temperature
pch[2] = temp2; //Sign
Irp->IoStatus.Information = 4;
Irp->IoStatus.Status = STATUS_SUCCESS;
ntStatus = STATUS_SUCCESS;
break;
case 0x14: // Read Port
length = VendorCommand(DeviceObject,
0x04, // ReadPort
pch[1], // Address
0,
ioBuffer);
pch[0] = 0; //Status
// pch[1] = pch[2]; //Value // error: data cames back in [1]
Irp->IoStatus.Information = 2;
Irp->IoStatus.Status = STATUS_SUCCESS;
ntStatus = STATUS_SUCCESS;
break;
case 0x15: // Write Port
length = VendorCommand(DeviceObject,
0x05, // WritePort
pch[1], // Address
pch[2], // Value
ioBuffer);
Irp->IoStatus.Information = 1;
Irp->IoStatus.Status = STATUS_SUCCESS;
ntStatus = STATUS_SUCCESS;
break;
case 0x16: // Read RAM
length = VendorCommand(DeviceObject,
0x02, // ReadRAM
pch[1], // Address
0,
ioBuffer);
pch[0] = 0; //Status
// pch[1] = pch[2]; //Value // error: data cames back in [1]
Irp->IoStatus.Information = 2;
Irp->IoStatus.Status = STATUS_SUCCESS;
ntStatus = STATUS_SUCCESS;
break;
case 0x17: // Write RAM
length = VendorCommand(DeviceObject,
0x03, // WriteRAM
pch[1], // Address
pch[2], // Value
ioBuffer);
Irp->IoStatus.Information = 1;
Irp->IoStatus.Status = STATUS_SUCCESS;
ntStatus = STATUS_SUCCESS;
break;
case 0x18: // Read ROM
length = VendorCommand(DeviceObject,
0x01, // ReadROM
pch[1], // Address
0,
ioBuffer);
pch[0] = 0; //Status
// pch[1] = pch[2]; //Value // error: data cames back in [1]
Irp->IoStatus.Information = 2;
Irp->IoStatus.Status = STATUS_SUCCESS;
ntStatus = STATUS_SUCCESS;
break;
default :
break;
ntStatus = STATUS_SUCCESS;
}
break;
case 8: //Reads a Vendor Command
pch = (PUCHAR) ioBuffer;
length = VendorCommand(DeviceObject, (UCHAR)pch[0], (USHORT)pch[1], (USHORT)pch[2], ioBuffer);
Irp->IoStatus.Information = length;
Irp->IoStatus.Status = STATUS_SUCCESS;
ntStatus = STATUS_SUCCESS;
break;
case 12: // GetDescriptor(s)
pch = (PUCHAR) ioBuffer;
length = GetDescriptor(DeviceObject, (UCHAR)pch[0], (UCHAR)pch[1], (USHORT)pch[2], ioBuffer);
Irp->IoStatus.Information = length;
Irp->IoStatus.Status = STATUS_SUCCESS;
ntStatus = STATUS_SUCCESS;
break;
case 16: // Get Status
pch = (PUCHAR) ioBuffer;
length = GetStatus(DeviceObject, (USHORT)pch[0], (USHORT)pch[1], ioBuffer);
Irp->IoStatus.Information = length;
Irp->IoStatus.Status = STATUS_SUCCESS;
ntStatus = STATUS_SUCCESS;
break;
case 20: //IOCTL_ISOUSB_RESET_DEVICE:
ntStatus = IsoUsb_ResetDevice(DeviceObject);
break;
case 24: //Reconfigure Device (Enumerate)
ntStatus = IsoUsb_ConfigureDevice(DeviceObject);
Irp->IoStatus.Information = 0;
Irp->IoStatus.Status = STATUS_SUCCESS;
ntStatus = STATUS_SUCCESS;
break;
case 28: //UnConfigure Device
ntStatus = IsoUsb_StopDevice(DeviceObject);
Irp->IoStatus.Information = 0;
Irp->IoStatus.Status = STATUS_SUCCESS;
ntStatus = STATUS_SUCCESS;
break;
default:
ntStatus = STATUS_INVALID_PARAMETER;
Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
}
IoCompleteRequest (Irp,
IO_NO_INCREMENT
);
IsoUsb_DecrementIoCount(DeviceObject);
return ntStatus;
}
ULONG
VendorCommand(
IN PDEVICE_OBJECT DeviceObject,
IN UCHAR Request,
IN USHORT Value,
IN USHORT Index,
PVOID ioBuffer
)
{
NTSTATUS ntStatus;
PURB urb;
urb = ExAllocatePool(NonPagedPool, sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST));
if (urb)
{
UsbBuildVendorRequest(urb,
URB_FUNCTION_VENDOR_ENDPOINT,
sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST),
(USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK),
0, // Reserved Bits
Request, // Request
Value, // Value
Index, // Index
ioBuffer, // Transfer Buffer
NULL, // TransferBufferMDL OPTIONAL
8, // Transfer Buffer Lenght
NULL); // Link OPTIONAL
ntStatus = IsoUsb_CallUSBD(DeviceObject, urb);
ExFreePool(urb);
return(urb->UrbControlVendorClassRequest.TransferBufferLength);
}
else return(0);
}
ULONG
GetDescriptor(
IN PDEVICE_OBJECT DeviceObject,
IN UCHAR DescriptorType,
IN UCHAR Index,
IN USHORT LanguageId,
PVOID ioBuffer
)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -