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

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

?? isopnp.c

?? usb范例代碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
/*++

Copyright (c) 2004  Microsoft Corporation

Module Name:

    isopnp.c

Abstract:

    Isoch USB device driver for Intel 82930 USB test board
    Plug and Play module

Environment:

    Kernel mode

Notes:

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

--*/

#include "isousb.h"
#include "isopnp.h"
#include "isopwr.h"
#include "isodev.h"
#include "isowmi.h"
#include "isousr.h"
#include "isorwr.h"
#include "isostrm.h"

NTSTATUS
IsoUsb_DispatchPnP(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP           Irp
    )
/*++

Routine Description:

    The plug and play dispatch routines.
    Most of these requests the driver will completely ignore.
    In all cases it must pass on the IRP to the lower driver.

Arguments:

    DeviceObject - pointer to a device object.

    Irp - pointer to an I/O Request Packet.

Return Value:

    NT status code

--*/
{
    PIO_STACK_LOCATION irpStack;
    PDEVICE_EXTENSION  deviceExtension;
//    KEVENT             startDeviceEvent;
    NTSTATUS           ntStatus;

    //
    // initialize variables
    //

    irpStack = IoGetCurrentIrpStackLocation(Irp);
    deviceExtension = DeviceObject->DeviceExtension;

    //
    // since the device is removed, fail the Irp.
    //

    if(Removed == deviceExtension->DeviceState) {

        ntStatus = STATUS_DELETE_PENDING;

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

        IoCompleteRequest(Irp, IO_NO_INCREMENT);

        return ntStatus;
    }

    IsoUsb_DbgPrint(3, ("///////////////////////////////////////////\n"));
    IsoUsb_DbgPrint(3, ("IsoUsb_DispatchPnP::"));
    IsoUsb_IoIncrement(deviceExtension);

    if(irpStack->MinorFunction == IRP_MN_START_DEVICE) {

        ASSERT(deviceExtension->IdleReqPend == 0);
    }
    else {

        if(deviceExtension->SSEnable) {

            CancelSelectSuspend(deviceExtension);
        }
    }

    IsoUsb_DbgPrint( 2, ("%s",PnPMinorFunctionString(irpStack->MinorFunction)) );

    switch(irpStack->MinorFunction) {

    case IRP_MN_START_DEVICE:

        ntStatus = HandleStartDevice(DeviceObject, Irp);

        break;

    case IRP_MN_QUERY_STOP_DEVICE:

        //
        // if we cannot stop the device, we fail the query stop irp
        //
        ntStatus = CanStopDevice(DeviceObject, Irp);

        if(NT_SUCCESS(ntStatus)) {

            ntStatus = HandleQueryStopDevice(DeviceObject, Irp);

            return ntStatus;
        }
        break;

    case IRP_MN_CANCEL_STOP_DEVICE:

        ntStatus = HandleCancelStopDevice(DeviceObject, Irp);

        IsoUsb_DbgPrint(3, ("IsoUsb_DispatchPnP::IRP_MN_CANCEL_STOP_DEVICE::"));
        IsoUsb_IoDecrement(deviceExtension);
    
        return ntStatus;

    case IRP_MN_STOP_DEVICE:

        ntStatus = HandleStopDevice(DeviceObject, Irp);

        IsoUsb_DbgPrint(3, ("IsoUsb_DispatchPnP::IRP_MN_STOP_DEVICE::"));
        IsoUsb_IoDecrement(deviceExtension);

        return ntStatus;

    case IRP_MN_QUERY_REMOVE_DEVICE:

        //
        // if we cannot remove the device, we fail the query remove irp
        //
        ntStatus = CanRemoveDevice(DeviceObject, Irp);

        if(NT_SUCCESS(ntStatus)) {

            ntStatus = HandleQueryRemoveDevice(DeviceObject, Irp);

            return ntStatus;
        }
        break;

    case IRP_MN_CANCEL_REMOVE_DEVICE:

        ntStatus = HandleCancelRemoveDevice(DeviceObject, Irp);
     
        IsoUsb_DbgPrint(3, ("IsoUsb_DispatchPnP::IRP_MN_CANCEL_REMOVE_DEVICE::"));
        IsoUsb_IoDecrement(deviceExtension);
    
        return ntStatus;

    case IRP_MN_SURPRISE_REMOVAL:

        ntStatus = HandleSurpriseRemoval(DeviceObject, Irp);

        IsoUsb_DbgPrint(3, ("IsoUsb_DispatchPnP::IRP_MN_SURPRISE_REMOVAL::"));
        IsoUsb_IoDecrement(deviceExtension);

        return ntStatus;

    case IRP_MN_REMOVE_DEVICE:

        ntStatus = HandleRemoveDevice(DeviceObject, Irp);

        return ntStatus;

    case IRP_MN_QUERY_CAPABILITIES:

        ntStatus = HandleQueryCapabilities(DeviceObject, Irp);

        break;

    default:

        IoSkipCurrentIrpStackLocation(Irp);

        ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject, Irp);

        IsoUsb_DbgPrint(3, ("IsoUsb_DispatchPnP::default::"));
        IsoUsb_IoDecrement(deviceExtension);

        return ntStatus;

    } // switch

