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

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

?? usbfx2lk_pnp.cpp

?? VisualC++寫的一個USB的驅動程序。
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
///////////////////////////////////////////////////////////////////////////////
//
//    (C) Copyright 2005 OSR Open Systems Resources, Inc.
//    Copyright (c) 2000  Microsoft Corporation
//    All Rights Reserved
//
//    This sofware is supplied for instructional purposes only.
//
//    OSR Open Systems Resources, Inc. (OSR) expressly disclaims any warranty
//    for this software.  THIS SOFTWARE IS PROVIDED  "AS IS" WITHOUT WARRANTY
//    OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION,
//    THE IMPLIED WARRANTIES OF MECHANTABILITY OR FITNESS FOR A PARTICULAR
//    PURPOSE.  THE ENTIRE RISK ARISING FROM THE USE OF THIS SOFTWARE REMAINS
//    WITH YOU.  OSR's entire liability and your exclusive remedy shall not
//    exceed the price paid for this material.  In no event shall OSR or its
//    suppliers be liable for any damages whatsoever (including, without
//    limitation, damages for loss of business profit, business interruption,
//    loss of business information, or any other pecuniary loss) arising out
//    of the use or inability to use this software, even if OSR has been
//    advised of the possibility of such damages.  Because some states/
//    jurisdictions do not allow the exclusion or limitation of liability for
//    consequential or incidental damages, the above limitation may not apply
//    to you.
//
//    OSR Open Systems Resources, Inc.
//    105 Route 101A Suite 19
//    Amherst, NH 03031  (603) 595-6500 FAX: (603) 595-6503
//    email bugs to: bugs@osr.com
//
//
//    MODULE:
//
//      USBFx2LK_PnP.cpp
//
//    ABSTRACT:
//
//      This file contains the routines that handle Plug and Play processing for the 
//      OSR USB FX2 Learning Kit Device
//
//    AUTHOR(S):
//
//      OSR Open Systems Resources, Inc.
// 
///////////////////////////////////////////////////////////////////////////////
#include "usbfx2lk.h"

#ifdef WPP_TRACING
//
// Include the necessary tmh file - this is 
//  just a matter of course if you're using WPP tracing.
//
extern "C" {
#include "usbfx2lk_pnp.tmh"
}
#endif

LONG    InstanceNumber = 0;

//
// Forward Definitions
//
static NTSTATUS OsrStartDevice(PUSBFX2LK_EXT DevExt);
static VOID OsrDecrementOutstandingIoCountAndWait(PUSBFX2LK_EXT DevExt);
static VOID OsrReturnResources(PUSBFX2LK_EXT DevExt);
static NTSTATUS OsrCanStopDevice(PUSBFX2LK_EXT DevExt, PIRP Irp);
static NTSTATUS OsrCanRemoveDevice(PUSBFX2LK_EXT DevExt, PIRP Irp) ;

//
// Informational Strings
//
static PSTR pnpMinorCodes[] = 
{
    "IRP_MN_START_DEVICE",
    "IRP_MN_QUERY_REMOVE_DEVICE",
    "IRP_MN_REMOVE_DEVICE",
    "IRP_MN_CANCEL_REMOVE_DEVICE",
    "IRP_MN_STOP_DEVICE",
    "IRP_MN_QUERY_STOP_DEVICE",
    "IRP_MN_CANCEL_STOP_DEVICE",
    "IRP_MN_QUERY_DEVICE_RELATIONS",
    "IRP_MN_QUERY_INTERFACE",
    "IRP_MN_QUERY_CAPABILITIES",
    "IRP_MN_QUERY_RESOURCES",
    "IRP_MN_QUERY_RESOURCE_REQUIREMENTS",
    "IRP_MN_QUERY_DEVICE_TEXT",
    "IRP_MN_FILTER_RESOURCE_REQUIREMENTS",
    "***** FUNCTION 0x0e",
    "IRP_MN_READ_CONFIG",
    "IRP_MN_WRITE_CONFIG",
    "IRP_MN_EJECT",
    "IRP_MN_SET_LOCK",
    "IRP_MN_QUERY_ID",
    "IRP_MN_QUERY_PNP_DEVICE_STATE",
    "IRP_MN_QUERY_BUS_INFORMATION",
    "IRP_MN_DEVICE_USAGE_NOTIFICATION",
    "IRP_MN_SURPRISE_REMOVAL",
    "IRP_MN_QUERY_LEGACY_BUS_INFORMATION"
};

