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

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

?? sspnp.c

?? WINDDK開發(fā)代碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
/*++

Copyright (c) 2000  Microsoft Corporation

Module Name:

    sSPnP.c

Abstract:

    This file contains code to handle the pnp irps.
    This is not USB specific but is essential for 
    every WDM driver.

Environment:

    Kernel mode

Notes:

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

--*/

#include "selSusp.h"
#include "sSPnP.h"
#include "sSPwr.h"
#include "sSDevCtr.h"
#include "sSWmi.h"
#include "sSUsr.h"

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

    SSDbgPrint(3, ("///////////////////////////////////////////\n"));
    SSDbgPrint(3, ("SS_DispatchPnP::"));
    SSIoIncrement(deviceExtension);

    if(irpStack->MinorFunction == IRP_MN_START_DEVICE) {

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

        if(deviceExtension->SSEnable) {
        
            CancelSelectSuspend(deviceExtension);
        }
    }

    SSDbgPrint(2, (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);

        break;
     
    case IRP_MN_STOP_DEVICE:

        ntStatus = HandleStopDevice(DeviceObject, Irp);

        SSDbgPrint(3, ("SS_DispatchPnP::IRP_MN_STOP_DEVICE::"));
        SSIoDecrement(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);

        break;

    case IRP_MN_SURPRISE_REMOVAL:

        ntStatus = HandleSurpriseRemoval(DeviceObject, Irp);

        SSDbgPrint(3, ("SS_DispatchPnP::IRP_MN_SURPRISE_REMOVAL::"));
        SSIoDecrement(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);

        SSDbgPrint(3, ("SS_DispatchPnP::default::"));
        SSIoDecrement(deviceExtension);

        return ntStatus;

    } // switch

    //
    // complete request 
    //
    Irp->IoStatus.Status = ntStatus;
    Irp->IoStatus.Information = 0;

    IoCompleteRequest(Irp, IO_NO_INCREMENT);

    //
    // decrement count
    //
    SSDbgPrint(3, ("SS_DispatchPnP::"));
    SSIoDecrement(deviceExtension);

    return ntStatus;
}

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

    This is the dispatch routine for IRP_MN_START_DEVICE

Arguments:

    DeviceObject - pointer to a device object.

    Irp - I/O request packet

Return Value:

    NT status value

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

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

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

    //
    // We cannot touch the device (send it any non pnp irps) until a
    // start device has been passed down to the lower drivers.
    // first pass the Irp down
    //

    KeInitializeEvent(&startDeviceEvent, NotificationEvent, FALSE);

    IoCopyCurrentIrpStackLocationToNext(Irp);

    IoSetCompletionRoutine(Irp, 
                           (PIO_COMPLETION_ROUTINE)IrpCompletionRoutine, 
                           (PVOID)&startDeviceEvent, 
                           TRUE, 
                           TRUE, 
                           TRUE);

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

    if(ntStatus == STATUS_PENDING) {

        KeWaitForSingleObject(&startDeviceEvent, 
                              Executive, 
                              KernelMode, 
                              FALSE, 
                              NULL);

        ntStatus = Irp->IoStatus.Status;
    }

    if(!NT_SUCCESS(ntStatus)) {

        SSDbgPrint(1, ("Lower drivers failed this Irp\n"));
        return ntStatus;
    }

    //
    // Read the device descriptor, configuration descriptor 
    // and select the interface descriptors
    //

    ntStatus = ReadandSelectDescriptors(DeviceObject);

    if(!NT_SUCCESS(ntStatus)) {

        SSDbgPrint(1, ("ReadandSelectDescriptors failed\n"));
        return ntStatus;
    }

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

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

    if(!NT_SUCCESS(ntStatus)) {

        SSDbgPrint(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 variables
    // and issue a wait wake.
    
    deviceExtension->WaitWakeIrp = NULL;
    deviceExtension->FlagWWCancel = 0;
    deviceExtension->FlagWWOutstanding = 0;

    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

            SSDbgPrint(3, ("Setting the timer...\n"));
            KeSetTimerEx(&deviceExtension->Timer, 
                         dueTime,
                         IDLE_INTERVAL,                              // 5000 ms
                         &deviceExtension->DeferredProcCall);

            deviceExtension->FreeIdleIrpCount = 0;
        }
    }

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

    return ntStatus;
}


NTSTATUS
ReadandSelectDescriptors(
    IN PDEVICE_OBJECT DeviceObject
    )
