亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? ioctliso.c

?? Appliction => rs232測試 應用程式 Driver => usb to rs232 驅動程式(wdm ddk) DLL => 應用程式 Firmware =&g
?? C
字號:
/*++

Copyright (c) 1997-1998  Microsoft Corporation

Module Name:

   ioctliso.c

Abstract:

    USB device driver for Intel 82930 USB test board.
    IOCTL handlers

Environment:

    kernel mode only

Notes:

  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
  KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
  PURPOSE.

  Copyright (c) 1997-1998 Microsoft Corporation.  All Rights Reserved.


Revision History:

    11/17/97 : created

--*/


#include "wdm.h"
#include "stdarg.h"
#include "stdio.h"


#include "usbdi.h"
#include "usbdlib.h"
#include "Iso82930.h"

#include "IsoUsb.h"
#include "usbdlib.h"



ULONG
VendorCommand(
	IN PDEVICE_OBJECT 	DeviceObject,
        IN UCHAR 		Request,
	IN USHORT 		Value,
	IN USHORT 		Index,
	PVOID			ioBuffer,
	IN ULONG		ioBufferLength
        )
{

	NTSTATUS ntStatus;
	PURB urb;

	if (ioBufferLength>255) ioBufferLength=255;  //hardware support max 255 block size length
	
	urb = (PURB) 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
			      ioBufferLength,	 // Transfer Buffer Lenght	
			      NULL);	 // Link OPTIONAL
        	
	 ntStatus = IsoUsb_CallUSBD(DeviceObject, urb);

	
	 if (NT_SUCCESS(ntStatus))
	  {
	   ULONG ans = urb->UrbControlVendorClassRequest.TransferBufferLength;
           ExFreePool(urb);
	   return(ans);
	  }
	 else
	  {
           ExFreePool(urb);
	   return(0);
	  }
        }
  	else
  	{
  		KdPrint(("Error to alocate\n"));
  		 return(0); 
  	}

}



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


Arguments:

    DeviceObject - pointer to the FDO for this instance of the 82930 device.


Return Value:

    NT status code

