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

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

?? ioctlblk.c

?? s3c2440開發板的usb驅動程序經過測試完全適用
?? C
字號:
/*++

Copyright (c) 1997-1998  Microsoft Corporation

Module Name:

   ioctlblk.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 "Blk82930.h"

#include "BulkUsb.h"
#include "usbdlib.h"



NTSTATUS
BulkUsb_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;

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

    BulkUsb_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 ( !BulkUsb_CanAcceptIoRequests( DeviceObject ) ) {
        ntStatus = STATUS_DELETE_PENDING;
        Irp->IoStatus.Status = ntStatus;
        Irp->IoStatus.Information = 0;

        IoCompleteRequest( Irp, IO_NO_INCREMENT );

        BulkUsb_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_BULKUSB_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 {            
                BulkUsb_ResetPipe(DeviceObject, pipe );
            
                ntStatus = Irp->IoStatus.Status = STATUS_SUCCESS;
            }
        }
        break;


     case IOCTL_BULKUSB_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) {

                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_INVALID_PARAMETER;
            }    
        }
        else {

            Irp->IoStatus.Information = 0;

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

        break;



     case IOCTL_BULKUSB_RESET_DEVICE:
        
                ntStatus = BulkUsb_ResetDevice( DeviceObject );
        break;               

    default:

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

    IoCompleteRequest (Irp,
                       IO_NO_INCREMENT
                       );

    BulkUsb_DecrementIoCount(DeviceObject);                       

    return ntStatus;

}




NTSTATUS
BulkUsb_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;

    BULKUSB_KdPrint(5,("Enter BulkUsb_ResetDevice()\n"));
    
    //
    // Check the port state, if it is disabled we will need 
    // to re-enable it
    //
    ntStatus = BulkUsb_GetPortStatus(DeviceObject, &portStatus);

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



NTSTATUS
BulkUsb_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;

    BULKUSB_KdPrint( DBGLVL_DEFAULT,("enter BulkUsb_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);
    BULKUSB_ASSERT(nextStack != NULL);

    nextStack->Parameters.Others.Argument1 = PortStatus;

    BULKUSB_KdPrint( DBGLVL_DEFAULT,("BulkUsb_GetPortStatus() calling USBD port status api\n"));

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

    BULKUSB_KdPrint( DBGLVL_DEFAULT,("BulkUsb_GetPortStatus() return from IoCallDriver USBD %x\n", ntStatus));

    if (ntStatus == STATUS_PENDING) {

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

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

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

    BULKUSB_KdPrint( DBGLVL_DEFAULT,("BulkUsb_GetPortStatus() Port status = %x\n", *PortStatus));

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

    BULKUSB_KdPrint( DBGLVL_DEFAULT,("Exit BulkUsb_GetPortStatus (%x)\n", ntStatus));


    return ntStatus;
}


NTSTATUS
BulkUsb_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;

    BULKUSB_KdPrint( DBGLVL_DEFAULT,("enter BulkUsb_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);
    BULKUSB_ASSERT(nextStack != NULL);

    BULKUSB_KdPrint( DBGLVL_DEFAULT,("BulkUsb_ResetParentPort() calling USBD enable port api\n"));

    ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject,
                            irp);
                            
    BULKUSB_KdPrint( DBGLVL_DEFAULT,("BulkUsb_ResetParentPort() return from IoCallDriver USBD %x\n", ntStatus));

    if (ntStatus == STATUS_PENDING) {

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

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

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

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

    BULKUSB_KdPrint( DBGLVL_DEFAULT,("Exit BulkUsb_ResetPort (%x)\n", ntStatus));

    return ntStatus;
}





?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美午夜寂寞影院| k8久久久一区二区三区| 欧美久久高跟鞋激| 亚洲成a人在线观看| 欧美精品一级二级| 老色鬼精品视频在线观看播放| 亚洲精品一区二区三区蜜桃下载 | 欧美日韩色一区| 日韩va亚洲va欧美va久久| 日韩区在线观看| 国产91丝袜在线播放| 中文字幕亚洲综合久久菠萝蜜| 一本色道久久加勒比精品| 亚洲电影激情视频网站| 日韩一二三区视频| 国产麻豆精品久久一二三| 国产精品毛片久久久久久久| 91国偷自产一区二区使用方法| 日韩av电影免费观看高清完整版| 日韩精品一区二区在线观看| 成人免费视频播放| 亚洲国产综合在线| 欧美精品一区二区蜜臀亚洲| a在线播放不卡| 日韩高清在线观看| 欧美国产日韩一二三区| 欧美精品1区2区| 国产成人aaa| 日本中文一区二区三区| 国产日产欧美一区二区三区| 欧美三区在线观看| 粉嫩嫩av羞羞动漫久久久| 亚洲综合色自拍一区| 精品国产乱码久久久久久久| 99riav久久精品riav| 麻豆精品一区二区| 亚洲视频小说图片| 精品国产乱码久久久久久老虎| 在线中文字幕一区| 国产精品99久久久| 蜜臀精品一区二区三区在线观看 | 精品成人一区二区三区| 99国产欧美另类久久久精品| 天天影视色香欲综合网老头| 国产精品久久久久久久浪潮网站| 91精品欧美一区二区三区综合在| 色哟哟亚洲精品| 国产精品羞羞答答xxdd| 日韩黄色免费电影| 亚洲精品视频在线| 国产日韩欧美制服另类| 日韩一区二区在线免费观看| 色激情天天射综合网| 国产成人午夜精品影院观看视频| 五月天精品一区二区三区| 亚洲四区在线观看| 久久久99久久精品欧美| 日韩三级中文字幕| 69堂精品视频| 欧美亚洲一区二区三区四区| 99综合影院在线| 国产.欧美.日韩| 久99久精品视频免费观看| 日日嗨av一区二区三区四区| 亚洲国产一区二区三区 | 一区二区三区美女| 国产精品成人免费| 中文字幕精品三区| 久久久久久久精| 26uuu精品一区二区| 日韩三级视频在线看| 日韩免费福利电影在线观看| 日韩一区二区精品在线观看| 91精品蜜臀在线一区尤物| 欧美视频中文字幕| 欧美日韩免费观看一区二区三区 | 在线观看精品一区| 欧美亚洲国产bt| 欧美在线看片a免费观看| 91成人国产精品| 欧美日韩国产在线播放网站| 欧美色男人天堂| 欧美乱妇20p| 欧美一区二区免费观在线| 欧美一区二区三区公司| 欧美成人一区二区三区| 久久久亚洲精品石原莉奈| 日本一区二区免费在线观看视频 | 日韩三级免费观看| 精品国产区一区| 国产亚洲一区二区三区四区 | 秋霞午夜鲁丝一区二区老狼| 免费亚洲电影在线| 国产伦精一区二区三区| 成人免费看视频| 欧美性受xxxx| 911精品产国品一二三产区| 日韩免费视频一区二区| 国产欧美中文在线| 亚洲欧美一区二区视频| 亚洲自拍偷拍综合| 蜜臀a∨国产成人精品| 国产成人精品综合在线观看| 在线区一区二视频| 欧美一区二区三区免费观看视频| 久久久久综合网| 亚洲精品乱码久久久久| 日韩精品1区2区3区| 国产精品一区二区三区网站| 91老师国产黑色丝袜在线| 欧美理论电影在线| 国产日韩av一区二区| 亚洲国产中文字幕在线视频综合| 欧美aⅴ一区二区三区视频| 国产精品一区二区91| 色妹子一区二区| 日韩一级视频免费观看在线| 中文字幕免费观看一区| 亚洲成人综合视频| 国产精品一二一区| 欧美日韩你懂的| 欧美经典一区二区| 日日夜夜免费精品视频| 高清国产一区二区三区| 欧美日韩一级片网站| 久久精品日产第一区二区三区高清版| 亚洲精品福利视频网站| 国内偷窥港台综合视频在线播放| 色吧成人激情小说| 久久久久久久综合狠狠综合| 一区二区三区四区乱视频| 国产一区视频网站| 欧美精品在线观看一区二区| 亚洲欧美一区二区三区孕妇| 国产真实精品久久二三区| 欧美视频一区二区在线观看| 欧美韩国日本一区| 美女视频黄a大片欧美| 91官网在线观看| 中文av一区特黄| 精品一区二区三区在线播放视频| 在线观看成人免费视频| 国产精品日韩成人| 狠狠色丁香婷婷综合久久片| 精品1区2区3区| 亚洲另类春色校园小说| 国产成人亚洲精品狼色在线| 欧美一级日韩一级| 性感美女久久精品| 色94色欧美sute亚洲线路二| 国产精品国产自产拍在线| 国产美女视频一区| 精品国产凹凸成av人导航| 日韩成人免费看| 欧美一a一片一级一片| 亚洲女同女同女同女同女同69| 国产成人8x视频一区二区| 久久嫩草精品久久久精品一| 久久97超碰色| 精品国产第一区二区三区观看体验| 日韩精品1区2区3区| 91精品欧美综合在线观看最新| 性做久久久久久久免费看| 欧美日本在线播放| 亚洲国产精品综合小说图片区| 色综合色综合色综合| 亚洲欧美激情插| 日本韩国精品在线| 一级日本不卡的影视| 欧美日韩国产中文| 日本午夜一本久久久综合| 日韩亚洲欧美在线| 久久精品国产澳门| 精品国产乱码久久久久久久| 国产精品99久久久久久久vr| 欧美国产日韩a欧美在线观看| 风流少妇一区二区| 国产精品传媒视频| 在线免费观看不卡av| 亚洲国产毛片aaaaa无费看| 欧美日韩国产在线观看| 美女视频黄免费的久久| 精品久久久久久综合日本欧美 | 国产精品996| 国产精品女同互慰在线看| 91丨九色丨蝌蚪丨老版| 依依成人精品视频| 欧美精品高清视频| 国产乱码精品一区二区三| 中文字幕av免费专区久久| 色综合一区二区| 日韩黄色在线观看| 久久精品一区二区| 91免费视频网址| 天天色综合天天| 久久午夜国产精品| 91女厕偷拍女厕偷拍高清| 三级在线观看一区二区| ww久久中文字幕| 一本久久精品一区二区|