/*++
 
Routine Description:

    This routine configures the USB device.
    In this routines we get the device descriptor, 
    the configuration descriptor and select the
    configuration descriptor.

Arguments:

    DeviceObject - pointer to a device object

Return Value:

    NTSTATUS - NT status value.

--*/
{
    PURB                   urb;
    ULONG                  siz;
    NTSTATUS               ntStatus;
    PUSB_DEVICE_DESCRIPTOR deviceDescriptor;
    
    //
    // initialize variables
    //

    urb = NULL;
    deviceDescriptor = NULL;

    //
    // 1. Read the device descriptor
    //

    urb = ExAllocatePool(NonPagedPool, 
                         sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST));

    if(urb) {

        siz = sizeof(USB_DEVICE_DESCRIPTOR);
        deviceDescriptor = ExAllocatePool(NonPagedPool, siz);

        if(deviceDescriptor) {

            UsbBuildGetDescriptorRequest(
                    urb, 
                    (USHORT) sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
                    USB_DEVICE_DESCRIPTOR_TYPE, 
                    0, 
                    0, 
                    deviceDescriptor, 
                    NULL, 
                    siz, 
                    NULL);

            ntStatus = CallUSBD(DeviceObject, urb);

            if(NT_SUCCESS(ntStatus)) {

                ASSERT(deviceDescriptor->bNumConfigurations);
                ntStatus = ConfigureDevice(DeviceObject);    
            }
            			    
            ExFreePool(urb);                
            ExFreePool(deviceDescriptor);
        }
        else {

            SSDbgPrint(1, ("Failed to allocate memory for deviceDescriptor"));

            ExFreePool(urb);
            ntStatus = STATUS_INSUFFICIENT_RESOURCES;
        }
    }
    else {

        SSDbgPrint(1, ("Failed to allocate memory for urb"));

        ntStatus = STATUS_INSUFFICIENT_RESOURCES;
    }

    return ntStatus;
}

NTSTATUS
ConfigureDevice(
	IN PDEVICE_OBJECT DeviceObject
    )