//
// complete request
//

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

    IoCompleteRequest(Irp, IO_NO_INCREMENT);

//
// decrement count
//
    IsoUsb_DbgPrint(3, ("IsoUsb_DispatchPnP::"));
    IsoUsb_IoDecrement(deviceExtension);

    return ntStatus;
}


NTSTATUS
HandleStartDevice(
    IN PDEVICE_OBJECT   DeviceObject,
    IN PIRP             Irp
    )
/*++

Routine Description:

    This is the dispatch routine for RP_MJ_PNP, IRP_MN_START_DEVICE

    The PnP Manager sends this IRP at IRQL PASSIVE_LEVEL in the context
    of a system thread.

    This IRP must be handled first by the underlying bus driver for a
    device and then by each higher driver in the device stack.

Arguments:

    DeviceObject - pointer to a device object.

    Irp - I/O request packet

Return Value:

    NT status value

--*/
{
    PDEVICE_EXTENSION deviceExtension;
    KIRQL             oldIrql;
    LARGE_INTEGER     dueTime;
    NTSTATUS          ntStatus;

    IsoUsb_DbgPrint(3, ("HandleStartDevice - begins\n"));

    //
    // initialize variables
    //
    deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;

    // Pass the IRP_MN_START_DEVICE Irp down the stack first before we
    // do anything.
    //
    ntStatus = IsoUsb_SyncPassDownIrp(DeviceObject,
                                      Irp);

    if (!NT_SUCCESS(ntStatus))
    {
        IsoUsb_DbgPrint(1, ("Lower drivers failed IRP_MN_START_DEVICE\n"));
        return ntStatus;
    }

    // If this is the first time the device as been started, retrieve the
    // Device and Configuration Descriptors from the device.
    //
    if (deviceExtension->DeviceDescriptor == NULL)
    {
        ntStatus = IsoUsb_GetDescriptors(DeviceObject);

        if (!NT_SUCCESS(ntStatus))
        {
            return ntStatus;
        }
    }

    // Now configure the device
    //
    ntStatus = IsoUsb_SelectConfiguration(DeviceObject);

    if (!NT_SUCCESS(ntStatus))
    {
        return ntStatus;
    }

    //
    // enable the symbolic links for system components to open
    // handles to the device
    //

    ntStatus = IoSetDeviceInterfaceState(&deviceExtension->InterfaceName,
                                         TRUE);

    if(!NT_SUCCESS(ntStatus)) {

        IsoUsb_DbgPrint(1, ("IoSetDeviceInterfaceState:enable:failed\n"));
        return ntStatus;
    }

    KeAcquireSpinLock(&deviceExtension->DevStateLock, &oldIrql);

    SET_NEW_PNP_STATE(deviceExtension, Working);
    deviceExtension->QueueState = AllowRequests;

    KeReleaseSpinLock(&deviceExtension->DevStateLock, oldIrql);

    //
    // initialize wait wake outstanding flag to false.
    // and issue a wait wake.

    deviceExtension->FlagWWOutstanding = 0;
    deviceExtension->FlagWWCancel = 0;
    deviceExtension->WaitWakeIrp = NULL;

    if(deviceExtension->WaitWakeEnable) {

        IssueWaitWake(deviceExtension);
    }

    ProcessQueuedRequests(deviceExtension);

    if(WinXpOrBetter == deviceExtension->WdmVersion) {

        deviceExtension->SSEnable = deviceExtension->SSRegistryEnable;

        //
        // set timer for selective suspend requests.
        //

        if(deviceExtension->SSEnable) {

            dueTime.QuadPart = -10000 * IDLE_INTERVAL;               // 5000 ms

            KeSetTimerEx(&deviceExtension->Timer,
                         dueTime,
                         IDLE_INTERVAL,                              // 5000 ms
                         &deviceExtension->DeferredProcCall);

            deviceExtension->FreeIdleIrpCount = 0;
        }
    }

    if((Win2kOrBetter == deviceExtension->WdmVersion) ||
       (WinXpOrBetter == deviceExtension->WdmVersion)) {

        deviceExtension->IsDeviceHighSpeed = 0;
        GetBusInterfaceVersion(DeviceObject);
    }

    IsoUsb_DbgPrint(3, ("HandleStartDevice - ends\n"));

    return ntStatus;
}


