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

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? bulkdev.c

?? 全面介紹USB_F320的實(shí)用文章USB_F320
?? C
?? 第 1 頁(yè) / 共 3 頁(yè)
字號(hào):
/*++


Module Name:

    bulkdev.c

Abstract:

    This file contains dispatch routines for create, 
    close and selective suspend. 
    The selective suspend feature is enabled if
    the SSRegistryEnable key in the registry is set to 1.

Environment:

    Kernel mode

Notes:


--*/

#include "bulkusb.h"
#include "bulkpnp.h"
#include "bulkpwr.h"
#include "bulkdev.h"
#include "bulkusr.h"
#include "bulkwmi.h"
#include "bulkrwr.h"

NTSTATUS
BulkUsb_DispatchCreate(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP           Irp
    )
/*++
 
Routine Description:

    Dispatch routine for create.

Arguments:

    DeviceObject - pointer to device object
    Irp - I/O request packet.

Return Value:

    NT status value

--*/
{
    ULONG                       i;
    NTSTATUS                    ntStatus;
    PFILE_OBJECT                fileObject;
    PDEVICE_EXTENSION           deviceExtension;
    PIO_STACK_LOCATION          irpStack;
    PINTUSB_PIPE_CONTEXT       pipeContext;
    PUSBD_INTERFACE_INFORMATION interface;

    PAGED_CODE();

    KdPrint( ("BulkUsb_DispatchCreate - begins\n"));

    //
    // initialize variables
    //
    irpStack = IoGetCurrentIrpStackLocation(Irp);
    fileObject = irpStack->FileObject;
    deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;

    if(deviceExtension->DeviceState != Working) {

        ntStatus = STATUS_INVALID_DEVICE_STATE;
        goto BulkUsb_DispatchCreate_Exit;
    }

    if(deviceExtension->UsbInterface) {

        interface = deviceExtension->UsbInterface;
    }
    else {

        KdPrint( ("UsbInterface not found\n"));

        ntStatus = STATUS_INVALID_DEVICE_STATE;
        goto BulkUsb_DispatchCreate_Exit;
    }

    //
    // FsContext is Null for the device
    //
    if(fileObject) {
        
        fileObject->FsContext = NULL; 
    }
    else {

        ntStatus = STATUS_INVALID_PARAMETER;
        goto BulkUsb_DispatchCreate_Exit;
    }

    if(0 == fileObject->FileName.Length) {

        //
        // opening a device as opposed to pipe.
        //
        ntStatus = STATUS_SUCCESS;

        InterlockedIncrement(&deviceExtension->OpenHandleCount);

        //
        // the device is idle if it has no open handles or pending PnP Irps
        // since we just received an open handle request, cancel idle req.
        //
        if(deviceExtension->SSEnable) {
        
            CancelSelectSuspend(deviceExtension);
        }

        goto BulkUsb_DispatchCreate_Exit;
    }
    
    pipeContext = BulkUsb_PipeWithName(DeviceObject, &fileObject->FileName);

    if(pipeContext == NULL) {

        ntStatus = STATUS_INVALID_PARAMETER;
        goto BulkUsb_DispatchCreate_Exit;
    }

    ntStatus = STATUS_INVALID_PARAMETER;

    for(i=0; i<interface->NumberOfPipes; i++) {

        if(pipeContext == &deviceExtension->PipeContext[i]) {

            //
            // found a match
            //
            KdPrint( ("open pipe %d\n", i));

            fileObject->FsContext = &interface->Pipes[i];
            
            ASSERT(fileObject->FsContext);

            pipeContext->PipeOpen = TRUE;

            ntStatus = STATUS_SUCCESS;

            //
            // increment OpenHandleCounts
            //
            InterlockedIncrement(&deviceExtension->OpenHandleCount);

            //
            // the device is idle if it has no open handles or pending PnP Irps
            // since we just received an open handle request, cancel idle req.
            //
            if(deviceExtension->SSEnable) {

                CancelSelectSuspend(deviceExtension);
            }
        }
    }

BulkUsb_DispatchCreate_Exit:

    Irp->IoStatus.Status = ntStatus;
    Irp->IoStatus.Information = 0;

    IoCompleteRequest(Irp, IO_NO_INCREMENT);

    KdPrint( ("BulkUsb_DispatchCreate - ends\n"));
    
    return ntStatus;
}

NTSTATUS
BulkUsb_DispatchClose(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP           Irp
    )
