⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ioctliso.c

📁 Cypress USB Windows 驱动源代码,编写USB驱动参考及其有用
💻 C
📖 第 1 页 / 共 2 页
字号:
/*++

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 + -