--*/
{
   struct {
		  char fncnumber;
		  char param1;
		  char param2;
	  }*IgorbufferOut;
   struct {
		  UCHAR fncnumber;
		  UCHAR param1Lo;
		  UCHAR param1Hi;
		  UCHAR param2Lo;
		  UCHAR param2Hi;		  
	  }*IgorbufferOutLong;
	  
    PIO_STACK_LOCATION irpStack;
    PVOID ioBuffer;
    ULONG inputBufferLength;
    ULONG outputBufferLength;
    PDEVICE_EXTENSION deviceExtension;
    ULONG ioControlCode;
    NTSTATUS ntStatus;
    ULONG length;
    PUCHAR pch;
    PUSB_CONFIGURATION_DESCRIPTOR configurationDescriptor;
    unsigned short param1;
    unsigned short param2;

    ISOUSB_KdPrint( DBGLVL_DEFAULT,("IRP_MJ_DEVICE_CONTROL\n"));

    IsoUsb_IncrementIoCount(DeviceObject);

    //
    // Get a pointer to the current location in the Irp. This is where
    //     the function codes and parameters are located.
    //

    deviceExtension = DeviceObject->DeviceExtension;
    

    // Can't accept a new io request if:
    //  1) device is removed, 
    //  2) has never been started, 
    //  3) is stopped,
    //  4) has a remove request pending,
    //  5) has a stop device pending
    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;

    // get pointers and lengths of the caller's (user's) IO buffer
    ioBuffer           = Irp->AssociatedIrp.SystemBuffer;
    inputBufferLength  = irpStack->Parameters.DeviceIoControl.InputBufferLength;
    outputBufferLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
    KdPrint(("inputBufferLength = %d , outputBufferLength = %d \n",inputBufferLength,outputBufferLength));

    ioControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;

    //
    // Handle Ioctls from User mode
    //
    
    IgorbufferOut = ioBuffer;
    IgorbufferOutLong = ioBuffer;

    switch (ioControlCode) {
    case 8:
            if (inputBufferLength<3)
              {
                ntStatus = Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
                break;
              }
	    KdPrint(("Function8 number %d call with param1= %d and param2= %d\n",IgorbufferOut->fncnumber,IgorbufferOut->param1,IgorbufferOut->param2));
	    length = VendorCommand(DeviceObject,
	    			   IgorbufferOut->fncnumber,
	    			   IgorbufferOut->param1,
	    			   IgorbufferOut->param2,
	    			   ioBuffer,
	    			   outputBufferLength);
            Irp->IoStatus.Information = length;
            Irp->IoStatus.Status = STATUS_SUCCESS;
            ntStatus = STATUS_SUCCESS;
            KdPrint(("Length= %d\n",length));
	break;	
    case 0x800+8:
            if (inputBufferLength<5)
              {
                ntStatus = Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
                break;
              }    
            param1= IgorbufferOutLong->param1Hi;
            param1<<=8;
            param1|=IgorbufferOutLong->param1Lo;
            param2= IgorbufferOutLong->param2Hi;
            param2<<=8;
            param2|=IgorbufferOutLong->param2Lo;
            
	    KdPrint(("FunctionLong number %d call with param1= %d and param2= %d\n",IgorbufferOutLong->fncnumber,param1,param2));
	    length = VendorCommand(DeviceObject,
	    			   IgorbufferOutLong->fncnumber,
	    			   param1,
	    			   param2,
	    			   ioBuffer,
	    			   outputBufferLength);
            Irp->IoStatus.Information = length;
            Irp->IoStatus.Status = STATUS_SUCCESS;
            ntStatus = STATUS_SUCCESS;
            KdPrint(("Length= %d\n",length));
	break;		
    default:
        ntStatus =
            Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
    }

    IoCompleteRequest (Irp,
                       IO_NO_INCREMENT
                       );

    IsoUsb_DecrementIoCount(DeviceObject);                       

    return ntStatus;

}




NTSTATUS
IsoUsb_ResetDevice(
    IN PDEVICE_OBJECT DeviceObject
    )
/*++

Routine Description:
	Checks port status; if OK, return success and  do no more;
	If bad, attempt reset

Arguments:

    DeviceObject - pointer to the device object for this instance of the 82930
                    device.


Return Value:

    NT status code

--*/
{
    NTSTATUS ntStatus;
    ULONG portStatus;

    ISOUSB_KdPrint(DBGLVL_MEDIUM,("Enter IsoUsb_ResetDevice()\n"));
    
    //
    // Check the port state, if it is disabled we will need 
    // to re-enable it
    //
    ntStatus = IsoUsb_GetPortStatus(DeviceObject, &portStatus);

    if (NT_SUCCESS(ntStatus) && !(portStatus & USBD_PORT_ENABLED) &&
        portStatus & USBD_PORT_CONNECTED) {
        //
        // port is disabled, attempt reset
        //
		ISOUSB_KdPrint( DBGLVL_DEFAULT,("IsoUsb_ResetDevice() will reset\n"));
        ntStatus = IsoUsb_ResetParentPort(DeviceObject);
    }
	return ntStatus;
}



NTSTATUS
IsoUsb_GetPortStatus(
    IN PDEVICE_OBJECT DeviceObject,
    IN PULONG PortStatus
    )
