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

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

?? usbios.c

?? 一個好用的MS的USB驅動編程工具包,希望有用.
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*++

Copyright (c) 1999 Microsoft Corporation

Module Name:

    Usbios.c 

Abstract:

    USB device driver for USB LS-120 drive
    Interface for IOS I/O requests

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:

    01/13/99: MRB  Adapted from BULKUSB DDK sample.

--*/
#define GLOBAL_VARS

#include "wdm.h"
#include "stdarg.h"
#include "stdio.h"
#include "usbdi.h"
#include "usbdlib.h"
#include "usbls120.h"
#include "USBLS120.h"




PDEVICE_OBJECT _stdcall
USBLS120_GetNextPDO(
    IN PDEVICE_OBJECT *Fdo
    )
/*++
Routine Description:

    Called by the IOS port driver. Walks list of FDOs 
    associated with this driver, returning the PDO the FDO
    is attached to.  Allows IOS port driver to distinguish
    between multiple instances of the USB LS-120 drive.

 Arguments:

    DeviceObject -- ptr to previous FDO, or NULL if returning 1st PDO

Return Value:

    Next PDO, or
    NULL if no more FDOs associated with this driver.
--*/
{
    PDEVICE_EXTENSION DeviceExtension;

    // First Fdo?
    if (NULL == *Fdo) {

        // Get first Device Object associated with this driver
        *Fdo = USBLS120DriverObject->DeviceObject;

    } else {

        // Get next device object for this driver
        *Fdo = (*Fdo)->NextDevice;
    }

    // No more device obects?
    if (NULL == *Fdo)
        return NULL;

    //Filter out our own child PDOs
    DeviceExtension = (*Fdo)->DeviceExtension;

    while (DO_FDO != DeviceExtension->DeviceObjectType) {
        *Fdo = (*Fdo)->NextDevice;
        if (NULL == *Fdo)
            return NULL;
        DeviceExtension = (*Fdo)->DeviceExtension;
    }

    return DeviceExtension->PhysicalDeviceObject;
}
	


VOID _stdcall
USBLS120_RegisterCompletionHandler(
    PDEVICE_OBJECT DeviceObject,
    COMPLETION_HANDLER CompletionHandler
    )
/*++
Routine Description:

    Called by the IOS port driver. Registers a completion
    handler in the port driver that is called whenever
    we complete an I/O request.

 Arguments:

    DeviceObject -- FDO we are registering the completion handler for.
    CompletionHandler - Address of completion handler.

Return Value:

    None.        
--*/
{
    PDEVICE_EXTENSION DeviceExtension;

    USBLS120_KdPrint( DBGLVL_HIGH,("enter USBLS120_RegisterCompletionHandler\n"));

    DeviceExtension = DeviceObject->DeviceExtension;
	
    DeviceExtension->CompleteRequest = CompletionHandler;
}


VOID _stdcall
USBLS120_StartRequest(
    IN PIOPACKET IoPacket
    )
