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

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

?? bulkdev.c

?? Windows2000/xp下的usb WDM驅動程序源代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*++

Copyright (c) 2000  Microsoft Corporation

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:

    Copyright (c) 2000 Microsoft Corporation.  
    All Rights Reserved.

--*/

#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;
    PBULKUSB_PIPE_CONTEXT       pipeContext;
    PUSBD_INTERFACE_INFORMATION interface;

    PAGED_CODE();

    BulkUsb_DbgPrint(3, ("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 {

        BulkUsb_DbgPrint(1, ("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
            //
            BulkUsb_DbgPrint(3, ("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);

    BulkUsb_DbgPrint(3, ("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;
    PBULKUSB_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;

    BulkUsb_DbgPrint(3, ("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);

    BulkUsb_DbgPrint(3, ("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;

    //
    // 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) {

        BulkUsb_DbgPrint(1, ("Invalid device state\n"));

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

        IoCompleteRequest(Irp, IO_NO_INCREMENT);
        return ntStatus;
    }

    BulkUsb_DbgPrint(3, ("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 signalled.
    //
    BulkUsb_DbgPrint(3, ("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_BULKUSB_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_BULKUSB_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_BULKUSB_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);

    BulkUsb_DbgPrint(3, ("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)) {
    
        BulkUsb_DbgPrint(3, ("BulkUsb_ResetPipe - success\n"));

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲第一二三四区| 亚洲福中文字幕伊人影院| 欧美综合欧美视频| 99精品一区二区| 成人综合在线视频| 成人综合婷婷国产精品久久| 在线观看免费成人| 国产精品视频在线看| 国产午夜精品在线观看| ww亚洲ww在线观看国产| 欧美成人免费网站| 久久天天做天天爱综合色| 亚洲1区2区3区4区| 日本精品裸体写真集在线观看| 91在线视频播放地址| 精品美女在线观看| 99久久99久久综合| 精品国产一区二区三区忘忧草| 欧美电视剧在线看免费| 欧美成人bangbros| 亚洲成人精品一区二区| 日本精品一区二区三区高清 | 成人激情av网| 日本久久一区二区三区| 国产精品日韩成人| 粉嫩一区二区三区在线看| 一本色道久久综合精品竹菊| 欧美丝袜自拍制服另类| 精品国产91九色蝌蚪| 日韩av电影免费观看高清完整版在线观看| 麻豆一区二区99久久久久| 懂色av中文字幕一区二区三区| 精品久久国产字幕高潮| 久久99精品久久只有精品| 国产不卡高清在线观看视频| 久久色.com| 国产a精品视频| 国产欧美一区二区三区在线看蜜臀 | 精品在线观看视频| 欧美成人精品福利| 麻豆91在线看| 久久亚区不卡日本| 国产成人免费在线视频| 欧美人与禽zozo性伦| 国产亚洲精品福利| 成人av在线看| 亚洲精品老司机| 国产成人综合网| 国产精品人妖ts系列视频| 99这里都是精品| 精品国产一区久久| 粉嫩av一区二区三区在线播放| 国产精品国产自产拍在线| 日韩电影在线免费| 久久只精品国产| 成人av中文字幕| 亚洲一区av在线| 色爱区综合激月婷婷| 同产精品九九九| 欧美影视一区二区三区| 图片区小说区区亚洲影院| 精品久久人人做人人爰| 成人影视亚洲图片在线| 亚洲国产欧美另类丝袜| 精品国产一区二区三区四区四| aaa欧美日韩| 日一区二区三区| 欧美三级韩国三级日本三斤| 亚洲欧美另类图片小说| 成人av资源下载| 日韩一区精品视频| 国产精品色噜噜| 欧美精品日日鲁夜夜添| 一区二区激情小说| 97超碰欧美中文字幕| 日本在线不卡视频| 亚洲欧洲日韩女同| av一本久道久久综合久久鬼色| 亚洲高清在线精品| 中文字幕欧美日韩一区| 成人午夜激情在线| 免费人成网站在线观看欧美高清| 亚洲精选视频免费看| 欧美精品乱码久久久久久按摩| 国产成人在线色| 美女一区二区久久| 亚洲大片精品永久免费| 欧美日韩dvd在线观看| 波多野结衣视频一区| 久久国产尿小便嘘嘘尿| 久久久久亚洲蜜桃| 国产成人精品午夜视频免费| 午夜婷婷国产麻豆精品| 亚洲区小说区图片区qvod| 国产亚洲午夜高清国产拍精品| 欧美精品v国产精品v日韩精品| 色综合视频在线观看| 成人国产亚洲欧美成人综合网| 麻豆精品在线看| 日本不卡在线视频| 亚洲一区二区三区视频在线| 亚洲视频网在线直播| 欧美视频一区二区在线观看| av电影在线观看完整版一区二区| 国产一区二区三区观看| 一区在线中文字幕| 国产午夜亚洲精品不卡| 久久久精品人体av艺术| 久久亚洲欧美国产精品乐播| 日韩一区二区不卡| 不卡在线观看av| 成人性生交大片免费看中文| 国产美女精品人人做人人爽| 久久se这里有精品| 开心九九激情九九欧美日韩精美视频电影| 午夜日韩在线电影| 亚洲国产精品视频| 日韩高清一区在线| 免费成人av资源网| 韩国三级在线一区| 一级中文字幕一区二区| 一级女性全黄久久生活片免费| 亚洲一区二区三区小说| 爽好久久久欧美精品| 亚欧色一区w666天堂| 日韩影院精彩在线| 久久成人久久爱| 粉嫩一区二区三区在线看| 不卡高清视频专区| 日本丰满少妇一区二区三区| 欧美性极品少妇| 欧美肥大bbwbbw高潮| 日韩精品一区国产麻豆| 久久久不卡影院| 亚洲色图.com| 亚洲福利视频三区| 久久精品72免费观看| 丁香亚洲综合激情啪啪综合| 不卡av电影在线播放| 在线亚洲一区观看| 欧美成人综合网站| 成人欧美一区二区三区白人| 亚洲综合色区另类av| 美国十次了思思久久精品导航| 国产精品123区| 色老头久久综合| 日韩欧美一卡二卡| 亚洲欧洲一区二区在线播放| 亚洲国产精品人人做人人爽| 黄网站免费久久| 色久优优欧美色久优优| 欧美va亚洲va在线观看蝴蝶网| 亚洲国产电影在线观看| 天天影视涩香欲综合网 | 久久99国产精品免费网站| 成人av网站免费观看| 欧美日韩免费不卡视频一区二区三区| 欧美成人一区二区三区片免费| 中文字幕永久在线不卡| 蜜桃视频一区二区三区| 色一情一伦一子一伦一区| 精品久久久久久久人人人人传媒 | 久久久综合九色合综国产精品| 1024精品合集| 国产在线播放一区| 欧美浪妇xxxx高跟鞋交| 国产精品理论片在线观看| 麻豆91在线看| 精品视频在线免费| 成人欧美一区二区三区| 国产一区二区美女| 欧美一区二区在线观看| 欧美一级免费大片| 亚洲欧美日韩中文字幕一区二区三区| 麻豆免费看一区二区三区| 欧美三区在线观看| 中文字幕在线观看一区| 国内精品伊人久久久久av影院| 欧美日韩一区三区| 亚洲欧美日韩一区| 成人精品免费看| 久久综合资源网| 久久成人羞羞网站| 91精品国产一区二区三区香蕉 | 久久精品男人的天堂| 免费在线观看视频一区| 欧美色大人视频| 亚洲一区二区3| 色呦呦一区二区三区| 中文欧美字幕免费| 国产mv日韩mv欧美| 久久精品一区蜜桃臀影院| 久久成人av少妇免费| 欧美一区二区三区人| 日韩成人精品视频| 制服丝袜亚洲色图| 国产精品丝袜91| 大美女一区二区三区| 国产欧美精品区一区二区三区| 久99久精品视频免费观看|