CONST PCHAR OsrPrintState(PUSBFX2LK_EXT DevExt) 
{
    switch(DevExt->DevicePnPState) {

        case STATE_REMOVED:
            return "STATE_REMOVED";

        case STATE_STARTED:
            return "STATE_STARTED";

        case STATE_REMOVE_PENDING:
            return "STATE_REMOVE_PENDING";

        case STATE_SURPRISE_REMOVED:
            return "STATE_SURPRISE_REMOVED";

        case STATE_STOP_PENDING:
            return "STATE_STOP_PENDING";

        case STATE_STOPPED:
            return "STATE_STOPPED";
    
        case STATE_NEVER_STARTED:
            return "STATE_NEVER_STARTED";

        default:
            break;
    }

    return "*********UNKNOWN STATE Value";
}

///////////////////////////////////////////////////////////////////////////////
//
//  UsbFx2LkAddDevice
//
//      We are called at this entry point by the Plug and Play Manager
//      to add a Functional Device Object for a Physical Device Object.
//      Note that we may NOT access our device via the USB bus in this routine, 
//      we must wait until we have received an IRP_MJ_PNP/IRP_START_DEVICE before
//      we can try to talk to our device
//
//  INPUTS:
//
//      DriverObject         - Address of our DRIVER_OBJECT.
//
//      PhysicalDeviceObject - Address of our physical device
//                             object (PDO)
//
//  OUTPUTS:
//
//      None.
//
//  RETURNS:
//
//      STATUS_SUCCESS if success, an appropriate error otherwise
//
//  IRQL:
//
//      This routine is called at IRQL == PASSIVE_LEVEL.
//
//  CONTEXT:
//
//      This routine is called in the context of the System process
//
//  NOTES:
//
///////////////////////////////////////////////////////////////////////////////
NTSTATUS UsbFx2LkAddDevice(PDRIVER_OBJECT PDriverObject,
                           PDEVICE_OBJECT PPhysicalDeviceObject)
{
    PUSBFX2LK_EXT   devExt = NULL;
    PDEVICE_OBJECT  pFunctionalDeviceObject = NULL;
    UNICODE_STRING  devName;
    NTSTATUS        status = STATUS_SUCCESS;  
    WCHAR           devNameBuffer[256];
    size_t          devNameBufferSize = sizeof(devNameBuffer);
    OBJECT_ATTRIBUTES oa;

    OsrTracePrint(TRACE_LEVEL_VERBOSE,OSRDBG_PNP_INFO, ("UsbFx2LkAddDevice: Entered\n"));

    //
    // We're guaranteed to be called here at IRQL PASSIVE_LEVEL
    //
    ASSERT(KeGetCurrentIrql() == PASSIVE_LEVEL);

    //
    // Format a new device name string, based off a template and an instance 
    // number.
    //
    status = RtlStringCbPrintfW(devNameBuffer,devNameBufferSize,
                                L"\\Device\\USBFX2LK%d",InterlockedIncrement(&InstanceNumber));

    //
    // Make sure that the creation worked.  If not, get out of here.
    //
    if(!NT_SUCCESS(status)) {
        OsrTracePrint(TRACE_LEVEL_ERROR,OSRDBG_PNP_INFO,
            ("UsbFx2LkAddDevice: RtlStringCbPrintfW Error 0x%x (%s)\n",status,OsrNtStatusToString(status)));
        return status;
    }
    
    //
    // Initialize the Unicode Name structure to be used for the Device Name.
    //
    RtlInitUnicodeString(&devName, devNameBuffer);

    //
    // Create the FDO for the device.
    //
    status = IoCreateDevice(PDriverObject,
                            sizeof(USBFX2LK_EXT),
                            &devName,
                            FILE_DEVICE_OSRUSBFX2LK,
                            FILE_DEVICE_SECURE_OPEN,
                            FALSE,
                            &pFunctionalDeviceObject);


    if (!NT_SUCCESS(status)) {
        OsrTracePrint(TRACE_LEVEL_ERROR,OSRDBG_PNP_INFO,
            ("UsbFx2LkAddDevice: IoCreateDevice Error 0x%x (%s)\n",status,OsrNtStatusToString(status)));
        return status;
    }


    // 
    // Get a pointer to the Device Extension and Initialize the fields that we need.
    //
    devExt = (PUSBFX2LK_EXT) pFunctionalDeviceObject->DeviceExtension;

    RtlZeroMemory(devExt,sizeof(USBFX2LK_EXT));

    devExt->MagicNumber = USBFX2LK_EXT_MAGIC_NUMBER;
    devExt->InstanceNumber = InstanceNumber;

    devExt->FunctionalDeviceObject = pFunctionalDeviceObject;
    devExt->PhysicalDeviceObject = PPhysicalDeviceObject;

    //
    // Set the Initial PnP State.
    //
    devExt->DevicePnPState = STATE_NEVER_STARTED;

    //
    // The device and system are is implicitly in D0 when 
    //  we arrive in the system
    // 
    devExt->DevicePowerState = PowerDeviceD0;
    devExt->SystemPowerState = PowerSystemWorking;

    //
    // Default to supporting selective suspend
    //
    devExt->SSEnabledByUser = TRUE;
    devExt->SSState = SS_NOT_STARTED;


    //
    // Biased to 1.  Transition to 0 during remove device
    // means IO is finished.   Transition to 1 means
    // the device can be stopped.
    //
    devExt->OutStandingIoCount = 1;

    //
    // Initialize our stop and remove Events 
    //
    KeInitializeEvent(&devExt->RemoveEvent,NotificationEvent,FALSE);
    KeInitializeEvent(&devExt->StopEvent,NotificationEvent,TRUE);

    //
    // And initialize the other events used in selective suspend
    //  processing
    //
    KeInitializeEvent(&devExt->SSSubmissionThreadTerminateEvent,NotificationEvent,FALSE);
    KeInitializeEvent(&devExt->SSDeviceNotSuspendedEvent,NotificationEvent,TRUE);

#ifndef W2K
    KeInitializeEvent(&devExt->SSIdleCallbackCalled,NotificationEvent,FALSE);
    KeInitializeEvent(&devExt->SSIdleCompletionRoutineCalled,NotificationEvent,FALSE);
#endif
    

    //
    // Initialize our locks...
    //
    KeInitializeSpinLock(&devExt->CancelSafeIoLock);
    KeInitializeSpinLock(&devExt->IoStateLock);
    KeInitializeSpinLock(&devExt->SSLock);

    //
    // ...and our list head...
    //
    InitializeListHead(&devExt->IoQueue);

    //
    // We need to create a thread for use in 
    //  selective suspend
    //
    //
    // We'll need a kernel handle for this thread
    //
    InitializeObjectAttributes(&oa, NULL, OBJ_KERNEL_HANDLE, NULL, NULL);

    //
    // Create the thread
    //
    status = PsCreateSystemThread(&devExt->SSSubmissionThread,
                                  THREAD_ALL_ACCESS,
                                  &oa,
                                  NULL,
                                  NULL,
                                  SSSubmissionThreadRoutine,
                                  devExt);

    if (!NT_SUCCESS(status)) {

        OsrTracePrint(TRACE_LEVEL_ERROR,OSRDBG_PNP_INFO,
            ("UsbFx2LkAddDevice: PsCreateSystemThread failed 0x%x (%s).\n",status,OsrNtStatusToString(status)));

        IoDeleteDevice(devExt->FunctionalDeviceObject);
        return status;

    }

    //
    // We'll also need the object pointer for the thread
    //  so that we can wait for it to terminate when 
    //  cleaning up selective suspend
    //
    status = ObReferenceObjectByHandle(devExt->SSSubmissionThread,
                                       THREAD_ALL_ACCESS,
                                       NULL,
                                       KernelMode,
                                       &devExt->SSSubmissionThreadObject,
                                       NULL);

    if (!NT_SUCCESS(status)) {

        OsrTracePrint(TRACE_LEVEL_ERROR,OSRDBG_SELECTIVE_SUSPEND,
            ("UsbFx2LkAddDevice: ObReferenceObjectByHandle failed 0x%x (%s).\n",status,OsrNtStatusToString(status)));
    
        //
        // Set the terminate thread event and close the HANDLE. 
        //  Unfortunately we can't wait for the thread to terminate
        //  (we don't have an object to wait on) so we don't 
        //  have any choice but to exit and hope that the thread
        //  terminates quickly (which it should).
        //
        // This call failing would be very strange indeed...
        //
        KeSetEvent(&devExt->SSSubmissionThreadTerminateEvent, 
                   EVENT_INCREMENT, FALSE);

        ZwClose(devExt->SSSubmissionThread);

        IoDeleteDevice(devExt->FunctionalDeviceObject);
        return status;

    }


    //
    // Initialize the cancel safe I/O queue
    // 
#ifdef W2K3
    status = IoCsqInitializeEx(&devExt->CancelSafeIoQueue,
                           OsrCsqInsertIoIrpEx,
                           OsrCsqRemoveIoIrp,
                           OsrCsqPeekNextIoIrp,
                           OsrCsqAcquireIoLock,
                           OsrCsqReleaseIoLock,

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
狠狠色丁香婷婷综合| 欧美性猛交xxxx黑人交| 欧美视频一区二区三区在线观看| 欧美一卡2卡三卡4卡5免费| 久久久高清一区二区三区| 亚洲自拍偷拍九九九| 精品一区二区三区久久久| 欧美又粗又大又爽| 国产精品久久毛片| 国产成人鲁色资源国产91色综| 欧美一区二区不卡视频| 一区二区免费在线| 91在线观看下载| 国产偷国产偷精品高清尤物| 久久国产精品无码网站| 欧美肥妇bbw| 亚洲电影视频在线| 欧美最新大片在线看| 国产精品久久久久影院色老大| 国产麻豆精品在线| 精品处破学生在线二十三| 奇米色777欧美一区二区| 精品视频免费在线| 亚洲免费三区一区二区| 91欧美一区二区| 亚洲人成亚洲人成在线观看图片 | 成人蜜臀av电影| 精品少妇一区二区三区在线视频 | 国产精品色一区二区三区| 国产老女人精品毛片久久| 精品日产卡一卡二卡麻豆| 蜜桃91丨九色丨蝌蚪91桃色| 91精品婷婷国产综合久久性色| 亚洲午夜影视影院在线观看| 欧洲精品一区二区| 日韩中文字幕1| 日韩视频中午一区| 狠狠色丁香久久婷婷综合丁香| 欧美mv日韩mv亚洲| 粉嫩嫩av羞羞动漫久久久| 中文av字幕一区| 色狠狠桃花综合| 日本免费新一区视频 | 欧美日韩免费高清一区色橹橹| 亚洲国产成人av| 欧美一区二区三区喷汁尤物| 国内精品久久久久影院一蜜桃| 国产丝袜美腿一区二区三区| 91免费在线看| 五月婷婷久久丁香| 久久夜色精品国产欧美乱极品| 成人性生交大片免费看视频在线| 亚洲欧美另类久久久精品2019| 欧美日韩在线播放三区| 精品在线视频一区| 亚洲蜜桃精久久久久久久| 日韩一二在线观看| www.在线欧美| 视频在线观看91| 欧美国产精品v| 欧美久久久久久久久久| 国产成人精品网址| 五月综合激情网| 国产精品久久看| 日韩一级片在线观看| 色综合天天综合网国产成人综合天 | 国产亚洲一区字幕| 欧美影片第一页| 国产乱码精品一区二区三区五月婷| 亚洲人吸女人奶水| 欧美变态口味重另类| 色综合咪咪久久| 激情欧美一区二区| 亚欧色一区w666天堂| 国产精品剧情在线亚洲| 欧美第一区第二区| 欧美中文字幕一区二区三区亚洲| 国产在线不卡一区| 丝袜脚交一区二区| 亚洲欧美日韩国产手机在线| 精品国产一区二区亚洲人成毛片| 色天天综合色天天久久| 韩国中文字幕2020精品| 亚洲高清在线精品| 亚洲欧美影音先锋| 2020国产精品久久精品美国| 欧美日韩免费观看一区二区三区| 国产v综合v亚洲欧| 蜜桃视频在线观看一区| 亚洲成人你懂的| 亚洲男同1069视频| 中文字幕中文在线不卡住| 久久综合久久鬼色中文字| 91麻豆精品国产91久久久使用方法| youjizz久久| 成人国产免费视频| 国产成人精品影视| 国产精品1024| 国产又粗又猛又爽又黄91精品| 日韩高清在线不卡| 午夜精品在线看| 亚洲国产成人va在线观看天堂| 亚洲激情第一区| 亚洲少妇30p| 亚洲欧美中日韩| 欧美韩国日本不卡| 亚洲国产精品二十页| 日本一区二区三区免费乱视频| 久久综合色婷婷| 久久综合国产精品| 久久久亚洲国产美女国产盗摄 | 夜夜亚洲天天久久| 亚洲精品欧美激情| 亚洲欧美日韩精品久久久久| 亚洲乱码国产乱码精品精可以看| 亚洲欧洲日产国码二区| 自拍av一区二区三区| 亚洲欧美色一区| 一区二区高清免费观看影视大全| 亚洲综合激情小说| 天天亚洲美女在线视频| 免播放器亚洲一区| 国产毛片一区二区| 99热99精品| 欧美探花视频资源| 日韩一区二区麻豆国产| 久久嫩草精品久久久精品一| 欧美激情一区三区| 亚洲伊人色欲综合网| 午夜精彩视频在线观看不卡| 日韩电影一区二区三区四区| 久久精品久久综合| 成人午夜电影网站| 色婷婷av久久久久久久| 5566中文字幕一区二区电影| 精品国产成人系列| 亚洲欧美电影院| 免费成人在线观看视频| 国产成人免费xxxxxxxx| 欧美色综合久久| 久久久亚洲精华液精华液精华液| 日韩一区日韩二区| 蜜臀久久久久久久| 不卡视频在线看| 日韩一区二区在线观看视频播放| 久久久久久久久久久久电影| 亚洲精品精品亚洲| 久久99国产精品久久99| 波多野结衣一区二区三区| 欧美三级乱人伦电影| 久久精品水蜜桃av综合天堂| 亚洲摸摸操操av| 国产一区二区三区不卡在线观看 | 久久久久久久综合狠狠综合| 亚洲视频一区二区在线| 日韩成人一级大片| 97久久久精品综合88久久| 日韩免费观看高清完整版| 亚洲精品中文在线影院| 韩国v欧美v亚洲v日本v| 欧美视频在线观看一区二区| 欧美高清一级片在线观看| 日韩成人av影视| 91丨porny丨在线| 国产日韩欧美亚洲| 男女性色大片免费观看一区二区| 99久久er热在这里只有精品15| 欧美大片一区二区| 亚洲国产精品一区二区www在线| 国产精品一区二区黑丝| 日韩一区二区视频| 一区二区三区在线视频播放| 国产iv一区二区三区| 日韩欧美一区二区免费| 亚洲一区二区四区蜜桃| 成人综合在线观看| 久久综合五月天婷婷伊人| 日韩电影一二三区| 欧美三级日韩三级国产三级| 亚洲黄色录像片| 91小视频在线免费看| 国产偷国产偷亚洲高清人白洁 | 精品一区二区三区日韩| 7777精品伊人久久久大香线蕉经典版下载 | 日韩伦理电影网| 高清不卡一区二区| 久久亚洲捆绑美女| 极品美女销魂一区二区三区免费| 91精品国产综合久久久久久久久久 | 欧美久久久久久久久中文字幕| 亚洲精品国产无套在线观| 一本大道久久a久久综合| 国产精品国产三级国产普通话蜜臀 | 欧美成人一区二区| 蜜桃视频免费观看一区| 欧美一激情一区二区三区| 美女视频黄免费的久久| 日韩精品在线一区| 国产美女娇喘av呻吟久久| 国产亚洲午夜高清国产拍精品|