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

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

?? bulkdev.c

?? 支持USB2.0 BULK傳輸范例
?? 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一区二区三区免费野_久草精品视频
美日韩黄色大片| 天堂在线一区二区| 99re视频精品| 666欧美在线视频| 国产女同性恋一区二区| 91在线国产福利| 国内精品伊人久久久久av影院| 92国产精品观看| 精品国产乱码久久久久久蜜臀| 亚洲激情中文1区| 国产欧美日本一区视频| 午夜在线电影亚洲一区| 亚洲一区免费观看| 国产999精品久久久久久| 欧美三级蜜桃2在线观看| 久久久久国产精品免费免费搜索| 亚洲最快最全在线视频| 成人免费va视频| 国产亚洲制服色| 这里只有精品视频在线观看| 久久精品夜色噜噜亚洲aⅴ| 日日嗨av一区二区三区四区| 91福利国产成人精品照片| 日本一区二区视频在线| 精品亚洲国内自在自线福利| 日韩免费性生活视频播放| 亚洲午夜久久久| 久久精品人人做人人爽人人 | 国产98色在线|日韩| 一区二区三区国产精品| 99久久精品情趣| 国产精品久久久久一区二区三区共 | 日韩欧美亚洲国产精品字幕久久久| 国产一级精品在线| 欧美精品一区二区三区一线天视频 | 国产激情精品久久久第一区二区| 麻豆国产精品一区二区三区| 国产欧美日韩在线视频| 国产乱妇无码大片在线观看| 2020国产精品自拍| 国产91丝袜在线观看| 成人黄色小视频在线观看| 国产不卡视频在线播放| 国产婷婷色一区二区三区在线| 激情综合色播激情啊| 国产亚洲欧美一级| 亚洲综合另类小说| 亚洲精品国产第一综合99久久| 日本韩国欧美一区| 91精品国产aⅴ一区二区| 午夜成人在线视频| 精品对白一区国产伦| 久久久久国产精品厨房| www.成人在线| 91精品福利在线一区二区三区 | 91蜜桃免费观看视频| 亚洲综合免费观看高清完整版在线| 一区二区三区国产| 欧美日本一区二区三区| 精品日韩在线观看| 成人av在线一区二区| 亚洲一二三四在线观看| 久久疯狂做爰流白浆xx| 国产欧美一区二区三区鸳鸯浴| 99久久久精品| 日韩在线一区二区| 国产精品女人毛片| 亚洲男人的天堂在线观看| 91精品国产福利| 99久久精品情趣| 777午夜精品视频在线播放| 久久嫩草精品久久久精品一| 色吧成人激情小说| 国产一区美女在线| 亚洲午夜一二三区视频| 久久久久99精品国产片| 香蕉影视欧美成人| 国产人成亚洲第一网站在线播放 | 欧美综合视频在线观看| 51午夜精品国产| 99re这里都是精品| ww久久中文字幕| 在线观看成人免费视频| 国产乱色国产精品免费视频| 午夜国产精品一区| 成人理论电影网| 蜜臀av性久久久久蜜臀av麻豆| 美女网站色91| 亚洲最快最全在线视频| 中文字幕va一区二区三区| 麻豆成人综合网| av一区二区三区| 国产成人一区在线| 日韩电影免费在线看| 欧美中文字幕一区二区三区| 国产盗摄一区二区三区| 日本成人中文字幕| 亚洲五月六月丁香激情| 国产精品一品二品| 久热成人在线视频| 日本成人中文字幕| 欧美浪妇xxxx高跟鞋交| av电影天堂一区二区在线| xf在线a精品一区二区视频网站| 欧美综合视频在线观看| 色婷婷久久久亚洲一区二区三区| 久久综合一区二区| 精品国产成人在线影院| 国产乱码精品一区二区三区五月婷| 欧美日韩免费一区二区三区视频| 国产农村妇女毛片精品久久麻豆| 欧美一区二区三区视频| 91 com成人网| 日韩一区二区精品葵司在线| 亚洲欧洲成人自拍| 亚洲色图20p| 久久99久久久久| 日韩欧美久久久| 日韩美一区二区三区| 日韩网站在线看片你懂的| 日韩一区二区三区av| 蜜臀av一区二区在线观看| 欧美午夜片在线看| 日韩理论电影院| 玉足女爽爽91| 一本久道中文字幕精品亚洲嫩| 97se亚洲国产综合自在线| 在线中文字幕一区二区| 亚洲激情av在线| 亚洲va欧美va人人爽| 天天综合网 天天综合色| 久久se精品一区精品二区| 国产一区 二区| 国产日产欧产精品推荐色| 亚洲四区在线观看| av一区二区不卡| 欧美在线免费视屏| 91精品国产91久久久久久最新毛片| 日本91福利区| 国产精品激情偷乱一区二区∴| 国产精品久久久久一区二区三区共 | 久久久精品中文字幕麻豆发布| 成人一区二区三区在线观看| 中文字幕一区二区三中文字幕| 亚洲美女少妇撒尿| 欧美综合欧美视频| 精品日韩在线观看| 国产精品久久久爽爽爽麻豆色哟哟 | 91一区一区三区| 一区二区三区四区精品在线视频| 91日韩一区二区三区| 天天色 色综合| 精品久久久网站| 不卡一区二区中文字幕| 中文字幕中文字幕中文字幕亚洲无线| 亚洲免费高清视频在线| 免费人成在线不卡| 99视频超级精品| 一区二区三区不卡视频在线观看| 青青草97国产精品免费观看无弹窗版 | 亚洲一区在线视频观看| 日韩欧美一区二区免费| 亚洲欧美综合另类在线卡通| 日本成人在线网站| 色综合久久六月婷婷中文字幕| 欧美一区二区三区不卡| 国产精品影视在线| 亚洲影视在线观看| 久久先锋影音av鲁色资源网| 一区二区三区国产| 亚洲精品一区二区三区四区高清| 在线观看日韩毛片| 中文字幕二三区不卡| 蜜臀av性久久久久蜜臀aⅴ流畅 | 奇米综合一区二区三区精品视频| 成人免费观看男女羞羞视频| 一区二区欧美在线观看| 精品久久久久久久一区二区蜜臀| 欧美高清视频不卡网| 中文字幕亚洲一区二区av在线 | 蜜桃在线一区二区三区| 日韩免费观看2025年上映的电影| 国产日韩欧美一区二区三区乱码| 亚洲一卡二卡三卡四卡无卡久久| 国产美女av一区二区三区| 欧美精品xxxxbbbb| 亚洲一区二区成人在线观看| 欧美主播一区二区三区美女| 国产三级精品三级| 韩国一区二区在线观看| 亚洲一卡二卡三卡四卡| 日韩欧美亚洲国产精品字幕久久久| 欧美日免费三级在线| 日本道免费精品一区二区三区| 精品日韩99亚洲| 国模一区二区三区白浆| 精品国内二区三区| 久久久久久久久久久久电影 | 中文一区在线播放| 国产激情91久久精品导航 |