/*++
Routine Description:

    Called by the IOS port driver to start an I/O request

    Please Note!! - All USB transfers that occur in response
    to this request must be done asynchronously.  IOS/IFSMGR
    implements their own thread blocking mechanism, and it
    is possible to create a race condition if we also block
    waiting for a USB transfer to complete.

 Arguments:

    IoPacket -- Structure containing pertient information about the
                I/O request.

Return Value:

    None.
--*/
{
    PURB Urb;
    PIRP Irp;
    CHAR StackSize;
    PDEVICE_EXTENSION DeviceExtension;
    PIO_STACK_LOCATION NextStack;
    ULONG UrbSize;
    ULONG i;
    PDEVICE_OBJECT DeviceObject;

    USBLS120_KdPrint( DBGLVL_HIGH,("enter USBLS120_TransferCommand\n"));

    USBLS120_KdPrint( DBGLVL_HIGH,("DataBuffer=%x, DataLength=%x, Flags=%x, Iop=%x\n",
                     IoPacket->DataBuffer,
                     IoPacket->DataLength,
                     IoPacket->Flags,
                     IoPacket->Iop));

#ifdef DBG
    // Dump CDB contents
    for (i=0; i<IoPacket->CdbLength; i++)
                USBLS120_KdPrint( DBGLVL_HIGH,("  CDB[%x]=%x\n", i,((char*)(IoPacket->Cdb))[i]));
#endif

    DeviceObject = (PDEVICE_OBJECT)(IoPacket->Fdo);

    DeviceExtension = DeviceObject->DeviceExtension;

    // Allocate IRP for our I/O request
    StackSize = (CCHAR)(DeviceExtension->TopOfStackDeviceObject->StackSize + 1);
    Irp = IoAllocateIrp(StackSize, FALSE);

    if (!Irp) {
        USBLS120_KdPrint( DBGLVL_MINIMUM,("Failure due to memory error\n"));

        // Can't allocate IRP - complete request with error and return
        IoPacket->Status = IO_STATUS_OUT_OF_MEMORY;
        DeviceExtension->CompleteRequest(IoPacket);
        return;
    }
	
    // Allocate URB.  It will be reused for the data transfer, so insure
    // it is large enough for both control and bulk transfers
    UrbSize = max(sizeof (struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST),
                  sizeof (struct _URB_BULK_OR_INTERRUPT_TRANSFER) );

    Urb = ExAllocatePool(NonPagedPool, UrbSize);

    if (!Urb) {
        USBLS120_KdPrint( DBGLVL_MINIMUM,("Failure due to memory error\n"));

        IoFreeIrp(Irp);

        IoPacket->Status = IO_STATUS_OUT_OF_MEMORY;
        DeviceExtension->CompleteRequest(IoPacket);
        return;
    }
	
    // Store all the transfer request info in our device extension
    DeviceExtension->Urb = Urb;
    DeviceExtension->Irp = Irp;
    DeviceExtension->CurrentSGD = 0;
    DeviceExtension->IoPacket = IoPacket;

    if (IoPacket->Flags & (IO_FLAGS_DATA_IN | IO_FLAGS_DATA_OUT))
        DeviceExtension->DataLeft = IoPacket->DataLength;
    else
        DeviceExtension->DataLeft = 0;


    // Build URB for the ADSC command used to send the CDB to our USB drive
    UsbBuildVendorRequest(
        Urb,
        URB_FUNCTION_CLASS_INTERFACE,
        (USHORT) sizeof (struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST),
        0,
        0,
        ADSC,
        0,
        0,
        IoPacket->Cdb,
        NULL,
        IoPacket->CdbLength,
        NULL
        );

    NextStack = IoGetNextIrpStackLocation(Irp);
    

    USBLS120_ASSERT(NextStack != NULL);
    USBLS120_ASSERT(DeviceObject->StackSize>1);

    // Initialize our Irp
    NextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL;
    NextStack->Parameters.Others.Argument1 = Urb;
    NextStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_URB;

    // Register our Irp completion handler
    IoSetCompletionRoutine(
        Irp,
        USBLS120_TransferCommandComplete,
        DeviceObject, 
        TRUE,    // invoke on success
        TRUE,    // invoke on error
        TRUE     // invoke on cancellation of the Irp
        );

    USBLS120_IncrementIoCount(DeviceObject);


    // Pass Irp to the USB driver stack
    // We don't look at the return status, since we will 
    // always complete the request IOS request in the 
    // completion handler, regardless of success or error.
    IoCallDriver(DeviceExtension->TopOfStackDeviceObject, Irp);
}


NTSTATUS
USBLS120_TransferCommandComplete(
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Reference
    )
/*++
Routine Description:

    Completion handler for command phase of I/O request.

 Arguments:

    DeviceObject - Previous device object.
    Irp - Irp used for sending command.
    Reference - Our FDO.

Return Value:

    STATUS_SUCCESS if successful.
--*/

