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

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

?? intpnp.c

?? 在PC上通過USB與C8051通信
?? C
?? 第 1 頁 / 共 5 頁
字號:
/*++


Module Name:

    intpnp.c

Abstract:

	Plug and Play module.
    This file contains routines to handle pnp requests.
    These routines are not USB specific but is required
    for every driver which conforms to the WDM model.

Environment:

    Kernel mode

Notes:


--*/
#include "rtcapi.h"
#include "intusb.h"
#include "intpnp.h"
#include "intpwr.h"
#include "intdev.h"
#include "intrwr.h"
#include "intwmi.h"
#include "intusr.h"
#ifdef WIN98DRIVER
#include "intwdm98.h"
#endif

NTSTATUS
IntUsb_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 value

--*/
{
    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;
    }

    KdPrint( ("///////////////////////////////////////////\n"));
    KdPrint( ("IntUsb_DispatchPnP::"));
    IntUsb_IoIncrement(deviceExtension);

    if(irpStack->MinorFunction == IRP_MN_START_DEVICE) {

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

        if(deviceExtension->SSEnable) {

            CancelSelectSuspend(deviceExtension);
        }
    }

    KdPrint( (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);

        KdPrint( ("IntUsb_DispatchPnP::IRP_MN_STOP_DEVICE::"));
        IntUsb_IoDecrement(deviceExtension);

        return ntStatus;

    case IRP_MN_QUERY_REMOVE_DEVICE:

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

        return ntStatus;

    case IRP_MN_CANCEL_REMOVE_DEVICE:

        ntStatus = HandleCancelRemoveDevice(DeviceObject, Irp);

        break;

    case IRP_MN_SURPRISE_REMOVAL:

        ntStatus = HandleSurpriseRemoval(DeviceObject, Irp);

        KdPrint( ("IntUsb_DispatchPnP::IRP_MN_SURPRISE_REMOVAL::"));
        IntUsb_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);

        KdPrint( ("IntUsb_DispatchPnP::default::"));
        IntUsb_IoDecrement(deviceExtension);

        return ntStatus;

    } // switch

//
// complete request 
//

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

    IoCompleteRequest(Irp, IO_NO_INCREMENT);