/*++
 
Routine Description:

    Dispatch routine for close.

Arguments:

    DeviceObject - pointer to device object
    Irp - I/O request packet

Return Value:

    NT status value

--*/
{
    NTSTATUS               ntStatus;
    PFILE_OBJECT           fileObject;
    PDEVICE_EXTENSION      deviceExtension;
    PIO_STACK_LOCATION     irpStack;
    PINTUSB_PIPE_CONTEXT  pipeContext;
    PUSBD_PIPE_INFORMATION pipeInformation;
    
    PAGED_CODE();

    //
    // initialize variables
    //
    irpStack = IoGetCurrentIrpStackLocation(Irp);
    fileObject = irpStack->FileObject;
    pipeContext = NULL;
    pipeInformation = NULL;
    deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;

    KdPrint( ("BulkUsb_DispatchClose - begins\n"));

    if(fileObject && fileObject->FsContext) {

        pipeInformation = fileObject->FsContext;

        if(0 != fileObject->FileName.Length) {

            pipeContext = BulkUsb_PipeWithName(DeviceObject, 
                                               &fileObject->FileName);
        }

        if(pipeContext && pipeContext->PipeOpen) {
            
            pipeContext->PipeOpen = FALSE;
        }
    }

    //
    // set ntStatus to STATUS_SUCCESS 
    //
    ntStatus = STATUS_SUCCESS;

    Irp->IoStatus.Status = ntStatus;
    Irp->IoStatus.Information = 0;

    IoCompleteRequest(Irp, IO_NO_INCREMENT);

    InterlockedDecrement(&deviceExtension->OpenHandleCount);

    KdPrint( ("BulkUsb_DispatchClose - ends\n"));

    return ntStatus;
}

NTSTATUS
BulkUsb_DispatchDevCtrl(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    )
/*++
 
Routine Description:

    Dispatch routine for IRP_MJ_DEVICE_CONTROL

Arguments:

    DeviceObject - pointer to device object
    Irp - I/O request packet

Return Value:

    NT status value

--*/
{
    ULONG              code;
    PVOID              ioBuffer;
	ULONG              inputBufferLength;
    ULONG              outputBufferLength;
    ULONG              info;
    NTSTATUS           ntStatus;
    PDEVICE_EXTENSION  deviceExtension;
    PIO_STACK_LOCATION irpStack;
	UCHAR              localBuffer[12];
	

    //
    // initialize variables
    //
    info = 0;
    irpStack = IoGetCurrentIrpStackLocation(Irp);
    code = irpStack->Parameters.DeviceIoControl.IoControlCode;
    deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;

    ioBuffer           = Irp->AssociatedIrp.SystemBuffer;
    inputBufferLength  = irpStack->Parameters.DeviceIoControl.InputBufferLength;
    outputBufferLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
	
    if(deviceExtension->DeviceState != Working) {

        KdPrint( ("Invalid device state\n"));

        Irp->IoStatus.Status = ntStatus = STATUS_INVALID_DEVICE_STATE;
        Irp->IoStatus.Information = info;

        IoCompleteRequest(Irp, IO_NO_INCREMENT);
        return ntStatus;
    }

    KdPrint( ("BulkUsb_DispatchDevCtrl::"));
    BulkUsb_IoIncrement(deviceExtension);

    //
    // It is true that the client driver cancelled the selective suspend
    // request in the dispatch routine for create.
    // But there is no guarantee that it has indeed been completed.
    // so wait on the NoIdleReqPendEvent and proceed only if this event
    // is signaled.
    //
    KdPrint( ("Waiting on the IdleReqPendEvent\n"));
    
    //
    // make sure that the selective suspend request has been completed.
    //

    if(deviceExtension->SSEnable) {

        KeWaitForSingleObject(&deviceExtension->NoIdleReqPendEvent, 
                              Executive, 
                              KernelMode, 
                              FALSE, 
                              NULL);
    }

    switch(code) {
	
	case IOCTL_INTUSB_RESET_PIPE:
    {
        PFILE_OBJECT           fileObject;
        PUSBD_PIPE_INFORMATION pipe;

        pipe = NULL;
        fileObject = NULL;

        //
        // FileObject is the address of the kernel file object to
        // which the IRP is directed. Drivers use the FileObject
        // to correlate IRPs in a queue.
        //
        fileObject = irpStack->FileObject;

        if(fileObject == NULL) {

            ntStatus = STATUS_INVALID_PARAMETER;

            break;
        }

        pipe = (PUSBD_PIPE_INFORMATION) fileObject->FsContext;

        if(pipe == NULL) {

            ntStatus = STATUS_INVALID_PARAMETER;
        }
        else {
            
            ntStatus = BulkUsb_ResetPipe(DeviceObject, pipe);
        }

        break;
    }

    case IOCTL_INTUSB_GET_CONFIG_DESCRIPTOR:
    {
        ULONG length;

        if(deviceExtension->UsbConfigurationDescriptor) {

            length = deviceExtension->UsbConfigurationDescriptor->wTotalLength;

            if(outputBufferLength >= length) {

                RtlCopyMemory(ioBuffer,
                              deviceExtension->UsbConfigurationDescriptor,
                              length);

                info = length;

                ntStatus = STATUS_SUCCESS;
            }
            else {
                
                ntStatus = STATUS_BUFFER_TOO_SMALL;
            }
        }
        else {
            
            ntStatus = STATUS_UNSUCCESSFUL;
        }

        break;
    }

    case IOCTL_INTUSB_RESET_DEVICE:
        
        ntStatus = BulkUsb_ResetDevice(DeviceObject);

        break;

    default :

        ntStatus = STATUS_INVALID_DEVICE_REQUEST;

        break;
    }

    Irp->IoStatus.Status = ntStatus;
    Irp->IoStatus.Information = info;

    IoCompleteRequest(Irp, IO_NO_INCREMENT);

    KdPrint( ("BulkUsb_DispatchDevCtrl::"));
    BulkUsb_IoDecrement(deviceExtension);

    return ntStatus;
}