/*++

Routine Description:

    returns the port status for our device

Arguments:

Return Value:

    STATUS_SUCCESS if successful,
    STATUS_UNSUCCESSFUL otherwise

--*/
{
    NTSTATUS ntStatus, status = STATUS_SUCCESS;
    PIRP irp;
    KEVENT event;
    IO_STATUS_BLOCK ioStatus;
    PIO_STACK_LOCATION nextStack;
    PDEVICE_EXTENSION deviceExtension;

    ISOUSB_KdPrint( DBGLVL_DEFAULT,("enter IsoUsb_GetPortStatus\n"));

    deviceExtension = DeviceObject->DeviceExtension;

    *PortStatus = 0;

    //
    // issue a synchronous request
    //

    KeInitializeEvent(&event, NotificationEvent, FALSE);

    // IoBuildDeviceIoControlRequest allocates and sets up an IRP for a device control request
    irp = IoBuildDeviceIoControlRequest(
                IOCTL_INTERNAL_USB_GET_PORT_STATUS,
                deviceExtension->TopOfStackDeviceObject, //next-lower driver's device object, representing the target device.
                NULL, // no input or output buffers
                0,
                NULL,
                0,
                TRUE, // internal ( use IRP_MJ_INTERNAL_DEVICE_CONTROL )
                &event, // event to be signalled on completion ( we wait for it below )
                &ioStatus);

    //
    // Call the class driver to perform the operation.  If the returned status
    // is PENDING, wait for the request to complete.
    //

    // IoGetNextIrpStackLocation gives a higher level driver access to the next-lower 
    // driver's I/O stack location in an IRP so the caller can set it up for the lower driver.
    nextStack = IoGetNextIrpStackLocation(irp);
    ISOUSB_ASSERT(nextStack != NULL);

    nextStack->Parameters.Others.Argument1 = PortStatus;

    ISOUSB_KdPrint( DBGLVL_DEFAULT,("IsoUsb_GetPortStatus() calling USBD port status api\n"));

    ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject,
                            irp);

    ISOUSB_KdPrint( DBGLVL_DEFAULT,("IsoUsb_GetPortStatus() return from IoCallDriver USBD %x\n", ntStatus));

    if (ntStatus == STATUS_PENDING) {

        ISOUSB_KdPrint( DBGLVL_DEFAULT,("Wait for single object\n"));

        status = KeWaitForSingleObject(
                       &event,
                       Suspended,
                       KernelMode,
                       FALSE,
                       NULL);

        ISOUSB_KdPrint( DBGLVL_DEFAULT,("IsoUsb_GetPortStatus() Wait for single object, returned %x\n", status));
        
    } else {
        ioStatus.Status = ntStatus;
    }

    ISOUSB_KdPrint( DBGLVL_DEFAULT,("IsoUsb_GetPortStatus() Port status = %x\n", *PortStatus));

    //
    // USBD maps the error code for us
    //
    ntStatus = ioStatus.Status;

    ISOUSB_KdPrint( DBGLVL_DEFAULT,("Exit IsoUsb_GetPortStatus (%x)\n", ntStatus));

    return ntStatus;
}


NTSTATUS
IsoUsb_ResetParentPort(
    IN IN PDEVICE_OBJECT DeviceObject
    )
/*++

Routine Description:

    Reset the our parent port

Arguments:

Return Value:

    STATUS_SUCCESS if successful,
    STATUS_UNSUCCESSFUL otherwise

--*/
{
    NTSTATUS ntStatus, status = STATUS_SUCCESS;
    PIRP irp;
    KEVENT event;
    IO_STATUS_BLOCK ioStatus;
    PIO_STACK_LOCATION nextStack;
    PDEVICE_EXTENSION deviceExtension;

    ISOUSB_KdPrint( DBGLVL_HIGH,("enter IsoUsb_ResetParentPort\n"));

    deviceExtension = DeviceObject->DeviceExtension;

    //
    // issue a synchronous request
    //

    KeInitializeEvent(&event, NotificationEvent, FALSE);

    irp = IoBuildDeviceIoControlRequest(
                IOCTL_INTERNAL_USB_RESET_PORT,
                deviceExtension->TopOfStackDeviceObject,
                NULL,
                0,
                NULL,
                0,
                TRUE, // internal ( use IRP_MJ_INTERNAL_DEVICE_CONTROL )
                &event,
                &ioStatus);

    //
    // Call the class driver to perform the operation.  If the returned status
    // is PENDING, wait for the request to complete.
    //

    nextStack = IoGetNextIrpStackLocation(irp);
    ISOUSB_ASSERT(nextStack != NULL);

    ISOUSB_KdPrint( DBGLVL_HIGH,("IsoUsb_ResetParentPort() calling USBD enable port api\n"));

    ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject,
                            irp);
                            
    ISOUSB_KdPrint( DBGLVL_HIGH,("IsoUsb_ResetParentPort() return from IoCallDriver USBD %x\n", ntStatus));

    if (ntStatus == STATUS_PENDING) {

        ISOUSB_KdPrint( DBGLVL_HIGH,("IsoUsb_ResetParentPort() Wait for single object\n"));

        status = KeWaitForSingleObject(
                       &event,
                       Suspended,
                       KernelMode,
                       FALSE,
                       NULL);

        ISOUSB_KdPrint( DBGLVL_HIGH,("IsoUsb_ResetParentPort() Wait for single object, returned %x\n", status));
        
    } else {
        ioStatus.Status = ntStatus;
    }

    //
    // USBD maps the error code for us
    //
    ntStatus = ioStatus.Status;

    ISOUSB_KdPrint( DBGLVL_HIGH,("Exit IsoUsb_ResetPort (%x)\n", ntStatus));

    return ntStatus;
}





