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

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

?? ioctlblk.c

?? 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一区二区三区免费野_久草精品视频
日韩免费成人网| 国产精品免费视频一区| 一区在线中文字幕| 国产91在线观看| 国产视频一区不卡| 成人综合日日夜夜| 日韩毛片一二三区| 91亚洲精品一区二区乱码| 亚洲视频一区二区在线| 国产91精品精华液一区二区三区| 91免费看片在线观看| 亚洲日本在线观看| 欧美色倩网站大全免费| 亚洲午夜久久久久久久久电影网 | 欧美人成免费网站| 丝袜美腿高跟呻吟高潮一区| 日韩视频免费直播| 国产 欧美在线| 亚洲男同1069视频| 欧美一区二区三区婷婷月色| 久久综合一区二区| 国产91精品入口| 一区二区三区资源| 日韩一区国产二区欧美三区| 国产suv一区二区三区88区| 国产精品福利一区二区三区| 欧美影视一区在线| 国产精品中文欧美| 亚洲精品菠萝久久久久久久| 日韩欧美一级特黄在线播放| 成人免费看片app下载| 亚洲va中文字幕| 久久精品国产第一区二区三区| 欧美大尺度电影在线| 成人h版在线观看| 无码av免费一区二区三区试看| 欧美成人a在线| 一本到不卡精品视频在线观看| 美腿丝袜一区二区三区| 成人欧美一区二区三区白人 | 国产成人在线网站| 久久综合久久综合亚洲| 日日欢夜夜爽一区| 精品国产91亚洲一区二区三区婷婷 | 成人一级视频在线观看| 日韩精品欧美精品| 18欧美亚洲精品| 久久一区二区三区国产精品| 欧美体内she精视频| 高清久久久久久| 久久精品国产免费看久久精品| 亚洲一区二区三区在线看| 亚洲国产精品黑人久久久| 亚洲精品视频自拍| 亚洲精品水蜜桃| 国产免费观看久久| 日韩欧美二区三区| 欧美中文字幕亚洲一区二区va在线| 国产一区二区三区免费在线观看| 亚洲一区二区三区四区五区黄 | 亚洲v日本v欧美v久久精品| 国产精品麻豆欧美日韩ww| 精品免费一区二区三区| 欧美日韩国产首页在线观看| 99久久婷婷国产综合精品| 国内精品在线播放| 秋霞电影网一区二区| 亚洲午夜激情av| 亚洲美女区一区| 自拍av一区二区三区| 国产精品激情偷乱一区二区∴| 久久久久九九视频| 欧美成人欧美edvon| 日韩一区二区三区在线视频| 欧美日韩情趣电影| 欧美日韩激情一区| 欧美日韩精品免费| 欧美麻豆精品久久久久久| 欧美日韩一区小说| 欧美日韩一区视频| 91精品国产一区二区| 欧美日韩一区二区三区在线| 色乱码一区二区三区88| 丁香亚洲综合激情啪啪综合| 成人丝袜视频网| 成人网页在线观看| 波多野结衣中文字幕一区| 不卡视频在线看| 91蝌蚪porny九色| 91麻豆国产在线观看| 在线观看日韩电影| 欧美日本一区二区三区| 欧美日韩国产一级二级| 欧美日韩视频在线观看一区二区三区| 欧美午夜精品一区二区三区| 在线精品视频一区二区| 欧美日韩精品二区第二页| 欧美三级韩国三级日本一级| 国产麻豆91精品| 成人一道本在线| 99精品视频在线观看免费| 午夜电影一区二区三区| 久久久精品天堂| 久久蜜桃av一区精品变态类天堂 | 91免费版pro下载短视频| 欧洲av在线精品| 日韩一区二区三区观看| 久久久久高清精品| 亚洲色图在线播放| 五月天亚洲精品| 国产麻豆视频一区| 91麻豆产精品久久久久久| av在线不卡电影| 国产精品一二三在| 91美女片黄在线| 日韩欧美国产三级| 亚洲欧洲日韩一区二区三区| 亚洲高清免费观看高清完整版在线观看| 天天操天天干天天综合网| 精品无码三级在线观看视频| 成人国产亚洲欧美成人综合网| 欧美这里有精品| 久久噜噜亚洲综合| 亚洲免费观看视频| 老司机精品视频线观看86| 92国产精品观看| 欧美成人三级电影在线| 欧美福利视频导航| 中文字幕免费观看一区| 日韩中文字幕亚洲一区二区va在线 | 色婷婷av一区二区三区大白胸| 6080国产精品一区二区| 国产精品第四页| 久久精品免费观看| 一本到一区二区三区| 久久精品网站免费观看| 天堂蜜桃91精品| 99re这里只有精品首页| 欧美xxxx在线观看| 亚洲香蕉伊在人在线观| 国产99精品国产| 亚洲精品在线一区二区| 亚洲第四色夜色| 99久久国产综合精品麻豆| 精品动漫一区二区三区在线观看| 亚洲综合色丁香婷婷六月图片| 国产成人精品一区二区三区四区 | 日本欧美加勒比视频| 一本大道av伊人久久综合| 337p日本欧洲亚洲大胆色噜噜| 亚洲成人av免费| 在线亚洲人成电影网站色www| 国产午夜精品福利| 8x8x8国产精品| 久久久精品tv| 激情小说欧美图片| 91精品国产入口| 日日摸夜夜添夜夜添亚洲女人| 欧美午夜一区二区三区免费大片| 亚洲精品视频观看| 99精品久久免费看蜜臀剧情介绍| 久久久亚洲欧洲日产国码αv| 麻豆视频观看网址久久| 欧美一级在线免费| 日韩影视精彩在线| 欧美日韩小视频| 亚洲成人在线观看视频| 在线视频你懂得一区二区三区| 中文字幕av资源一区| 国产精品白丝jk白祙喷水网站| 欧美精品一区二区三区蜜臀| 99久久免费精品高清特色大片| 国产美女娇喘av呻吟久久| 日韩欧美国产综合一区| 日韩电影在线免费看| 欧美精品欧美精品系列| 亚洲成人激情社区| 精品国产91洋老外米糕| 亚洲欧洲国产日韩| www.在线欧美| 亚洲精品免费一二三区| 91小视频在线观看| 一区二区在线看| 91福利在线看| 丝袜美腿高跟呻吟高潮一区| 日韩一级黄色片| 国产黑丝在线一区二区三区| 日本一区二区免费在线观看视频 | 欧美日韩色综合| 免费在线视频一区| 91精品国产aⅴ一区二区| 蜜桃av一区二区在线观看| 精品sm捆绑视频| 成人短视频下载| 亚洲丰满少妇videoshd| 欧美一级黄色片| 成人在线综合网站| 亚洲综合一区二区精品导航| 在线播放日韩导航| 国产寡妇亲子伦一区二区|