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

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

?? bulkdev.c

?? 支持USB2.0 BULK傳輸范例
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*++


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;
    }

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区精品在线观看| 欧美电视剧在线观看完整版| 国产精品免费看片| 国产一区二区精品在线观看| 久久这里都是精品| 国产一区二区精品在线观看| 国产欧美日韩精品在线| 99久久久久久| 一区二区理论电影在线观看| 欧美日本韩国一区二区三区视频| 亚洲第四色夜色| 欧美变态tickle挠乳网站| 国产麻豆一精品一av一免费| 国产精品美女一区二区三区| 91小视频在线| 日本欧美久久久久免费播放网| 日韩一卡二卡三卡国产欧美| 国产寡妇亲子伦一区二区| 国产精品毛片久久久久久久| 欧美日韩专区在线| 久久99久久久久| 中文字幕中文乱码欧美一区二区| 色婷婷精品大视频在线蜜桃视频| 亚洲高清视频在线| 国产亚洲福利社区一区| 91丨porny丨国产| 婷婷一区二区三区| 国产亚洲精品中文字幕| 在线观看日韩一区| 韩国av一区二区三区在线观看| 中文字幕一区二区三区视频| 91精品国产免费| yourporn久久国产精品| 青青草精品视频| 中文字幕一区二区三区色视频| 欧美一区二区三区免费| www.成人在线| 毛片一区二区三区| 亚洲视频中文字幕| 久久一日本道色综合| 欧美手机在线视频| 成人国产精品免费| 日本免费在线视频不卡一不卡二| 中文字幕字幕中文在线中不卡视频| 欧美另类高清zo欧美| 成人激情av网| 免费成人在线观看视频| 一区二区三区在线视频观看58| 亚洲精品在线观| 精品视频资源站| www.成人在线| 国产麻豆精品在线观看| 日韩高清国产一区在线| 亚洲乱码国产乱码精品精的特点 | 成人av网站在线观看免费| 亚洲6080在线| 亚洲手机成人高清视频| 久久久精品影视| 日韩欧美亚洲国产另类 | 国产麻豆日韩欧美久久| 天堂va蜜桃一区二区三区| 国产精品免费视频一区| 久久久久久久久久美女| 欧美一区二区在线视频| 一本一道久久a久久精品| 成人av免费在线| 国产精品一区2区| 另类小说欧美激情| 丝袜诱惑亚洲看片| 亚洲国产一二三| 18欧美乱大交hd1984| 日本一区二区三区免费乱视频| 日韩欧美国产综合| 69久久夜色精品国产69蝌蚪网| 在线免费观看日本欧美| 91视频精品在这里| 99国产精品99久久久久久| 99re热视频这里只精品| 99久久久久久| 99久久婷婷国产精品综合| 99国产精品国产精品毛片| 91在线精品一区二区| av在线播放一区二区三区| 色综合久久综合网欧美综合网| av激情综合网| 91热门视频在线观看| 色天天综合色天天久久| 91国产成人在线| 色呦呦网站一区| 在线精品视频免费播放| 欧美图片一区二区三区| 欧美日韩国产首页在线观看| 欧美电影影音先锋| 日韩视频一区二区三区在线播放| 欧美电影免费观看高清完整版 | 亚洲欧美精品午睡沙发| 亚洲人精品午夜| 亚洲伊人伊色伊影伊综合网| 婷婷六月综合亚洲| 韩国视频一区二区| www.在线欧美| 欧美军同video69gay| 日韩女优av电影| 亚洲国产精品二十页| 一区二区三区中文免费| 午夜精品久久久久久| 国产在线日韩欧美| 91视频在线观看| 欧美一区国产二区| 中文字幕在线一区免费| 亚洲午夜激情网页| 老司机一区二区| 成人久久视频在线观看| 欧美四级电影网| 国产午夜精品久久久久久久 | 欧美视频在线一区二区三区| 欧美一区二区三区免费视频| 久久精品夜色噜噜亚洲a∨| 亚洲欧美欧美一区二区三区| 日韩精品一卡二卡三卡四卡无卡| 韩国av一区二区| 色婷婷国产精品综合在线观看| 日韩欧美一卡二卡| 最新欧美精品一区二区三区| 日韩va亚洲va欧美va久久| 成人激情黄色小说| 欧美一区二区三区人| 亚洲欧美一区二区视频| 日韩av电影免费观看高清完整版在线观看| 国产精品18久久久| 欧美电影一区二区三区| 亚洲欧洲精品天堂一级| 美女网站视频久久| 91国在线观看| 国产免费久久精品| 奇米精品一区二区三区在线观看一 | 欧美日韩精品欧美日韩精品| 国产日产欧美一区二区视频| 午夜影院在线观看欧美| 91日韩精品一区| 欧美激情一区三区| 久久精品国产一区二区| 在线精品视频免费播放| 国产精品美女久久久久久| 极品美女销魂一区二区三区| 91黄色免费版| 亚洲日本在线观看| 粉嫩av一区二区三区在线播放| 欧美videos中文字幕| 一区二区成人在线观看| 成人v精品蜜桃久久一区| 欧美精品一区二区三区高清aⅴ | 亚洲国产高清不卡| 老司机免费视频一区二区三区| 欧美系列在线观看| 亚洲女人****多毛耸耸8| 国产91在线看| 久久精品亚洲国产奇米99| 麻豆成人久久精品二区三区红| 在线影院国内精品| 亚洲欧美日韩中文播放| 99re热视频精品| 亚洲精品国产高清久久伦理二区| 成人精品电影在线观看| 国产欧美一区视频| 国产一区二区在线观看免费| 日韩一区和二区| 日韩中文字幕区一区有砖一区 | 欧美一级国产精品| 婷婷综合五月天| 91麻豆精品国产自产在线观看一区 | 无吗不卡中文字幕| 678五月天丁香亚洲综合网| 亚洲国产精品尤物yw在线观看| 在线免费观看不卡av| 亚洲午夜羞羞片| 欧美色中文字幕| 日日骚欧美日韩| 日韩视频免费观看高清完整版在线观看 | 国产欧美日韩激情| 不卡欧美aaaaa| 亚洲天堂av一区| 欧美性受xxxx黑人xyx性爽| 亚洲高清久久久| 日韩一级片在线播放| 国内精品视频666| 国产欧美久久久精品影院| 成人激情开心网| 亚洲精品免费播放| 欧美军同video69gay| 久久99精品国产91久久来源| ww亚洲ww在线观看国产| 东方欧美亚洲色图在线| 亚洲视频免费看| 在线观看日韩高清av| 日本视频免费一区| 中文字幕乱码亚洲精品一区| 91在线观看高清| 日韩国产欧美在线视频| 欧美国产欧美综合|