?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
93久久精品日日躁夜夜躁欧美| 久久精品国产一区二区三| www.亚洲色图| 综合激情成人伊人| 欧美最猛性xxxxx直播| 午夜国产不卡在线观看视频| 欧美一区二区三区在线观看视频| 蜜臀av在线播放一区二区三区| 日韩欧美色综合| 国产精品69毛片高清亚洲| 亚洲国产激情av| 91激情五月电影| 午夜婷婷国产麻豆精品| 欧美一级国产精品| 国产成人综合在线播放| 最近日韩中文字幕| 91麻豆精品久久久久蜜臀| 久久99久国产精品黄毛片色诱| 国产欧美日韩另类视频免费观看| 色综合中文字幕| 日韩国产高清在线| 国产人妖乱国产精品人妖| 色综合久久综合中文综合网| 亚洲成人在线观看视频| 久久综合精品国产一区二区三区| 成人精品鲁一区一区二区| 亚洲影院免费观看| wwwwww.欧美系列| 色一区在线观看| 激情欧美一区二区三区在线观看| 日韩毛片一二三区| 日韩一级二级三级| 91蝌蚪porny九色| 老司机免费视频一区二区| 亚洲自拍偷拍网站| 精品国产制服丝袜高跟| 一本色道a无线码一区v| 激情综合网av| 午夜欧美电影在线观看| 久久久九九九九| 91精品国产欧美日韩| 成人午夜激情视频| 蜜桃视频在线观看一区二区| 亚洲欧洲在线观看av| 日韩欧美在线一区二区三区| 一本久道久久综合中文字幕| 国内成人自拍视频| 亚洲国产成人91porn| 中文字幕不卡在线观看| 日韩你懂的在线观看| 欧美日韩性生活| 色婷婷亚洲综合| 成人福利视频在线看| 国产美女精品一区二区三区| 丝袜a∨在线一区二区三区不卡| 中文字幕欧美日韩一区| 欧美精品一区二区精品网| 91麻豆精品国产91久久久更新时间 | 国产精品麻豆一区二区| 日韩一区二区在线观看| 欧美日韩国产综合一区二区三区| 97se狠狠狠综合亚洲狠狠| 国产精品一二一区| 美国毛片一区二区三区| 五月综合激情网| 亚洲一区二区三区视频在线| 亚洲天堂成人网| 中文字幕一区二区视频| 日本一区二区免费在线| 久久精品综合网| 精品处破学生在线二十三| 日韩一级完整毛片| 日韩三级免费观看| 日韩一区二区三区三四区视频在线观看 | 国产精品青草综合久久久久99| 亚洲精品视频免费看| 亚洲三级免费电影| 亚洲欧美日韩国产中文在线| 中文字幕制服丝袜成人av| 国产欧美va欧美不卡在线| 国产日产亚洲精品系列| 欧美高清在线一区| 中文成人综合网| 国产精品伦一区| 日韩码欧中文字| 亚洲无线码一区二区三区| 亚洲国产精品一区二区尤物区| 亚洲一区二区三区中文字幕| 午夜av区久久| 国内精品伊人久久久久av影院| 激情综合色综合久久| 国产一区二区三区黄视频 | 亚洲一区二区黄色| 天天色综合天天| 韩国毛片一区二区三区| 国产经典欧美精品| 99精品黄色片免费大全| 在线观看免费一区| 欧美区一区二区三区| 欧美一区二区视频网站| 精品国免费一区二区三区| 久久久久久久久岛国免费| 亚洲欧洲精品天堂一级| 亚洲日本在线a| 日韩精品五月天| 国产精品一区二区三区99| 成人av网站在线| 欧美视频三区在线播放| 欧美电影免费观看高清完整版在线观看 | 日韩免费一区二区| 国产欧美精品一区二区色综合朱莉| 国产精品对白交换视频| 日日夜夜精品视频天天综合网| 精品影院一区二区久久久| 成人午夜av电影| 欧美久久久久中文字幕| 国产人成亚洲第一网站在线播放| 亚洲精品视频在线看| 激情文学综合网| 91福利在线导航| 久久久久久久久蜜桃| 亚洲精品成人精品456| 麻豆视频一区二区| 91麻豆自制传媒国产之光| 日韩一区二区三免费高清| 中文字幕精品—区二区四季| 婷婷综合在线观看| 成人永久aaa| 日韩亚洲欧美成人一区| 亚洲美女免费在线| 国产成人综合在线观看| 91精品国产91久久久久久一区二区| 国产精品免费av| 久久国产综合精品| 欧美私人免费视频| 国产精品理论片在线观看| 日本成人超碰在线观看| 色综合久久综合网97色综合 | 国产日韩v精品一区二区| 午夜视频久久久久久| av高清久久久| 国产亚洲欧美在线| 免费在线观看一区二区三区| 97久久超碰国产精品电影| 久久毛片高清国产| 美女视频黄 久久| 777午夜精品视频在线播放| 亚洲欧美偷拍另类a∨色屁股| 国产激情一区二区三区| 欧美大片顶级少妇| 日韩av中文在线观看| 欧美影视一区在线| 亚洲免费观看在线观看| 成人av免费在线| 中国av一区二区三区| 国产伦精品一区二区三区在线观看| 欧美一区二区成人6969| 午夜av电影一区| 91麻豆精品91久久久久同性| 亚洲一区二区中文在线| 欧美无人高清视频在线观看| 亚洲伦理在线免费看| 91久久精品一区二区二区| 亚洲精品成人少妇| 91官网在线免费观看| 亚洲一卡二卡三卡四卡五卡| 欧美性大战久久| 亚洲高清免费视频| 欧美三区在线视频| 香蕉久久一区二区不卡无毒影院| 欧美私人免费视频| 石原莉奈在线亚洲三区| 88在线观看91蜜桃国自产| 免费一级片91| 精品88久久久久88久久久| 国产真实精品久久二三区| 国产亚洲欧美色| 99热精品一区二区| 一卡二卡三卡日韩欧美| 欧美三级日韩在线| 午夜精品成人在线视频| 欧美一区二区三区四区五区| 久久国产精品第一页| 久久久亚洲国产美女国产盗摄 | 5858s免费视频成人| 免费观看在线综合| 久久精品日产第一区二区三区高清版| 黄色资源网久久资源365| 亚洲国产精品成人综合色在线婷婷 | 日本成人在线网站| 久久影院视频免费| av不卡免费在线观看| 一二三四社区欧美黄| 欧美一区二区三区婷婷月色| 91精品欧美福利在线观看| 免费精品视频在线| 国产精品免费人成网站| 欧美视频中文一区二区三区在线观看| 蜜臀精品一区二区三区在线观看| 久久中文字幕电影|