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

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

?? usbaer.c

?? 參考著寫其他的驅(qū)動程序就可以了。
?? 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;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩一区二区影院| 夜夜精品视频一区二区| 欧美成人性福生活免费看| 欧美亚洲一区三区| 日本乱人伦一区| 色又黄又爽网站www久久| 91亚洲男人天堂| av电影天堂一区二区在线观看| www.色综合.com| 91亚洲国产成人精品一区二三| 91麻豆国产在线观看| 一本色道亚洲精品aⅴ| 色综合网色综合| 欧美日韩国产美| 欧美一级欧美一级在线播放| 日韩午夜精品视频| 久久久亚洲国产美女国产盗摄| 日本一区二区三区dvd视频在线| 国产精品色噜噜| 综合久久一区二区三区| 亚洲一区中文在线| 奇米色一区二区| 国产精品一区二区在线观看网站| 成人一区二区视频| 91福利在线看| 91精品国产综合久久福利软件| 精品国产3级a| 日韩毛片一二三区| 午夜精品久久久久影视| 黄页网站大全一区二区| aa级大片欧美| 欧美日韩国产综合视频在线观看| 精品国产精品网麻豆系列 | 国产精品区一区二区三区| 国产精品蜜臀av| 亚洲精品乱码久久久久久久久| 亚洲v中文字幕| 国产精品一二三| 91久久精品一区二区二区| 精品欧美一区二区在线观看| 国产精品国产三级国产专播品爱网| 亚洲一区二区三区在线播放| 久久成人羞羞网站| 日本丶国产丶欧美色综合| 欧美一区二区私人影院日本| 欧美激情综合在线| 偷拍亚洲欧洲综合| 国产成人在线免费| 欧美日韩国产精品成人| 中文无字幕一区二区三区| 亚洲国产成人av网| 成人动漫av在线| 91精品国产色综合久久不卡蜜臀 | 国产免费成人在线视频| 亚洲午夜久久久久久久久电影网 | 韩国欧美国产一区| 色狠狠综合天天综合综合| 欧美成人官网二区| 亚洲一区二区三区四区在线观看| 国产精品91xxx| 欧美老年两性高潮| 综合网在线视频| 久久成人久久爱| 欧美三级日韩三级国产三级| 欧美国产一区视频在线观看| 日本女人一区二区三区| 一本大道av一区二区在线播放| 欧美大白屁股肥臀xxxxxx| 亚洲欧美一区二区三区国产精品| 国产综合色视频| 欧美乱熟臀69xxxxxx| 亚洲日本成人在线观看| 国产一级精品在线| 国产电影精品久久禁18| 欧美一卡二卡在线观看| 一区二区三区中文字幕| 国产高清亚洲一区| 欧美不卡123| 日韩成人免费电影| 欧美亚洲日本国产| 亚洲精品菠萝久久久久久久| 国产91精品一区二区麻豆亚洲| 日韩欧美在线1卡| 午夜影院在线观看欧美| 91黄色免费网站| 综合在线观看色| av一区二区三区四区| 欧美高清在线精品一区| 国产福利一区在线| 久久综合丝袜日本网| 蜜臀av性久久久久av蜜臀妖精 | 一区二区三区欧美在线观看| av电影天堂一区二区在线| 国产精品污www在线观看| 国产精品自在在线| 久久这里只精品最新地址| 九九久久精品视频| 欧美精品一区二区不卡| 久久99久久精品| www欧美成人18+| 国产一区二区三区免费播放| 久久先锋影音av| 国产精品亚洲人在线观看| 久久久久高清精品| 国产成人丝袜美腿| 中文字幕成人网| a级高清视频欧美日韩| 亚洲欧美偷拍卡通变态| 色伊人久久综合中文字幕| 一级精品视频在线观看宜春院| 欧美视频在线不卡| 丝袜美腿亚洲一区| 精品国内片67194| 国产在线精品不卡| 国产精品毛片久久久久久| 成人91在线观看| 一区二区三区加勒比av| 欧美伦理视频网站| 精品亚洲欧美一区| 久久亚洲精华国产精华液| 成人免费观看男女羞羞视频| 亚洲欧美国产77777| 欧美日韩在线观看一区二区| 日韩av一级片| 久久精品亚洲乱码伦伦中文| 99久精品国产| 五月综合激情日本mⅴ| 欧美成人video| 99久久精品免费看| 午夜精品久久一牛影视| 久久网站热最新地址| av动漫一区二区| 丝袜美腿成人在线| ww亚洲ww在线观看国产| 99久久精品国产一区二区三区| 性感美女久久精品| 久久久久国产一区二区三区四区| 91在线精品秘密一区二区| 午夜欧美视频在线观看| 久久综合九色欧美综合狠狠| 99久久精品国产一区二区三区| 亚洲444eee在线观看| 久久久久久久电影| 欧美在线你懂得| 国产在线不卡一区| 又紧又大又爽精品一区二区| 欧美一区二区三区四区视频| 成人免费av在线| 日韩国产欧美三级| 国产精品久久久久久久久图文区| 欧美视频精品在线| 高清在线不卡av| 五月综合激情婷婷六月色窝| 国产精品萝li| 日韩一区二区三区电影| 99久久精品国产观看| 美女高潮久久久| 亚洲欧美福利一区二区| 久久婷婷色综合| 欧美精品久久久久久久久老牛影院| 成人小视频在线| 免费成人在线播放| 亚洲蜜臀av乱码久久精品| 精品国产精品一区二区夜夜嗨| 91国产福利在线| 成人性视频免费网站| 免费久久精品视频| 亚洲一级片在线观看| 国产精品美女久久久久aⅴ| 欧美成人vr18sexvr| 欧美女孩性生活视频| 91在线国内视频| 成人永久免费视频| 久久国产精品第一页| 性感美女久久精品| 一级日本不卡的影视| 国产精品国产三级国产a| 精品国产髙清在线看国产毛片 | 亚洲精品日韩专区silk| 国产女人18毛片水真多成人如厕 | 亚洲青青青在线视频| 国产色一区二区| 欧美精品一区视频| 日韩欧美国产一区二区三区| 欧美日韩在线播放一区| 91免费小视频| 99re热视频精品| 不卡视频一二三| 成人av在线电影| 国产69精品久久777的优势| 免费成人在线视频观看| 日韩黄色一级片| 亚洲v中文字幕| 亚洲bt欧美bt精品| 亚洲福利视频一区二区| 亚洲综合偷拍欧美一区色| 中文字幕佐山爱一区二区免费| 中文字幕成人网| 国产精品久久久久天堂| 亚洲欧洲精品天堂一级|