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

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

?? usbaer.c

?? microsoft usb開發包,能夠給大家一個很好的參考.
?? C
字號:
/*++

Copyright (c) 1999 Microsoft Corporation

Module Name:

    Usbaer.c 

Abstract:

    IOS port driver for USB LS-120 drive
    Async Event Handler module

Environment:

    kernel mode only

Notes:

  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
  KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
  IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
  PURPOSE.

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


Revision History:

    03/19/99: MRB  Original

--*/

#define WANTVXDWRAPS

#include <basedef.h>
#include <vmm.h>
#include <debug.h>
#include <vxdwraps.h>
#include <winerror.h>
#include <aep.h>
#include <drp.h>
#include <isp.h>
#include <ior.h>
#include <iop.h>
#include <dcb.h>
#include <ilb.h>
#include <configmg.h>
#include <ntkern.h>
#include "usbstor.h"
#include "usbdebug.h"

#pragma VxD_LOCKED_CODE_SEG
#pragma VxD_LOCKED_DATA_SEG

BYTE DcbCount=0;

void
USBSTOR_AER (
    PAEP Aep
    )
{
/*++

Routine Description:

    Asychronous event handler.

Arguments:

    Aep - Asychronous Event Packet.  Structure varies depending
          on AER type.

Return Value:

    Status returned in Aep->AEP_result

--*/

    USBSTOR_DebugPrintf(DBG_MAX, ("Enter USBSTOR_AER\n\r"));

    // presume success
    Aep->AEP_result = AEP_SUCCESS;

    switch (Aep->AEP_func)
    {
    case AEP_INITIALIZE:
        USBSTOR_DebugPrintf(DBG_MAX, ("AEP_INITIALIZE\n\r"));
	
        Aep->AEP_result = USBSTOR_AEP_Init((PAEP_bi_init)Aep);
        break;
		
    case AEP_UNINITIALIZE:
        USBSTOR_DebugPrintf(DBG_MAX, ("AEP_UNINITIALIZE\n\r"));
        break;

    case AEP_DEVICE_INQUIRY:
        USBSTOR_DebugPrintf(DBG_MAX, ("AEP_DEVICE_INQUIRY\n\r"));

        Aep->AEP_result = USBSTOR_Device_Inquiry((PAEP_inquiry_device)Aep);

        // Make sure we didn't record the inquiry DCB in our DDB.  If we did, 
        // erase it and decrement our DCB count.
        if (((PAEP_inquiry_device)Aep)->AEP_i_d_dcb == ((PUSBDDB)Aep->AEP_ddb)->Dcb1)
        {
                ((PUSBDDB)Aep->AEP_ddb)->Dcb1 = NULL;
                DcbCount--;
        }
        else if (((PAEP_inquiry_device)Aep)->AEP_i_d_dcb == ((PUSBDDB)Aep->AEP_ddb)->Dcb2)
        {
                ((PUSBDDB)Aep->AEP_ddb)->Dcb2 = NULL;
                DcbCount--;
        }
        break;

    case AEP_CONFIG_DCB:
        USBSTOR_DebugPrintf(DBG_MAX, ("AEP_CONFIG_DCB\n\r"));

        Aep->AEP_result = USBSTOR_Config_DCB((PAEP_dcb_config)Aep);

        if (AEP_SUCCESS == Aep->AEP_result)
        {
            // Store the DCB in our DDB
            if (((PUSBDDB)Aep->AEP_ddb)->Dcb1 == NULL)
            {
                ((PUSBDDB)Aep->AEP_ddb)->Dcb1 = ((PAEP_dcb_config)Aep)->AEP_d_c_dcb;
                DcbCount++;
            }
            else if (((PUSBDDB)Aep->AEP_ddb)->Dcb2 == NULL)
            {
                ((PUSBDDB)Aep->AEP_ddb)->Dcb2 = ((PAEP_dcb_config)Aep)->AEP_d_c_dcb;
                DcbCount++;
            }
            else
            {
                USBSTOR_DebugPrintf(DBG_MIN, ("ERROR! - Configured more DCBs than we expected\n\r"));
                USBSTOR_DebugPrintf(DBG_MIN, ("         This should not happen!\n\r"));
            }
        }
        break;

    case AEP_UNCONFIG_DCB:
        USBSTOR_DebugPrintf(DBG_MAX, ("AEP_UNCONFIG_DCB\n\r"));
    {
        DWORD pdcb = ((PAEP_dcb_unconfig)Aep)->AEP_d_u_dcb;
        PUSBDDB UsbDdb = (PUSBDDB)Aep->AEP_ddb;

        // Make sure it's our DCB
        if (UsbDdb->Dcb1 == pdcb)
        {
            //Zero out Dcb field
            UsbDdb->Dcb1 = NULL;
            DcbCount--;
        }
        else if (UsbDdb->Dcb2 == pdcb)
        {
            //Zero out Dcb field
            UsbDdb->Dcb2 = NULL;
            DcbCount--;
        }

    }
        break;

    case AEP_IOP_TIMEOUT:
        USBSTOR_DebugPrintf(DBG_MAX, ("AEP_IOP_TIMEOUT\n\r"));
        break;

    case AEP_1_SEC:
        USBSTOR_DebugPrintf(DBG_MAX, ("AEP_1_SEC\n\r"));
        break;

#ifdef DEBUG
    case AEP_DBG_DOT_CMD:
        USBSTOR_DebugPrintf(DBG_MAX, ("AEP_DBG_DOT_CMD\n\r"));
        break;
#endif

    case AEP_BOOT_COMPLETE:
        USBSTOR_DebugPrintf(DBG_MAX, ("AEP_BOOT_COMPLETE\n\r"));
        if (0 == DcbCount)
            Aep->AEP_result = AEP_FAILURE;
        break;

    default:
        USBSTOR_DebugPrintf(DBG_DEFAULT, ("Unhandled AEP - %x\n\r",Aep->AEP_func));
        Aep->AEP_result = AEP_FAILURE;
        break;

    } // end switch on AEP function

    return;

}


