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

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

?? intdev.c

?? Silicon Laboratories C8051F320/1單片機例子
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*++


Module Name:

    intdev.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 "intusb.h"
#include "intpnp.h"
#include "intpwr.h"
#include "intdev.h"
#include "intusr.h"
#include "intwmi.h"
#include "intrwr.h"

NTSTATUS
IntUsb_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( ("IntUsb_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 IntUsb_DispatchCreate_Exit;
    }

    if(deviceExtension->UsbInterface) {

        interface = deviceExtension->UsbInterface;
    }
    else {

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

        ntStatus = STATUS_INVALID_DEVICE_STATE;
        goto IntUsb_DispatchCreate_Exit;
    }

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

        ntStatus = STATUS_INVALID_PARAMETER;
        goto IntUsb_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 IntUsb_DispatchCreate_Exit;
    }
    
    pipeContext = IntUsb_PipeWithName(DeviceObject, &fileObject->FileName);

    if(pipeContext == NULL) {

        ntStatus = STATUS_INVALID_PARAMETER;
        goto IntUsb_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);
            }
        }
    }

IntUsb_DispatchCreate_Exit:

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

    IoCompleteRequest(Irp, IO_NO_INCREMENT);

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

NTSTATUS
IntUsb_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( ("IntUsb_DispatchClose - begins\n"));

    if(fileObject && fileObject->FsContext) {

        pipeInformation = fileObject->FsContext;

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

            pipeContext = IntUsb_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( ("IntUsb_DispatchClose - ends\n"));

    return ntStatus;
}

NTSTATUS
IntUsb_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( ("IntUsb_DispatchDevCtrl::"));
    IntUsb_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 = IntUsb_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 = IntUsb_ResetDevice(DeviceObject);

        break;

    default :

        ntStatus = STATUS_INVALID_DEVICE_REQUEST;

        break;
    }

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

    IoCompleteRequest(Irp, IO_NO_INCREMENT);

    KdPrint( ("IntUsb_DispatchDevCtrl::"));
    IntUsb_IoDecrement(deviceExtension);

    return ntStatus;
}