NTSTATUS
CanStopDevice(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP           Irp
    )
/*++

Routine Description:

    This routine determines whether the device can be safely stopped. In our
    particular case, we'll assume we can always stop the device.
    A device might fail the request if it doesn't have a queue for the
    requests it might come or if it was notified that it is in the paging
    path.

Arguments:

    DeviceObject - pointer to the device object.

    Irp - pointer to the current IRP.

Return Value:

    STATUS_SUCCESS if the device can be safely stopped, an appropriate
    NT Status if not.

--*/
{
   //
   // We assume we can stop the device
   //

   UNREFERENCED_PARAMETER(DeviceObject);
   UNREFERENCED_PARAMETER(Irp);

   return STATUS_SUCCESS;
}


NTSTATUS
HandleQueryStopDevice(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP           Irp
    )
/*++

Routine Description:

    This routine services the Irps of minor type IRP_MN_QUERY_STOP_DEVICE

Arguments:

    DeviceObject - pointer to device object
    Irp - I/O request packet sent by the pnp manager.

Return Value:

    NT status value

--*/
{
    KIRQL             oldIrql;
    NTSTATUS          ntStatus;
    PDEVICE_EXTENSION deviceExtension;

    IsoUsb_DbgPrint(3, ("HandleQueryStopDevice - begins\n"));

    //
    // initialize variables
    //

    deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;

    //
    // If we can stop the device, we need to set the QueueState to
    // HoldRequests so further requests will be queued.
    //

    KeAcquireSpinLock(&deviceExtension->DevStateLock, &oldIrql);

    SET_NEW_PNP_STATE(deviceExtension, PendingStop);
    deviceExtension->QueueState = HoldRequests;

    KeReleaseSpinLock(&deviceExtension->DevStateLock, oldIrql);

    //
    // wait for the existing ones to be finished.
    // first, decrement this operation
    //

    IsoUsb_DbgPrint(3, ("HandleQueryStopDevice::"));
    IsoUsb_IoDecrement(deviceExtension);

    KeWaitForSingleObject(&deviceExtension->StopEvent,
                          Executive,

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
美女一区二区三区| 久久精品国产久精国产爱| 日韩欧美在线影院| 99re这里都是精品| 国产美女一区二区| 亚洲chinese男男1069| 国产欧美精品一区二区三区四区| 欧美午夜宅男影院| 99re热视频这里只精品| 精品一二线国产| 性感美女久久精品| 亚洲免费观看高清完整版在线观看| 久久午夜老司机| 日韩一区二区免费在线观看| 91精品1区2区| 91一区二区在线观看| 国产福利91精品一区| 美女www一区二区| 亚洲国产成人91porn| 18欧美亚洲精品| 日本一区二区不卡视频| 久久久久久99精品| 日韩视频在线观看一区二区| 欧美日本国产视频| 在线观看国产一区二区| 色婷婷亚洲婷婷| 91免费观看视频在线| 成人精品亚洲人成在线| 韩国精品一区二区| 国产一区二区三区国产| 精品中文字幕一区二区| 美腿丝袜亚洲色图| 日韩av中文字幕一区二区| 亚洲成人午夜影院| 日韩不卡一区二区三区| 日本在线不卡一区| 日韩va欧美va亚洲va久久| 日韩在线一区二区三区| 无吗不卡中文字幕| 日欧美一区二区| 日本亚洲三级在线| 波多野结衣中文字幕一区二区三区| 国产一区二区日韩精品| 国产a级毛片一区| 成人高清av在线| 一本大道综合伊人精品热热| 日本高清不卡在线观看| 欧美天天综合网| 制服视频三区第一页精品| 欧美乱妇一区二区三区不卡视频| 欧美一区国产二区| 日韩亚洲电影在线| 久久久亚洲国产美女国产盗摄| 久久九九全国免费| 国产精品久久久久久久久久免费看 | 国产精品毛片a∨一区二区三区| 日本一区二区三区高清不卡| 欧美国产激情二区三区| 中文字幕在线观看不卡视频| 亚洲综合久久久久| 日韩经典一区二区| 国产一区二区在线观看视频| 成人不卡免费av| 在线亚洲+欧美+日本专区| 欧美日韩精品一区二区三区| 欧美日韩国产一级片| 欧美成人精品3d动漫h| 国产欧美一区视频| 亚洲最快最全在线视频| 无吗不卡中文字幕| 国产精品亚洲成人| 欧美在线不卡一区| 精品捆绑美女sm三区| 中文字幕一区三区| 同产精品九九九| 国产激情偷乱视频一区二区三区| 91亚洲精品久久久蜜桃| 5月丁香婷婷综合| 中文字幕精品在线不卡| 午夜av一区二区| 风流少妇一区二区| 在线成人午夜影院| 国产精品福利一区二区三区| 午夜影视日本亚洲欧洲精品| 国产精品夜夜嗨| 欧美日韩国产一级片| 欧美国产欧美综合| 日本欧美在线看| 97成人超碰视| 久久综合久久综合久久综合| 一区二区三区精品在线观看| 精品一区二区综合| 欧美日韩免费在线视频| 国产欧美一区二区在线观看| 婷婷开心激情综合| 99久久99久久久精品齐齐| 日韩精品一区国产麻豆| 一区二区成人在线观看| 国产精品一区免费在线观看| 欧美日本一区二区| 亚洲欧美另类图片小说| 国产xxx精品视频大全| 欧美一区二区观看视频| 久久99国产精品免费网站| 欧美性色黄大片| 国产精品久久久一区麻豆最新章节| 美女免费视频一区二区| 欧美网站大全在线观看| 中文字幕视频一区| 国产精品996| 亚洲精品一区二区三区99| 性感美女极品91精品| 色狠狠综合天天综合综合| 国产亲近乱来精品视频| 精品中文字幕一区二区小辣椒| 欧美日韩国产123区| 亚洲精品国产第一综合99久久| 不卡电影一区二区三区| 亚洲精品在线观看网站| 日本不卡视频在线观看| 欧亚一区二区三区| 一区二区成人在线| 色偷偷88欧美精品久久久| 国产精品国产三级国产aⅴ原创 | 亚洲精品美腿丝袜| 成人av免费观看| 国产精品久久久久久久第一福利| 黄色日韩网站视频| 久久日一线二线三线suv| 老司机午夜精品| 欧美sm极限捆绑bd| 麻豆视频一区二区| 日韩午夜在线播放| 久久99国产乱子伦精品免费| 欧美tk—视频vk| 国产精品亚洲视频| 国产欧美精品一区aⅴ影院| 高清shemale亚洲人妖| 国产校园另类小说区| 成人av资源在线观看| 国产精品毛片无遮挡高清| 99精品欧美一区二区三区小说| 中文字幕日韩av资源站| 一本色道久久加勒比精品 | 捆绑调教美女网站视频一区| 欧美一级国产精品| 美女一区二区三区在线观看| 精品奇米国产一区二区三区| 国产麻豆午夜三级精品| 国产精品无人区| 欧洲精品一区二区| 日韩精品亚洲专区| 久久视频一区二区| 91蜜桃在线观看| 日日夜夜免费精品| www成人在线观看| eeuss影院一区二区三区| 亚洲自拍另类综合| 欧美一区二区三区公司| 韩国成人精品a∨在线观看| 中文字幕免费一区| 欧美亚洲国产怡红院影院| 喷水一区二区三区| 国产午夜亚洲精品羞羞网站| 91视频www| 热久久国产精品| 久久九九99视频| 欧美吞精做爰啪啪高潮| 黄网站免费久久| 国产传媒久久文化传媒| 亚洲天堂a在线| 在线播放亚洲一区| 国产99久久久国产精品 | 国产乱对白刺激视频不卡| 国产精品国产三级国产普通话99| 欧美写真视频网站| 国产一区二区三区av电影| 樱桃国产成人精品视频| 日韩色在线观看| 色综合中文字幕| 亚洲丰满少妇videoshd| 日韩视频免费直播| eeuss鲁一区二区三区| 免费亚洲电影在线| 综合色中文字幕| 日韩一卡二卡三卡国产欧美| 不卡电影一区二区三区| 人人超碰91尤物精品国产| 自拍偷拍亚洲综合| 精品国产乱码久久久久久久| 欧美无砖专区一中文字| 成人综合婷婷国产精品久久免费| 日韩在线卡一卡二| 中文字幕日韩一区| 久久久噜噜噜久久人人看| 欧美色网站导航| 99r精品视频| 国产a久久麻豆| 精品在线观看视频| 婷婷开心激情综合|