USHORT
USBSTOR_AEP_Init(
    PAEP_bi_init Aep
    )
{
/*++

Routine Description:

    Initialization routine.

Arguments:

    Aep - AEP_bi_init structure.  

Return Value:

    AEP_SUCCESS if successful,
    AEP_FAILURE otherwise

--*/


    DWORD          Pdo, Fdo=0;
    DEVNODE        ParentDevNode;
    ISP_ddb_create Isp;
    PUSBDDB        UsbDdb;

    // We need to find the FDO created by USBLS120.SYS for the USB storage
    // device.  This will be passed as a parameter to USBLS120.SYS when we
    // do I/O calls so it knows which device to talk to.

    // To identify the correct FDO, we call an exported function in 
    // USBLS120.SYS that enumerates each PDO/FDO pair attached to USBLS120.SYS.
    // We can then use an exported service from NTKERN.VXD to translate
    // the PDO to a DevNode handle, and compare it to our parent's DevNode
    // handle (we are loaded via a psuedo-child device created by USBLS120.SYS,
    // so our parent is the real USB device).
        		

    // First, get our parent's DevNode handle
    if (CM_Get_Parent(&ParentDevNode, (DEVNODE)Aep->AEP_bi_i_hdevnode, 0) != CR_SUCCESS)
    {
        USBSTOR_DebugPrintf(DBG_MIN, ("Can't find our parent DevNode!\n\r"));
        return AEP_FAILURE;
    }
		

    //Loop thru all the PDO/FDO pairs looking for a match to our parent DevNode
    while ((Pdo = pfnGetNextPdo(&Fdo)) && (_NtKernPhysicalDeviceObjectToDevNode(Pdo) != ParentDevNode));
    if (!Pdo)
    {
        USBSTOR_DebugPrintf(DBG_MIN, ("Can't PDO for our parent DevNode!\n\r"));
        return AEP_FAILURE;
    }


    // Found our PDO, so allocate our DDB
    Isp.ISP_ddb_hdr.ISP_func = ISP_CREATE_DDB;
    Isp.ISP_ddb_size = sizeof(USBDDB);
    Isp.ISP_ddb_flags = 0;

    ILBService(&Isp);

    if (Isp.ISP_ddb_hdr.ISP_result)
    {
        USBSTOR_DebugPrintf(DBG_MIN, ("Can't allocate DDB!\n\r"));
        return AEP_FAILURE;
    }

    UsbDdb = (PUSBDDB)(Isp.ISP_ddb_ptr);

    // Store pertinent information in our DDB.
    UsbDdb->Ddb.DDB_number_buses = 1;
    UsbDdb->Ddb.DDB_devnode_ptr = Aep->AEP_bi_i_hdevnode;
    UsbDdb->Fdo = Fdo;
    UsbDdb->Flags = 0;

    // Register our I/O completion handler with USBLS120.SYS
    pfnRegisterCompletionHandler(Fdo, USBSTOR_CompleteRequest);

    return AEP_SUCCESS;
}