NTSTATUS
BulkUsb_ResetPipe(
    IN PDEVICE_OBJECT         DeviceObject,
    IN PUSBD_PIPE_INFORMATION PipeInfo
    )
/*++
 
Routine Description:

    This routine synchronously submits a URB_FUNCTION_RESET_PIPE
    request down the stack.

Arguments:

    DeviceObject - pointer to device object
    PipeInfo - pointer to PipeInformation structure
               to retrieve the pipe handle

Return Value:

    NT status value

--*/
{
    PURB              urb;
    NTSTATUS          ntStatus;
    PDEVICE_EXTENSION deviceExtension;

    //
    // initialize variables
    //

    urb = NULL;
    deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;


    urb = ExAllocatePool(NonPagedPool, 
                         sizeof(struct _URB_PIPE_REQUEST));

    if(urb) {

        urb->UrbHeader.Length = (USHORT) sizeof(struct _URB_PIPE_REQUEST);
        urb->UrbHeader.Function = URB_FUNCTION_RESET_PIPE;
        urb->UrbPipeRequest.PipeHandle = PipeInfo->PipeHandle;

        ntStatus = CallUSBD(DeviceObject, urb);

        ExFreePool(urb);
    }
    else {

        ntStatus = STATUS_INSUFFICIENT_RESOURCES;
    }

    if(NT_SUCCESS(ntStatus)) {
    
        KdPrint( ("BulkUsb_ResetPipe - success\n"));
        ntStatus = STATUS_SUCCESS;
    }

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区三区视频在线播放| 国产精品综合二区| 狠狠色丁香婷综合久久| 色婷婷一区二区| 国产喂奶挤奶一区二区三区| 五月天视频一区| 99久久综合精品| 久久夜色精品国产欧美乱极品| 亚洲在线视频免费观看| 国产成人av福利| 久久综合国产精品| 日韩成人一级片| 欧美日韩电影一区| 亚洲午夜激情av| 日本韩国欧美一区| 国产精品久久夜| 成人免费毛片aaaaa**| 欧美xxxx在线观看| 午夜视频一区二区三区| 色婷婷综合久久久久中文一区二区| 久久亚洲精华国产精华液 | 国产日韩av一区| 麻豆极品一区二区三区| 欧美天堂一区二区三区| 亚洲欧美日韩中文字幕一区二区三区| 蜜桃精品视频在线| 日韩一区二区三区在线| 视频一区在线视频| 91精品国产综合久久久久久漫画| 亚洲国产欧美日韩另类综合| 欧美性一二三区| 亚洲成人免费av| 69堂国产成人免费视频| 日韩精品乱码免费| 欧美一级一区二区| 奇米亚洲午夜久久精品| 91精品久久久久久久久99蜜臂| 亚洲妇女屁股眼交7| 欧美日韩国产成人在线91| 亚洲成人一区在线| 欧美一区二区免费| 日韩精品福利网| 欧美日韩不卡一区二区| 日韩电影免费在线观看网站| 91精品国产手机| 久久99最新地址| 久久久久久免费毛片精品| 粉嫩13p一区二区三区| 1区2区3区欧美| 色美美综合视频| 午夜成人免费电影| 日韩精品在线网站| 成人中文字幕电影| 一个色妞综合视频在线观看| 在线免费视频一区二区| 国产麻豆精品久久一二三| 久久久精品国产99久久精品芒果| 不卡电影一区二区三区| 亚洲国产裸拍裸体视频在线观看乱了| 欧美一区二区视频在线观看2022| 国产在线不卡一区| 一区二区久久久久久| 欧美一区二区播放| 91香蕉视频黄| 免费在线看成人av| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 欧美日韩国产经典色站一区二区三区 | 亚洲色图视频网站| 正在播放一区二区| 成人永久aaa| 图片区日韩欧美亚洲| 国产精品亲子伦对白| 欧美日韩一区二区三区四区| 国产盗摄女厕一区二区三区| 午夜精品久久久久久久久久久| 国产日韩欧美高清在线| 91精品国产综合久久小美女| 91视频精品在这里| 国产麻豆精品在线| 日本va欧美va精品| 亚洲精品国产一区二区三区四区在线| 欧美一区二区三区的| 色国产综合视频| 成人午夜视频免费看| 美国欧美日韩国产在线播放| 玉足女爽爽91| 中文字幕一区在线观看| 欧美精品一区在线观看| 欧美日韩你懂得| 一本到不卡免费一区二区| 国产+成+人+亚洲欧洲自线| 奇米一区二区三区| 日日嗨av一区二区三区四区| 一区二区三区在线观看国产 | 成人av电影免费观看| 毛片基地黄久久久久久天堂| 亚洲国产日韩精品| 一卡二卡三卡日韩欧美| 国产精品乱码一区二区三区软件| 精品88久久久久88久久久| 制服丝袜av成人在线看| 欧美猛男男办公室激情| 欧美日韩黄色影视| 欧美亚洲自拍偷拍| 色天天综合久久久久综合片| 91日韩精品一区| 99久久精品国产网站| 99久久精品国产精品久久| 成人h动漫精品一区二| 成人小视频在线| 99久久久精品免费观看国产蜜| 成人午夜免费视频| av不卡一区二区三区| 99视频一区二区三区| 91丨porny丨国产入口| 91网站在线播放| 91久久奴性调教| 欧美手机在线视频| 69堂精品视频| 亚洲精品在线一区二区| 久久亚洲精品小早川怜子| 国产日韩v精品一区二区| 国产精品欧美精品| 一区二区三区四区在线免费观看 | 国产老肥熟一区二区三区| 国产另类ts人妖一区二区| 粉嫩蜜臀av国产精品网站| av不卡在线播放| 日本精品一区二区三区高清| 欧美日韩第一区日日骚| 精品国产91乱码一区二区三区| 久久视频一区二区| 亚洲视频在线一区二区| 亚洲午夜激情网页| 国产一区二区三区高清播放| 不卡视频一二三| 欧美久久一二区| 久久中文字幕电影| 亚洲免费在线观看视频| 日本美女一区二区| 国产精品18久久久久久久网站| 99re亚洲国产精品| 91精品国产综合久久精品麻豆| 久久免费电影网| 伊人性伊人情综合网| 美女在线观看视频一区二区| 高清不卡一区二区在线| 欧美日韩黄色一区二区| 久久精品视频免费| 亚洲成年人影院| 成人在线一区二区三区| 7777精品伊人久久久大香线蕉| 国产嫩草影院久久久久| 午夜精品福利视频网站| 国产成人高清在线| 4438x成人网最大色成网站| 国产精品少妇自拍| 美腿丝袜亚洲三区| 欧美在线一二三| 国产欧美日韩视频一区二区| 亚洲chinese男男1069| 成人国产精品免费观看| 欧美一区二区在线播放| 亚洲精品国产一区二区精华液| 国内不卡的二区三区中文字幕 | 成+人+亚洲+综合天堂| 91麻豆精品国产91久久久使用方法 | 精品视频资源站| 最新中文字幕一区二区三区| 毛片不卡一区二区| 欧美网站一区二区| 自拍偷拍国产精品| 国产一区二区h| 欧美怡红院视频| 亚洲欧洲日韩一区二区三区| 韩国毛片一区二区三区| 69av一区二区三区| 亚洲一区二区三区影院| 97成人超碰视| 中文字幕二三区不卡| 久久99精品久久久久久动态图 | 欧美无砖砖区免费| 亚洲手机成人高清视频| 国产91对白在线观看九色| 欧美不卡一区二区三区| 日本中文字幕不卡| 欧美精品丝袜中出| 午夜精品久久久久久不卡8050| 一本色道久久综合狠狠躁的推荐| 国产精品久久久久久久第一福利| 国产一区二区三区免费播放| 欧美变态tickle挠乳网站| 六月丁香综合在线视频| 日韩欧美国产综合在线一区二区三区| 亚洲成a人片在线不卡一二三区| 91网址在线看| 一区二区三区电影在线播| 91免费国产在线| 亚洲男人的天堂在线观看| 日本高清免费不卡视频|