//
// decrement count
//
    KdPrint( ("IntUsb_DispatchPnP::"));
    IntUsb_IoDecrement(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;

KdPrint( ("HandleStartDevice - begins\n"));

    //
    // initialize variables
    //
    deviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
    deviceExtension->UsbConfigurationDescriptor = NULL;
    deviceExtension->UsbInterface = NULL;
    deviceExtension->PipeContext = NULL;
	
	

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

        KdPrint( ("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)) {

        KdPrint( ("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)) {

        KdPrint( ("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 the device is powered up we may now 
	// start the Polling Interrupt URB.
	if (deviceExtension->DevPower == PowerDeviceD0)
	{
		StartInterruptUrbIN((PDEVICE_EXTENSION) deviceExtension);
	}

    KdPrint( ("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 {

            KdPrint( ("Failed to allocate memory for deviceDescriptor"));

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

        KdPrint( ("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);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产毛片一区二区| 欧美日韩aaaaaa| 9191久久久久久久久久久| 国产精品伦一区二区三级视频| 久久精品国产久精国产| 欧美三级三级三级爽爽爽| 国产精品久久久久久户外露出 | 亚洲欧美日韩系列| 国产成人久久精品77777最新版本| 日韩欧美国产综合在线一区二区三区| 依依成人综合视频| 国产精品一二二区| 久久色.com| 日本va欧美va欧美va精品| 91国在线观看| 一区二区三区在线视频免费| www.av亚洲| 中文字幕中文字幕在线一区| 国产精品99久久不卡二区| 精品乱码亚洲一区二区不卡| 日韩电影在线免费看| 99riav一区二区三区| 国产精品美女久久久久aⅴ国产馆| 黄页网站大全一区二区| 日韩一级高清毛片| 日本va欧美va精品发布| www.久久久久久久久| 国产精品剧情在线亚洲| 91麻豆自制传媒国产之光| 亚洲综合免费观看高清完整版| 欧美三级电影网站| 日产国产欧美视频一区精品| 精品欧美一区二区三区精品久久 | 婷婷一区二区三区| 911国产精品| 黄页网站大全一区二区| 欧美日韩成人在线| 奇米一区二区三区av| 久久免费午夜影院| 播五月开心婷婷综合| 亚洲一区二区三区视频在线| 制服丝袜国产精品| 国产一区二区三区视频在线播放| 国产精品美女一区二区| 欧美性做爰猛烈叫床潮| 另类的小说在线视频另类成人小视频在线| 精品国精品国产尤物美女| 国产v日产∨综合v精品视频| 亚洲欧美日韩小说| 7799精品视频| 大胆欧美人体老妇| 又紧又大又爽精品一区二区| 日韩一区二区不卡| 国产91精品久久久久久久网曝门| 一区二区三区四区激情| 欧美mv和日韩mv的网站| av亚洲产国偷v产偷v自拍| 亚洲成人动漫一区| xvideos.蜜桃一区二区| 色视频一区二区| 精品综合久久久久久8888| 国产精品嫩草99a| 欧美丰满少妇xxxxx高潮对白| 国产一区二区三区日韩| 一区二区三区在线看| 26uuu久久综合| 欧美性感一类影片在线播放| 久久精品国产精品亚洲红杏| 亚洲女人****多毛耸耸8| 日韩视频在线一区二区| 91社区在线播放| 蜜桃一区二区三区四区| 国产精品久久久久久久浪潮网站| 在线综合+亚洲+欧美中文字幕| 成人免费毛片片v| 青青草国产精品97视觉盛宴| 国产精品国产三级国产有无不卡| 91精品国产高清一区二区三区 | 久久精品一区二区三区四区| 在线亚洲高清视频| 国产福利一区在线| 亚洲电影视频在线| 国产精品萝li| 欧美成人激情免费网| 91国偷自产一区二区使用方法| 国产乱码字幕精品高清av | 亚洲夂夂婷婷色拍ww47| 久久久99久久| 日韩亚洲国产中文字幕欧美| 在线视频欧美区| 成人午夜碰碰视频| 麻豆精品精品国产自在97香蕉 | 亚洲一区二区在线播放相泽| 久久久国产综合精品女国产盗摄| 欧美日韩成人综合天天影院| 97久久精品人人做人人爽50路| 国产一区免费电影| 日本不卡视频一二三区| 一区二区三区毛片| 欧美激情一二三区| 久久综合久久鬼色中文字| 在线不卡的av| 91免费看片在线观看| 国产99久久久国产精品| 久久激情五月婷婷| 亚洲一区二区四区蜜桃| 国产精品精品国产色婷婷| 精品久久久久久久久久久院品网| 欧美日本视频在线| 欧美四级电影在线观看| 91麻豆国产福利精品| 成人精品国产免费网站| 国产精品一区二区在线观看不卡| 美腿丝袜一区二区三区| 婷婷综合另类小说色区| 亚洲精品国产无天堂网2021| 亚洲欧洲性图库| 国产三级精品在线| 久久久99精品免费观看| 久久色视频免费观看| 精品国产不卡一区二区三区| 日韩一级成人av| 91精品国产91综合久久蜜臀| 欧美日精品一区视频| 色88888久久久久久影院野外| 9色porny自拍视频一区二区| 国产99精品国产| 国产成人免费视频一区| 国产精品一区专区| 国产精品影视网| 粉嫩av一区二区三区粉嫩| 国产成人av一区二区三区在线观看| 国产麻豆精品95视频| 国产一区不卡视频| 国产成人在线免费| 成人听书哪个软件好| www.欧美.com| 色噜噜狠狠色综合中国| 欧美色涩在线第一页| 欧美喷水一区二区| 91精品国产91综合久久蜜臀| 欧美一级黄色大片| 久久综合久色欧美综合狠狠| 国产日韩av一区二区| 国产精品美女久久久久久2018| 亚洲欧洲成人自拍| 一区二区在线看| 午夜精彩视频在线观看不卡| 日本亚洲欧美天堂免费| 韩国精品久久久| 国产很黄免费观看久久| 成人av在线一区二区三区| 99r国产精品| 欧美色图在线观看| 欧美一区二区视频在线观看2020| 日韩片之四级片| 久久网站最新地址| 中文字幕一区二区三区蜜月 | 亚洲一区二区三区不卡国产欧美| 婷婷综合在线观看| 国产在线麻豆精品观看| 成人国产精品免费观看动漫| 色婷婷香蕉在线一区二区| 这里是久久伊人| 国产网站一区二区| 依依成人精品视频| 免费一级片91| 成人免费高清在线| 欧美日韩视频在线观看一区二区三区 | 蜜桃久久av一区| 国产一区欧美日韩| 色婷婷av一区二区三区软件 | 亚洲图片欧美色图| 免费成人在线网站| 大美女一区二区三区| 欧美亚洲高清一区| 精品国产免费人成在线观看| **欧美大码日韩| 日韩成人精品在线| 从欧美一区二区三区| 欧美日韩精品欧美日韩精品| 久久久99精品久久| 一区二区三区高清| 蜜臀91精品一区二区三区 | 91在线观看美女| 5858s免费视频成人| 日本一二三不卡| 同产精品九九九| 成人爽a毛片一区二区免费| 欧美日韩久久一区| 久久免费精品国产久精品久久久久| 最近日韩中文字幕| 乱一区二区av| 91极品美女在线| 国产午夜亚洲精品羞羞网站| 亚洲成a人片在线观看中文| 丰满放荡岳乱妇91ww| 欧美一二三区精品| 亚洲三级在线观看| 国产一区二区在线观看视频|