亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
国产一区二区按摩在线观看| av在线播放不卡| 一区二区在线观看视频| 国产一区 二区 三区一级| 男女男精品视频网| 麻豆一区二区三| 久久99精品网久久| 国产精品中文字幕日韩精品 | 日本免费新一区视频| 日韩电影在线看| 精品一区二区三区免费观看 | 91精品国产黑色紧身裤美女| 欧美一区二区在线免费观看| 日韩精品一区二区三区视频播放 | 亚洲va中文字幕| 日本伊人精品一区二区三区观看方式 | 亚洲制服欧美中文字幕中文字幕| 日韩美女视频一区| 亚洲一区在线观看免费观看电影高清 | 亚洲国产一二三| 亚洲无线码一区二区三区| 亚洲一区视频在线观看视频| 天堂午夜影视日韩欧美一区二区| 丝袜美腿亚洲一区| 久久国产精品72免费观看| 国产一区二区调教| 成人av电影在线| 欧美无砖专区一中文字| 日韩一级大片在线| 国产丝袜欧美中文另类| 一区视频在线播放| 亚洲6080在线| 激情成人午夜视频| 99re这里只有精品视频首页| 欧美日本免费一区二区三区| 26uuu久久天堂性欧美| 椎名由奈av一区二区三区| 性做久久久久久| 国产在线播放一区| 91老师片黄在线观看| 日韩一区二区三区视频在线| 国产午夜亚洲精品不卡| 亚洲国产美国国产综合一区二区| 久久精品噜噜噜成人av农村| 色综合天天综合网天天看片| 欧美一级搡bbbb搡bbbb| 国产精品欧美久久久久无广告| 亚洲一区二区黄色| 国产精品1区二区.| 欧美日韩中字一区| 国产丝袜美腿一区二区三区| 亚洲一二三区视频在线观看| 国内精品写真在线观看| 日本精品裸体写真集在线观看| 日韩免费高清av| 亚洲女同一区二区| 国产精品自产自拍| 欧美日韩午夜精品| 国产精品不卡在线| 久久97超碰色| 欧美精品在线一区二区| 国产精品的网站| 精品亚洲国产成人av制服丝袜| 日本精品视频一区二区三区| 国产三级一区二区| 六月丁香婷婷色狠狠久久| 91免费国产在线观看| 久久亚洲春色中文字幕久久久| 亚洲国产乱码最新视频 | 欧美一a一片一级一片| 久久久夜色精品亚洲| 日韩国产欧美在线播放| 色88888久久久久久影院按摩| 久久久久久久久岛国免费| 日本特黄久久久高潮| 在线观看一区二区视频| 中文字幕永久在线不卡| 国产在线视视频有精品| 欧美日韩国产系列| 一个色综合网站| 91蝌蚪porny九色| 中文字幕免费不卡| 国内精品伊人久久久久av一坑 | 亚洲蜜臀av乱码久久精品| 国产在线精品一区二区不卡了 | 久久久噜噜噜久久人人看| 首页国产欧美日韩丝袜| 在线精品观看国产| 亚洲欧美视频在线观看视频| 东方欧美亚洲色图在线| 久久久激情视频| 国模一区二区三区白浆| 日韩丝袜美女视频| 蜜臀av性久久久久蜜臀av麻豆| 欧美性生活大片视频| 亚洲美女视频一区| 91视频免费播放| 国产精品国产三级国产三级人妇 | 欧美在线观看视频在线| 亚洲日穴在线视频| 色悠悠久久综合| 亚洲美女视频一区| 在线影院国内精品| 亚洲国产日韩a在线播放| 欧美伊人久久大香线蕉综合69| 亚洲一级片在线观看| 欧美视频日韩视频| 日韩不卡一区二区| 日韩一区二区电影在线| 日本视频免费一区| 日韩精品一区国产麻豆| 国产在线看一区| 国产日韩欧美电影| eeuss影院一区二区三区| 亚洲欧美日韩精品久久久久| 欧美在线一二三| 轻轻草成人在线| 精品少妇一区二区三区在线播放 | 麻豆国产精品官网| 2021国产精品久久精品| 成人午夜免费电影| 亚洲精品免费在线播放| 欧美绝品在线观看成人午夜影视| 青青草成人在线观看| 精品欧美黑人一区二区三区| 国产成人av一区二区三区在线| 亚洲国产精品传媒在线观看| 99久久夜色精品国产网站| 亚洲一区二区在线免费观看视频 | 亚洲资源在线观看| 欧美一区二区三级| 国产精品69久久久久水密桃 | 91成人网在线| 美女免费视频一区| 国产欧美日本一区二区三区| 99精品1区2区| 免费的成人av| 国产精品免费观看视频| 欧美日韩色一区| 国产一区福利在线| 一区二区三区四区蜜桃| 日韩区在线观看| 国产99精品在线观看| 一区二区三区在线看| 精品奇米国产一区二区三区| 99热精品一区二区| 日韩电影免费在线观看网站| 国产欧美日韩中文久久| 欧美午夜片在线看| 国产一区久久久| 亚洲国产一二三| 国产午夜精品久久| 欧美日韩国产美女| 国产成人精品综合在线观看 | 成人三级伦理片| 日韩不卡一二三区| 中文字幕在线观看不卡视频| 91精品国产一区二区人妖| 99精品视频中文字幕| 裸体一区二区三区| 亚洲婷婷在线视频| 久久久久久一二三区| 欧美人妇做爰xxxⅹ性高电影| 国产精品99久久久久久有的能看| 亚洲成a人片综合在线| 国产精品美日韩| 欧美一级午夜免费电影| 色哟哟一区二区| 国产福利一区在线观看| 日韩**一区毛片| 亚洲自拍偷拍九九九| 国产精品嫩草影院com| 精品88久久久久88久久久| 欧美性生活久久| 99re视频这里只有精品| 国产一区二区h| 蜜桃精品在线观看| 亚洲国产精品久久久久婷婷884| 中文字幕不卡三区| 精品少妇一区二区三区在线播放 | 亚洲丰满少妇videoshd| 欧美激情一区二区| 久久色成人在线| 91精品国产综合久久国产大片| 日本高清免费不卡视频| va亚洲va日韩不卡在线观看| 国产原创一区二区| 麻豆成人久久精品二区三区红 | 欧美午夜精品久久久久久超碰| 成人av网在线| 成人午夜电影网站| 国产高清久久久| 国产成人精品免费| 国产老肥熟一区二区三区| 久久国产免费看| 激情综合网av| 久久国产尿小便嘘嘘| 狠狠色狠狠色综合日日91app| 久久精品理论片| 国产一区激情在线|