/*++
 
Routine Description:

    This helper routine reads the configuration descriptor
    for the device in couple of steps.

Arguments:

    DeviceObject - pointer to a device object

Return Value:

    NTSTATUS - NT status value

--*/
{
    PURB                          urb;
    ULONG                         siz;
    NTSTATUS                      ntStatus;
    PDEVICE_EXTENSION             deviceExtension;
    PUSB_CONFIGURATION_DESCRIPTOR configurationDescriptor;

    //
    // initialize the variables
    //

    urb = NULL;
    configurationDescriptor = NULL;
    deviceExtension = DeviceObject->DeviceExtension;

    //
    // Read the first configuration descriptor
    // This requires two steps:
    // 1. Read the fixed sized configuration desciptor (CD)
    // 2. Read the CD with all embedded interface and endpoint descriptors
    //

    urb = ExAllocatePool(NonPagedPool, 
                         sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST));

    if(urb) {

        siz = sizeof(USB_CONFIGURATION_DESCRIPTOR);
        configurationDescriptor = ExAllocatePool(NonPagedPool, siz);

        if(configurationDescriptor) {

            UsbBuildGetDescriptorRequest(
                    urb, 
                    (USHORT) sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
                    USB_CONFIGURATION_DESCRIPTOR_TYPE, 
                    0, 
                    0, 
                    configurationDescriptor,
                    NULL, 
                    sizeof(USB_CONFIGURATION_DESCRIPTOR), 
                    NULL);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美区一区二区三区| 国产乱码精品一区二区三区五月婷 | 成人av免费观看| 中文字幕成人网| 99视频超级精品| 一区二区三区**美女毛片| 欧美四级电影在线观看| 婷婷综合另类小说色区| 精品久久久久久久久久久久久久久 | 日韩欧美精品在线视频| 国产一区二区美女| 国产精品国产三级国产aⅴ入口| av不卡在线观看| 亚洲电影在线播放| 日韩欧美一区二区三区在线| 国产福利一区在线观看| 亚洲精品网站在线观看| 日韩欧美中文一区二区| 国产不卡视频在线观看| 亚洲h在线观看| 2017欧美狠狠色| 色婷婷狠狠综合| 日本午夜精品视频在线观看| 久久久久国产精品麻豆ai换脸| 99视频在线观看一区三区| 天天色综合成人网| 国产精品午夜免费| 在线不卡免费欧美| 成人app网站| 蜜桃av噜噜一区| |精品福利一区二区三区| 日韩精品在线一区二区| 91麻豆免费观看| 久久99深爱久久99精品| 亚洲激情五月婷婷| 久久嫩草精品久久久久| 欧美丝袜丝nylons| 国产91丝袜在线18| 日韩av一级电影| 亚洲人123区| 久久网站热最新地址| 欧美午夜片在线观看| 福利电影一区二区三区| 麻豆精品视频在线观看免费| 一区二区激情视频| 中文字幕不卡的av| 日韩欧美国产综合在线一区二区三区| 91在线国产观看| 国产寡妇亲子伦一区二区| 午夜精品成人在线视频| 亚洲视频在线观看三级| 国产午夜精品久久| 欧美成va人片在线观看| 在线成人小视频| 欧美午夜一区二区三区| 色婷婷综合久久久中文字幕| 国产成人av一区| 国产在线不卡一区| 蜜桃精品视频在线| 免费观看在线综合| 午夜精品久久久久久久99樱桃| 亚洲精品日韩专区silk| 亚洲欧洲综合另类| 亚洲欧洲精品一区二区三区 | 一色屋精品亚洲香蕉网站| 久久久久免费观看| 精品国产一区二区亚洲人成毛片| 欧美美女喷水视频| 欧美在线观看一二区| 色婷婷综合久久久久中文一区二区| 波多野结衣欧美| 成人高清免费在线播放| 成人精品视频一区二区三区| 成人中文字幕在线| 国产成人精品亚洲日本在线桃色| 久久电影网站中文字幕| 久久99精品一区二区三区| 另类小说图片综合网| 日本亚洲天堂网| 日韩av电影天堂| 奇米四色…亚洲| 国产一区二区不卡在线| 国产美女视频91| 国产精品一区二区视频| 处破女av一区二区| 97久久精品人人澡人人爽| 91尤物视频在线观看| 欧美伊人久久久久久久久影院 | 日日夜夜免费精品| 蜜桃视频在线一区| 国产综合一区二区| 成人免费视频免费观看| 99精品久久只有精品| 色综合一个色综合| 欧美精品精品一区| 精品国产一区二区三区四区四| 久久久久久久综合| 成人免费一区二区三区视频| 亚洲一区二区3| 日韩电影网1区2区| 国产一区在线观看麻豆| av男人天堂一区| 欧美一区二区啪啪| 国产无一区二区| 亚洲第四色夜色| 韩国毛片一区二区三区| 99麻豆久久久国产精品免费| 欧美性猛片aaaaaaa做受| 2021国产精品久久精品| 亚洲婷婷国产精品电影人久久| 亚洲成年人网站在线观看| 国内精品伊人久久久久av影院 | 狠狠色丁香婷综合久久| 成人av小说网| 欧美日韩精品一区二区三区四区| 精品久久人人做人人爰| 一区二区三区91| 狠狠狠色丁香婷婷综合激情| 一本高清dvd不卡在线观看| 日韩一级二级三级| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 久久精品国产77777蜜臀| 国产成人av电影在线观看| 欧美日韩亚洲高清一区二区| 国产亚洲成年网址在线观看| 婷婷中文字幕综合| 成人av网站免费| 日韩精品一区二区三区中文精品| 亚洲特级片在线| 韩日av一区二区| 欧美精品丝袜中出| 国产精品短视频| 九九视频精品免费| 欧美日韩久久一区| 欧美国产乱子伦| 久久69国产一区二区蜜臀| 91成人在线观看喷潮| 中文在线一区二区| 黑人巨大精品欧美一区| 欧美男生操女生| 亚洲精品免费在线| eeuss国产一区二区三区| 日韩精品中文字幕在线不卡尤物| 亚洲r级在线视频| 在线亚洲免费视频| 自拍偷拍欧美激情| 国产精品一品二品| 日韩精品中文字幕一区二区三区| 香蕉乱码成人久久天堂爱免费| 色屁屁一区二区| 中文无字幕一区二区三区| 精品亚洲成a人在线观看| 91精品蜜臀在线一区尤物| 亚洲国产精品影院| 91免费视频观看| 中文字幕电影一区| 成人做爰69片免费看网站| 国产视频一区不卡| 国产一区二区在线视频| 精品国产电影一区二区| 美女精品一区二区| 日韩三级在线观看| 蜜桃视频一区二区三区| 91精品国产综合久久久久久久| 亚洲国产精品欧美一二99| 欧亚洲嫩模精品一区三区| 亚洲免费在线观看| 色狠狠一区二区三区香蕉| 成人免费小视频| 欧美亚洲国产一卡| 亚洲国产精品久久久久秋霞影院| 欧美午夜宅男影院| 日韩高清欧美激情| 欧美一级一级性生活免费录像| 免费美女久久99| 久久嫩草精品久久久久| 成人午夜视频网站| 亚洲人成伊人成综合网小说| 欧美亚洲图片小说| 老司机一区二区| 国产网站一区二区三区| 97久久精品人人做人人爽50路| 亚洲精品成人精品456| 91麻豆精品国产91久久久资源速度 | 久久综合九色综合久久久精品综合| 激情深爱一区二区| 中文字幕一区二区三区色视频| 91丨porny丨最新| 午夜国产精品影院在线观看| 欧美一区二区女人| 粉嫩av亚洲一区二区图片| 亚洲免费观看高清完整| 欧美精品少妇一区二区三区| 国产主播一区二区| 亚洲视频在线一区观看| 在线播放中文字幕一区| 粉嫩高潮美女一区二区三区| 亚洲国产视频一区二区| 久久亚洲捆绑美女| 色婷婷综合久久久久中文一区二区|