NTSTATUS
IntUsb_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)) {
    

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91麻豆国产福利在线观看| 日韩专区中文字幕一区二区| 久久精品一区二区三区四区| 精品久久久久久久久久久久久久久 | 91视频www| 91精品国产乱码久久蜜臀| 欧美大片在线观看一区二区| 国产欧美精品一区二区色综合 | 国产iv一区二区三区| 色婷婷综合久色| 日韩精品一区二区三区视频| 国产精品国产a| 蜜臀精品久久久久久蜜臀| 国产成人8x视频一区二区| 欧洲一区在线电影| 久久久久久夜精品精品免费| 亚洲综合成人在线视频| 国产精品亚洲午夜一区二区三区| 91久久精品日日躁夜夜躁欧美| 777色狠狠一区二区三区| 1024成人网| 风间由美一区二区三区在线观看 | 另类专区欧美蜜桃臀第一页| 99re8在线精品视频免费播放| 3d动漫精品啪啪一区二区竹菊 | 麻豆精品新av中文字幕| 欧洲色大大久久| 成人免费小视频| 丁香婷婷综合激情五月色| 日韩欧美视频一区| 亚洲电影一级片| 欧美无乱码久久久免费午夜一区| 亚洲三级久久久| 91麻豆精品一区二区三区| 亚洲手机成人高清视频| 成人av动漫在线| 1区2区3区国产精品| 91免费精品国自产拍在线不卡| 久久久精品蜜桃| 波多野结衣亚洲| 亚洲福利视频一区二区| 日韩一区二区不卡| 国产成人av福利| 亚洲色图在线视频| 欧美一区二区三区四区在线观看| 免费成人av在线播放| 精品国产麻豆免费人成网站| 国产传媒欧美日韩成人| 亚洲视频 欧洲视频| 欧美美女bb生活片| 韩国精品在线观看| 亚洲欧美视频在线观看视频| 91在线无精精品入口| 午夜欧美电影在线观看| 精品国产91久久久久久久妲己| 国内偷窥港台综合视频在线播放| 国产精品久久久久影视| 欧美精品99久久久**| 成人的网站免费观看| 日本亚洲电影天堂| 一区二区三区高清| 精品久久久久香蕉网| 丁香婷婷综合色啪| 欧洲一区二区三区免费视频| 国产99久久精品| 99久久婷婷国产综合精品电影| 不卡一区二区在线| 99精品久久只有精品| 麻豆传媒一区二区三区| 国产精品久久久久久妇女6080| 3atv一区二区三区| 91极品视觉盛宴| 不卡视频一二三四| 久久电影网站中文字幕| 亚洲成人免费在线观看| 最新久久zyz资源站| 国产夜色精品一区二区av| 欧美精品在线视频| 欧美久久免费观看| 欧美日韩高清一区二区三区| 欧美三级午夜理伦三级中视频| 97精品国产97久久久久久久久久久久 | 久久综合九色综合欧美98| 日韩欧美一卡二卡| 久久久久亚洲蜜桃| 亚洲免费在线视频| 亚洲一区二区视频| 蜜臀av一区二区| 国产露脸91国语对白| 成人禁用看黄a在线| 成人精品免费看| aaa欧美色吧激情视频| 欧美一区二区三区爱爱| 337p粉嫩大胆噜噜噜噜噜91av | 久久久久久久久一| 亚洲一区免费观看| 日韩美女视频一区二区| 精品在线视频一区| 欧美一区三区二区| 亚洲成人一区在线| 欧美无乱码久久久免费午夜一区| 中文字幕一区二区三区蜜月| 国产在线播放一区三区四| 欧美一级片在线| 亚洲同性gay激情无套| 激情综合网最新| 欧美群妇大交群的观看方式| 国产精品久久久久久久岛一牛影视 | 日韩成人免费在线| 欧洲一区二区av| 亚洲欧美视频在线观看视频| 国产麻豆精品久久一二三| 在线播放/欧美激情| 亚洲第一二三四区| 欧美在线观看禁18| 中文字幕av不卡| 狠狠色丁香久久婷婷综合_中| 欧美蜜桃一区二区三区| 亚洲国产日韩综合久久精品| 不卡视频一二三| 亚洲国产精品精华液2区45| 日韩av电影天堂| 欧美一区在线视频| 国产乱码精品一区二区三区av| 精品国产免费一区二区三区香蕉| 蜜臀av亚洲一区中文字幕| 日韩丝袜情趣美女图片| 久久av老司机精品网站导航| 日韩精品专区在线| 国产精品一级黄| 亚洲精品少妇30p| 欧美日韩综合一区| 另类小说色综合网站| 国产午夜精品久久久久久久| 国产成人8x视频一区二区| 亚洲精品中文字幕乱码三区| 欧美三级资源在线| 久久福利视频一区二区| 国产精品麻豆久久久| 色爱区综合激月婷婷| 免费观看久久久4p| 国产免费观看久久| 欧美日韩精品系列| 国产69精品久久久久毛片| 一卡二卡三卡日韩欧美| 26uuu精品一区二区| 色视频一区二区| 国产成人久久精品77777最新版本| 国产精品久久久爽爽爽麻豆色哟哟| 欧亚洲嫩模精品一区三区| 国产一区二区三区香蕉| 午夜影院在线观看欧美| 国产精品福利在线播放| 精品久久久久久久久久久久包黑料 | 国产成人亚洲综合a∨猫咪| 亚洲午夜影视影院在线观看| 国产精品少妇自拍| 欧美精品一区二区三区久久久| 欧美日韩一区二区三区高清| 成人综合婷婷国产精品久久| 免费成人你懂的| 日本特黄久久久高潮| 亚洲r级在线视频| 亚洲精品免费在线观看| 中文字幕一区二区三区不卡在线| 日韩精品资源二区在线| 91麻豆精品国产91久久久久| 日本乱人伦一区| 日本伦理一区二区| 色综合天天综合狠狠| 91美女精品福利| 91麻豆精品国产91久久久更新时间| 欧美视频你懂的| 欧美精品视频www在线观看| 欧美精品黑人性xxxx| 欧美成人精品福利| 久久综合色天天久久综合图片| 欧美精品一区二区三区蜜桃| 精品国产91洋老外米糕| 国产精品伦理一区二区| 亚洲一区国产视频| 午夜精品福利一区二区三区av| 天天影视涩香欲综合网| 青草av.久久免费一区| 久久国产日韩欧美精品| www.欧美亚洲| 制服丝袜在线91| 国产亲近乱来精品视频 | 欧美色图第一页| 久久免费视频一区| 亚洲一区影音先锋| 国产福利一区二区三区| 欧美日韩一区视频| 国产精品视频在线看| 亚洲成人自拍偷拍| 99久久99久久久精品齐齐| 欧美精选一区二区| 亚洲人精品一区| 国产成人免费网站| 精品国产乱码91久久久久久网站|