{
    NTSTATUS NtStatus;
    PURB Urb;
    PIO_STACK_LOCATION irpStack;
    PDEVICE_EXTENSION DeviceExtension;
    PIOPACKET IoPacket;

    USBLS120_KdPrint( DBGLVL_HIGH,("enter USBLS120_TransferCommandComplete\n"));


    USBLS120_DecrementIoCount((PDEVICE_OBJECT)Reference);

    DeviceExtension = ((PDEVICE_OBJECT)(Reference))->DeviceExtension;
    IoPacket = DeviceExtension->IoPacket;

    Urb = DeviceExtension->Urb;
	    
    USBLS120_KdPrint(
        DBGLVL_HIGH,
        ("Urb Status=%x, Irp Status=%x\n",
        Urb->UrbHeader.Status,
        Irp->IoStatus.Status)
        );

    NtStatus = Irp->IoStatus.Status;
	
    if (!NT_SUCCESS(NtStatus)) {
        USBLS120_KdPrint( DBGLVL_MINIMUM,("Command Block Failure!!!\n"));

        IoFreeIrp(Irp);
        ExFreePool(Urb);

        // Device failed Command Block, complete with error
        IoPacket->Status = IO_STATUS_DEVICE_ERROR;
        DeviceExtension->CompleteRequest(IoPacket);

    } else if (0 != DeviceExtension->DataLeft) {
        // Normally we would simply start transferring the bulk data right now.
        // However, this function is called in the context of the completion
        // handler for the command transfer.  There is a bug in the Windows 
        // 98 golden version of UHCD.SYS that disables bandwidth reclamation 
        // during IRP completion.  This means that any bulk transfers scheduled 
        // at this time would only transfer at 1 packet per frame, approximately 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕电影一区| 中文字幕亚洲综合久久菠萝蜜| 国产精品18久久久久| 一区二区三区中文字幕精品精品 | 国产91精品一区二区麻豆网站| 亚洲欧美国产77777| 日韩欧美在线123| 在线视频中文字幕一区二区| 国产精一品亚洲二区在线视频| 午夜亚洲国产au精品一区二区| 国产精品欧美精品| 久久久久久影视| 欧美一区二区视频网站| 在线观看视频欧美| 99久久精品免费| 国产成人综合视频| 久久不见久久见免费视频7| 一区二区三区四区在线| 国产精品每日更新| 国产欧美视频在线观看| 日韩女同互慰一区二区| 欧美日韩一卡二卡| 欧美午夜精品一区二区三区| 99久久综合狠狠综合久久| 国产精品白丝jk白祙喷水网站| 蜜桃av噜噜一区二区三区小说| 亚洲愉拍自拍另类高清精品| 成人免费一区二区三区视频 | 另类欧美日韩国产在线| 亚洲一区二区在线播放相泽| 亚洲精品视频自拍| 亚洲三级在线免费观看| 中文字幕日韩精品一区| 国产精品国产三级国产普通话99| 国产欧美一区二区三区在线看蜜臀 | 99视频有精品| 97aⅴ精品视频一二三区| 波多野结衣中文字幕一区二区三区| 国产一区二区在线看| 国产麻豆视频精品| 高清不卡一二三区| 丁香激情综合国产| av电影在线观看不卡| av午夜一区麻豆| 91在线观看污| 99久久久国产精品| 色一情一伦一子一伦一区| 在线观看免费视频综合| 在线免费观看日韩欧美| 欧美性生活影院| 欧美日韩午夜在线视频| 91精品国产高清一区二区三区| 欧美一级日韩一级| 欧美va在线播放| 国产婷婷色一区二区三区在线| 亚洲国产岛国毛片在线| 亚洲天堂av老司机| 午夜精品123| 久久爱另类一区二区小说| 国产一区欧美日韩| 91最新地址在线播放| 在线精品视频小说1| 91麻豆精品久久久久蜜臀| 精品处破学生在线二十三| 中文一区二区在线观看| 亚洲色图.com| 另类小说图片综合网| 丁香六月综合激情| 精品视频在线免费观看| 日韩精品中午字幕| 国产日产欧美一区| 亚洲第一狼人社区| 国产一区二区三区在线观看免费| jizzjizzjizz欧美| 欧美日韩国产成人在线91| 精品国产第一区二区三区观看体验| 久久亚洲一区二区三区明星换脸| 1024国产精品| 日韩高清在线观看| 成人免费毛片aaaaa**| 欧美日韩免费不卡视频一区二区三区| 欧美电视剧在线看免费| 亚洲免费在线看| 精品亚洲成a人在线观看| 日本道免费精品一区二区三区| 日韩欧美一区二区三区在线| 国产精品欧美经典| 久久精品国产澳门| 在线影院国内精品| 久久精品日产第一区二区三区高清版| 亚洲男同性恋视频| 黄色小说综合网站| 欧美日韩精品一区二区三区蜜桃| 国产亚洲综合在线| 日本欧美一区二区三区| 91视频观看视频| 久久久无码精品亚洲日韩按摩| 亚洲成人在线免费| 粉嫩av一区二区三区在线播放| 欧美丰满一区二区免费视频| 欧美激情在线一区二区| 亚洲免费电影在线| 国产一本一道久久香蕉| 欧美亚洲免费在线一区| 久久久国际精品| 日本午夜精品视频在线观看| 成人av免费在线播放| 欧美一二三四在线| 亚洲美女视频在线观看| 国内精品免费**视频| 91久久久免费一区二区| 自拍视频在线观看一区二区| 久久99蜜桃精品| 欧美日韩免费在线视频| 中文字幕在线一区二区三区| 日本成人中文字幕| 99热99精品| 国产精品毛片无遮挡高清| 久久精品国产成人一区二区三区| 欧美在线free| 中文字幕不卡一区| 激情综合色丁香一区二区| 日韩欧美中文一区| 亚洲自拍偷拍欧美| av在线不卡电影| 久久久精品国产免费观看同学| 日本中文字幕一区| 91丨九色丨蝌蚪丨老版| 中文字幕一区在线| 丁香天五香天堂综合| 欧美xxxx在线观看| 蜜臀久久久99精品久久久久久| 在线影视一区二区三区| 亚洲午夜视频在线| 91激情在线视频| 中文字幕在线一区| 成人一区二区三区中文字幕| 欧美成人a在线| 日日欢夜夜爽一区| 欧美在线小视频| 亚洲欧美日韩中文播放 | 5566中文字幕一区二区电影| 国产精品福利影院| 成人丝袜18视频在线观看| 久久综合九色综合欧美98| 蜜臂av日日欢夜夜爽一区| 宅男噜噜噜66一区二区66| 亚洲色图.com| 欧美精选在线播放| 首页国产丝袜综合| 日韩一二三区视频| 秋霞电影网一区二区| 正在播放亚洲一区| 国产原创一区二区| 日本一区免费视频| 国产成人av影院| 中文字幕一区不卡| 99视频热这里只有精品免费| 一区二区三区久久久| 在线欧美一区二区| 日日夜夜精品免费视频| 日韩亚洲电影在线| 视频一区二区三区中文字幕| 欧美精品一区男女天堂| 国产一区二区在线影院| 国产欧美一区二区在线| 99视频一区二区三区| 国产精品天天摸av网| 欧美视频在线一区二区三区 | 国产精品美女久久久久久2018| a级精品国产片在线观看| 亚洲欧洲制服丝袜| 欧美日韩欧美一区二区| 卡一卡二国产精品 | 亚洲国产视频一区二区| 91精品国产综合久久久蜜臀粉嫩| 蜜臀久久久久久久| 久久嫩草精品久久久精品| 91丨九色丨国产丨porny| 亚洲成人三级小说| 亚洲精品一区二区三区影院| 成人激情av网| 亚洲一二三四区| 亚洲精品一线二线三线无人区| 麻豆成人免费电影| 亚洲狼人国产精品| 欧美一区二区成人| 国产99久久久国产精品免费看| 亚洲精品国产精华液| 久久色.com| 在线一区二区视频| 国产一区二区不卡| 亚洲电影在线免费观看| 日韩午夜三级在线| 欧美亚洲丝袜传媒另类| 国产黄色精品网站| 午夜国产精品一区| 国产欧美日韩精品一区| 欧美色中文字幕| 丁香一区二区三区|