USHORT
USBSTOR_Config_DCB(
    PAEP_dcb_config Aep
    )
{
/*++

Routine Description:

    Configuration handler for new DCBs.

Arguments:

    Aep - AEP_dcb_config structure.  

Return Value:

    Aep->AEP_result = AEP_SUCCESS if successful,
    Aep->AEP_result = AEP_FAILURE otherwise

--*/

    PDCB Dcb;
    ISP_calldown_insert Isp;


    Dcb = (PDCB)Aep->AEP_d_c_dcb;

    //Set maximum scatter gather elements to 17
    Dcb->DCB_max_sg_elements = 17;

    //Set max transfer size to 64k
    Dcb->DCB_max_xfer_len = 0x10000;

    // DCB_DEV2_IDE_FLOPTICAL is set specifically if we are a
    // LS-120 device.  This flag tells DISKVSD.VXD to special
    // handle this drive.  It causes the device type to change
    // from a hard-disk to a floppy.

    // This flag should only be set for LS-120 devices, as it
    // relies on capacity information being returned in the
    // vendor specific INQUIRY data, and assumes SFF-8070i
    // compatibility.   Devices that wish to appear as normal
    // hard-drives should *not* set the DCB_DEV2_IDE_FLOPTICAL
    // flag.

    Dcb->DCB_cmn.DCB_device_flags2 |= DCB_DEV2_ATAPI_DEVICE |
                                      DCB_DEV2_IDE_FLOPTICAL;

    // Insert ourselves into the calldown stack for this device
    Isp.ISP_i_cd_hdr.ISP_func = ISP_INSERT_CALLDOWN;
    Isp.ISP_i_cd_dcb = (ULONG)Dcb;         
    Isp.ISP_i_cd_req = USBSTOR_Request;     
    Isp.ISP_i_cd_expan_len = 0;             
    Isp.ISP_i_cd_lgn = Aep->AEP_d_c_hdr.AEP_lgn;      
    Isp.ISP_i_cd_ddb = (ULONG)Aep->AEP_d_c_hdr.AEP_ddb;        
    //BUGBUG - what are the correct flags for this device?
    Isp.ISP_i_cd_flags = DCB_dmd_srb_cdb |
                         DCB_dmd_pageability;

    // Call IOS
    ILBService(&Isp);

    return AEP_SUCCESS;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
奇米影视在线99精品| 欧美人体做爰大胆视频| 69堂成人精品免费视频| 久久久国产综合精品女国产盗摄| 亚洲中国最大av网站| 国产成人免费9x9x人网站视频| 欧美日韩三级一区| 亚洲日本免费电影| 成人午夜视频免费看| 久久免费午夜影院| 人人爽香蕉精品| 91.com在线观看| 亚洲亚洲精品在线观看| 91丝袜美女网| 国产精品免费人成网站| 国产精品自拍av| 久久天天做天天爱综合色| 日韩经典中文字幕一区| 欧美日韩亚洲丝袜制服| 亚洲精品菠萝久久久久久久| www.久久精品| 亚洲欧洲日本在线| 从欧美一区二区三区| 国产视频911| 国产福利一区二区三区视频 | 日韩欧美专区在线| 午夜精品在线看| 欧美日韩成人激情| 丝袜亚洲精品中文字幕一区| 欧美日韩国产精品自在自线| 午夜精品久久久久久| 欧美精选午夜久久久乱码6080| 一区二区三区免费在线观看| 在线影视一区二区三区| 亚洲成人免费视频| 欧美福利视频导航| 国模套图日韩精品一区二区| 久久中文字幕电影| 懂色中文一区二区在线播放| 国产精品久久久久久久裸模 | 国产盗摄一区二区| 国产女人18毛片水真多成人如厕| 成人一区二区三区在线观看| 国产精品网友自拍| 色猫猫国产区一区二在线视频| 亚洲精品高清视频在线观看| 欧美探花视频资源| 日韩av二区在线播放| 久久九九影视网| 91蜜桃婷婷狠狠久久综合9色| 亚洲一区二区视频| 日韩午夜在线观看| 成年人网站91| 同产精品九九九| 久久久久一区二区三区四区| 北条麻妃一区二区三区| 亚洲成人一区在线| 精品国产一区二区三区av性色| 成人免费毛片app| 亚洲亚洲人成综合网络| 亚洲精品在线观| 91免费版pro下载短视频| 日韩**一区毛片| 国产精品高潮呻吟久久| 欧美精品视频www在线观看| 国产成人午夜电影网| 一区二区成人在线视频| 久久久久久久久一| 在线精品视频免费播放| 国产乱色国产精品免费视频| 亚洲欧美日韩国产另类专区| 国产精品成人在线观看| 一区二区三区欧美激情| 91超碰这里只有精品国产| 国产乱国产乱300精品| 亚洲成人动漫在线观看| 欧美极品美女视频| 欧美成人欧美edvon| 色网站国产精品| 成人午夜视频福利| 乱中年女人伦av一区二区| 亚洲一区欧美一区| 中文一区在线播放| 精品日韩成人av| 欧美群妇大交群的观看方式| 99精品视频在线观看免费| 韩国精品久久久| 午夜电影网亚洲视频| 亚洲乱码精品一二三四区日韩在线 | av一本久道久久综合久久鬼色| 蜜桃视频在线观看一区二区| 亚洲综合成人网| 最新国产成人在线观看| 国产日韩欧美制服另类| 精品国产sm最大网站免费看| 欧美日韩在线播放三区四区| 91啪九色porn原创视频在线观看| 国产999精品久久| 久久99国产精品免费网站| 亚洲欧洲日产国产综合网| 久久久久青草大香线综合精品| 91精品黄色片免费大全| 欧美日本国产一区| 欧美色精品在线视频| 日本福利一区二区| 93久久精品日日躁夜夜躁欧美| 成人性生交大片免费| 国模娜娜一区二区三区| 黑人精品欧美一区二区蜜桃| 欧美a级一区二区| 奇米一区二区三区av| 五月天亚洲婷婷| 免费在线一区观看| 麻豆精品久久精品色综合| 美国欧美日韩国产在线播放| 麻豆精品视频在线| 精品一区二区久久久| 国产高清精品久久久久| 成年人网站91| 99精品视频中文字幕| 日本高清视频一区二区| 欧美综合欧美视频| 欧美一级日韩一级| 日韩你懂的在线观看| 久久亚洲欧美国产精品乐播| 国产日韩欧美一区二区三区乱码| 国产精品免费观看视频| 一区二区三区四区精品在线视频 | 一本大道久久a久久综合| 96av麻豆蜜桃一区二区| 欧美调教femdomvk| 欧美一二三区在线观看| 国产色91在线| 亚洲欧美国产高清| 日本亚洲最大的色成网站www| 青青草成人在线观看| 国产一区二区福利视频| av一区二区三区四区| 欧美性一级生活| 精品国产伦一区二区三区观看方式 | 99精品视频中文字幕| 欧美日本在线观看| 久久色.com| 一个色综合av| 精品影视av免费| 91麻豆国产福利精品| 6080国产精品一区二区| 国产视频不卡一区| 污片在线观看一区二区| 国产大片一区二区| 欧美美女直播网站| 国产日韩欧美激情| 首页国产欧美久久| hitomi一区二区三区精品| 制服丝袜日韩国产| 亚洲欧美一区二区视频| 蜜臂av日日欢夜夜爽一区| 色婷婷久久一区二区三区麻豆| 日韩久久免费av| 亚洲综合一区二区精品导航| 国产在线国偷精品产拍免费yy| 日本精品一级二级| 久久免费视频一区| 香蕉成人啪国产精品视频综合网| 国产精品一区二区免费不卡 | 久久精品一区二区三区不卡| 亚洲国产成人tv| 国产不卡一区视频| 日韩视频在线观看一区二区| 亚洲人成在线播放网站岛国 | 日本成人在线网站| 色悠悠亚洲一区二区| 国产精品天干天干在线综合| 九九国产精品视频| 欧美日产国产精品| 亚洲狠狠丁香婷婷综合久久久| 成人综合在线视频| 久久久国产一区二区三区四区小说 | 91丨porny丨中文| 欧美韩国日本综合| 国产乱对白刺激视频不卡| 日韩免费性生活视频播放| 亚洲国产日韩精品| 欧美亚洲综合一区| 亚洲精品国产无套在线观| 国产69精品久久99不卡| 国产日韩综合av| 国产高清精品网站| 日本一区二区三区四区在线视频| 久久精品理论片| 欧美一区二区三区白人| 午夜成人免费视频| 欧美另类久久久品| 五月综合激情网| 欧美一区二区三区思思人| 视频一区欧美精品| 日韩欧美国产精品一区| 老司机精品视频在线| 久久夜色精品一区| 丁香婷婷综合色啪|