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

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

?? ioctliso.c

?? s3c2440開發板的usb驅動程序經過測試完全適用
?? 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"



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

--*/
{
    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;

    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;

    ioControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;

    //
    // Handle Ioctls from User mode
    //

    switch (ioControlCode) {

    case IOCTL_ISOUSB_RESET_PIPE:
        {
            PUSBD_PIPE_INFORMATION pipe;
	        PFILE_OBJECT fileObject;

		    // get our context and see if it is a pipe
	        fileObject = irpStack->FileObject;

		    pipe = (PUSBD_PIPE_INFORMATION) fileObject->FsContext;    

		    if(pipe == NULL) {
			    // error, this is not a pipe
	            ntStatus =
		            Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
		    } else {            
                IsoUsb_ResetPipe(DeviceObject, pipe, FALSE );
            
                ntStatus = Irp->IoStatus.Status = STATUS_SUCCESS;
            }
        }
        break;


     case IOCTL_ISOUSB_GET_CONFIG_DESCRIPTOR:

        //
        // This api returns a copy of the configuration descriptor
        // and all endpoint/interface descriptors.
        //

        //
        // inputs  - none
        // outputs - configuration descriptor plus interface
        //          and endpoint descriptors
        //

        pch = (PUCHAR) ioBuffer;

        configurationDescriptor =
            deviceExtension->UsbConfigurationDescriptor;

        if (configurationDescriptor) {
            
            length = configurationDescriptor->wTotalLength;

            if ( outputBufferLength < length ) { // make sure caller has big enough buffer to receive
                Irp->IoStatus.Information = 0;

                ntStatus = Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
            }
            else {
                RtlCopyMemory(pch,
                              (PUCHAR) configurationDescriptor,
                              length);

                Irp->IoStatus.Information = length;

                ntStatus = Irp->IoStatus.Status = STATUS_SUCCESS;
            }
        }
        else {

            Irp->IoStatus.Information = 0;

            ntStatus = Irp->IoStatus.Status = STATUS_DEVICE_DATA_ERROR;
        }

        break;

     case IOCTL_ISOUSB_START_ISO_STREAM:

		ntStatus = IsoUsb_StartIsoStream(DeviceObject, Irp);
        break;

    case IOCTL_ISOUSB_STOP_ISO_STREAM:

		ntStatus = IsoUsb_StopIsoStream(DeviceObject,
                        *((PVOID *) ioBuffer), // a PISOUSB_STREAM_OBJECT passed as a blind ptr input buff from user mode
                        Irp);
        break;


     case IOCTL_ISOUSB_RESET_DEVICE:
        
		ntStatus = IsoUsb_ResetDevice( DeviceObject );
        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一区二区三区免费野_久草精品视频
7777精品伊人久久久大香线蕉完整版 | 国产一区二区三区在线观看免费| 中文子幕无线码一区tr| 欧美性xxxxx极品少妇| 高清在线不卡av| 蜜桃久久精品一区二区| 亚洲另类在线一区| 国产精品无码永久免费888| 欧美一三区三区四区免费在线看 | 无码av免费一区二区三区试看| 久久久www成人免费无遮挡大片| 欧美日韩视频在线第一区 | 另类小说一区二区三区| 一区二区三区欧美视频| 国产精品久久久久桃色tv| 久久综合色天天久久综合图片| 欧美亚洲国产一卡| 91在线你懂得| 成人免费的视频| 国产99久久久久久免费看农村| 男人的天堂久久精品| 亚洲午夜精品17c| 亚洲人成人一区二区在线观看 | 一区二区欧美精品| 最新国产精品久久精品| 欧美国产日韩在线观看| 久久一日本道色综合| 精品国产乱码久久久久久久| 欧美一区二区三区小说| 欧美日韩国产区一| 欧美日韩成人高清| 欧美午夜在线一二页| 欧美在线视频不卡| 欧美亚洲禁片免费| 欧美日韩久久久久久| 欧美精品黑人性xxxx| 欧美曰成人黄网| 欧美日韩综合色| 欧美日韩美少妇| 337p亚洲精品色噜噜| 91精品国产aⅴ一区二区| 91精品国产综合久久小美女| 3751色影院一区二区三区| 91精品一区二区三区在线观看| 91精品国产综合久久香蕉的特点| 欧美精品日韩综合在线| 日韩美女天天操| 久久久噜噜噜久久中文字幕色伊伊| 久久久综合九色合综国产精品| 国产女人aaa级久久久级| 国产精品免费av| 亚洲欧美日韩久久| 天堂一区二区在线| 美美哒免费高清在线观看视频一区二区| 日韩国产一二三区| 国产一区二区三区美女| 成人做爰69片免费看网站| 色一情一伦一子一伦一区| 欧美日韩五月天| 欧美精品一区二区三区久久久 | 日产欧产美韩系列久久99| 欧美aaaaa成人免费观看视频| 九色综合狠狠综合久久| 国产99久久精品| 91国模大尺度私拍在线视频| 欧美疯狂做受xxxx富婆| 久久品道一品道久久精品| 成人免费一区二区三区视频| 亚洲一二三级电影| 九九在线精品视频| 91在线视频网址| 91精品福利在线一区二区三区 | 日韩亚洲欧美在线观看| 国产欧美日韩三级| 一区二区三区欧美视频| 激情伊人五月天久久综合| 成人97人人超碰人人99| 欧美丰满美乳xxx高潮www| 国产亚洲欧美激情| 亚洲自拍偷拍网站| 国产精华液一区二区三区| 日本国产一区二区| 精品国精品国产| 一区二区三区**美女毛片| 国产一区二区三区四区在线观看| 色天天综合色天天久久| 久久蜜臀精品av| 亚洲第一成年网| 成人av网站在线观看| 56国语精品自产拍在线观看| 中文字幕欧美国产| 美女视频第一区二区三区免费观看网站 | 美国一区二区三区在线播放| 成人a区在线观看| 欧美成人aa大片| 亚洲国产欧美日韩另类综合| 国产精品影音先锋| 在线播放日韩导航| 亚洲视频在线观看一区| 国产精品白丝jk黑袜喷水| 宅男在线国产精品| 亚洲精品久久久久久国产精华液| 国产一区二区三区久久悠悠色av| 欧美人与禽zozo性伦| 亚洲欧美日韩国产综合在线| 国内精品嫩模私拍在线| 日韩一区二区三区四区| 亚洲第一福利视频在线| 91丨porny丨中文| 国产欧美一二三区| 久久99久久久欧美国产| 欧美一卡2卡三卡4卡5免费| 亚洲一区在线观看免费 | 欧美另类久久久品| 亚洲欧美日韩中文播放| 福利91精品一区二区三区| 日韩精品一区二区在线| 天天亚洲美女在线视频| 欧美午夜理伦三级在线观看| 中文字幕在线观看一区二区| 粉嫩高潮美女一区二区三区| 欧美精品一区二区三区蜜臀| 捆绑调教一区二区三区| 911精品国产一区二区在线| 性做久久久久久免费观看 | 欧美欧美欧美欧美| 亚洲一区二区在线免费看| 91搞黄在线观看| 亚洲午夜在线视频| 欧美日韩亚洲另类| 丝袜诱惑制服诱惑色一区在线观看 | 青青草国产成人99久久| 91精品国产综合久久久久| 午夜精品成人在线| 宅男噜噜噜66一区二区66| 美女视频一区二区| 精品国产乱子伦一区| 国产在线视视频有精品| 久久综合久久综合九色| 国产麻豆欧美日韩一区| 国产精品网曝门| 色噜噜偷拍精品综合在线| 一区二区三区视频在线观看| 欧美日韩亚洲另类| 蜜桃视频免费观看一区| 久久亚洲精华国产精华液| 国产成人在线视频播放| 亚洲人成精品久久久久| 欧美无砖砖区免费| 奇米色777欧美一区二区| 日韩欧美三级在线| 成人一级片在线观看| 日韩一区欧美一区| 欧美吞精做爰啪啪高潮| 免费在线观看不卡| 久久久久久亚洲综合| 成人av动漫网站| 亚洲国产成人av| 精品国产一区二区三区忘忧草 | 欧美激情综合五月色丁香| 99久久99久久精品免费看蜜桃| 一区二区在线看| 欧美电影免费观看完整版| 国产suv一区二区三区88区| 18成人在线视频| 欧美日韩免费一区二区三区| 精品一区二区免费| 亚洲欧洲日韩一区二区三区| 欧美日韩电影一区| 国产精品99久久久久久宅男| 一区二区三区蜜桃网| 精品三级在线观看| 99久久婷婷国产综合精品 | 麻豆精品视频在线观看| 国产精品嫩草影院com| 欧美日韩国产色站一区二区三区| 国产麻豆成人传媒免费观看| 亚洲精品国产a| 亚洲精品一区二区三区精华液| 91色九色蝌蚪| 久久国产剧场电影| 亚洲欧美日韩国产另类专区| 欧美岛国在线观看| 91黄色免费版| 国产乱人伦精品一区二区在线观看 | 欧美久久高跟鞋激| 成年人国产精品| 麻豆国产91在线播放| 怡红院av一区二区三区| 久久久三级国产网站| 在线不卡一区二区| 色综合亚洲欧洲| 韩国av一区二区三区四区| 亚洲综合丝袜美腿| 国产精品久久久久久亚洲伦| 日韩欧美国产午夜精品| 欧美日韩国产大片| 色哟哟亚洲精品| 大胆欧美人体老妇| 黄页网站大全一区二区|