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

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

?? ioctl.c

?? C51 USB1.1開發源碼及相關開發工具和文檔
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*++

Copyright (c) 1995  Microsoft Corporation

Module Name:

   ioctl.c

Abstract:

    USB device driver for Philips D12 USB test board

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) 1996 Microsoft Corporation.  All Rights Reserved.


Revision History:

    5-4-96 : created

--*/

#define DRIVER

#include "wdm.h"
#include "stdarg.h"
#include "stdio.h"

#include "usbdi.h"
#include "usbdlib.h"
#include "D12.h"

#include "ioctl.h"
#include "usbdlib.h"


PUSB_CONFIGURATION_DESCRIPTOR
D12_GetConfigDescriptor(
    IN PDEVICE_OBJECT DeviceObject
    )
/*++

Routine Description:

Arguments:

    DeviceObject - pointer to the device object for this instance of the 82930
                    devcice.


Return Value:

    NT status code

--*/
{
    PDEVICE_EXTENSION deviceExtension;
    NTSTATUS ntStatus;
    PURB urb;
    ULONG siz;
    PUSB_CONFIGURATION_DESCRIPTOR configurationDescriptor = NULL;

    D12_KdPrint (("D12TEST.SYS: enter D12_GetConfigDescriptor\n"));

    deviceExtension = DeviceObject->DeviceExtension;

    urb = ExAllocatePool(NonPagedPool,
                         sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST));

    if (urb) {

        // BUGBUG 82930 chokes if on the next command if you don't get
        // the entire descriptor on the first try

        siz = sizeof(USB_CONFIGURATION_DESCRIPTOR)+256;

get_config_descriptor_retry2:

        configurationDescriptor = ExAllocatePool(NonPagedPool,
                                                 siz);

        if (configurationDescriptor) {

            UsbBuildGetDescriptorRequest(urb,
                                         (USHORT) sizeof (struct _URB_CONTROL_DESCRIPTOR_REQUEST),
                                         USB_CONFIGURATION_DESCRIPTOR_TYPE,
                                         0,
                                         0,
                                         configurationDescriptor,
                                         NULL,
                                         siz,
                                         NULL);

            ntStatus = D12_CallUSBD(DeviceObject, urb);

            D12_KdPrint (("D12TEST.SYS: Configuration Descriptor = %x, len %x\n",
                            configurationDescriptor,
                            urb->UrbControlDescriptorRequest.TransferBufferLength));
        } else {
            ntStatus = STATUS_INSUFFICIENT_RESOURCES;
        }

        if (NT_SUCCESS(ntStatus) &&
            (urb->UrbControlDescriptorRequest.TransferBufferLength >= 
             sizeof(USB_CONFIGURATION_DESCRIPTOR)) &&
            (configurationDescriptor->wTotalLength >=
             sizeof(USB_CONFIGURATION_DESCRIPTOR)))
        {
            //
            // The Get Config Descriptor request did not return an error
            // AND at least enough data was transferred to fill a Config
            // Descriptor AND the Config Descriptor wLength is at least the
            // size of a Config Descriptor
            //
            if (configurationDescriptor->wTotalLength > siz)
            {
                //
                // The request buffer is not big enough to hold the
                // entire set of descriptors.  Free the current buffer
                // and retry with a buffer which should be big enough.
                //
                siz = configurationDescriptor->wTotalLength;
                ExFreePool(configurationDescriptor);
                configurationDescriptor = NULL;
                goto get_config_descriptor_retry2;
            }
            else if (configurationDescriptor->wTotalLength >
                     urb->UrbControlDescriptorRequest.TransferBufferLength)
            {
                //
                // The request buffer is greater than or equal to the
                // Config Descriptor wLength, but less data was transferred
                // than wLength.  Return NULL to indicate a device error.
                //
                ExFreePool(configurationDescriptor);
                configurationDescriptor = NULL;
            }
            //
            // else  everything is OK with the Config Descriptor, return it.
            //
        }
        else
        {
            //
            // The Get Config Descriptor request returned an error OR
            // not enough data was transferred to fill a Config Descriptor
            // OR the Config Descriptor wLength is less than the size of
            // a Config Descriptor.  Return NULL to indicate a device error.
            //
            ExFreePool(configurationDescriptor);
            configurationDescriptor = NULL;
        }

        ExFreePool(urb);

    } else {
        ntStatus = STATUS_INSUFFICIENT_RESOURCES;
    }

    D12_KdPrint (("D12TEST.SYS: exit D12_GetConfigDescriptor\n"));

    return configurationDescriptor;
}




NTSTATUS
D12_GetPortStatus(
    IN PDEVICE_OBJECT DeviceObject,
    IN PULONG PortStatus
    )
/*++

Routine Description:

    returns the port status for our device

Arguments:

Return Value:

    STATUS_SUCCESS if successful,
    STATUS_UNSUCCESSFUL otherwise

--*/
{
    NTSTATUS ntStatus, status = STATUS_SUCCESS;
    PIRP irp;
    KEVENT event;
    IO_STATUS_BLOCK ioStatus;
    PIO_STACK_LOCATION nextStack;
    PDEVICE_EXTENSION deviceExtension;

    D12_KdPrint (("D12TEST.SYS: enter D12_GetPortStatus\n"));

    deviceExtension = DeviceObject->DeviceExtension;

    *PortStatus = 0;

    //
    // issue a synchronous request
    //

    KeInitializeEvent(&event, NotificationEvent, FALSE);

    irp = IoBuildDeviceIoControlRequest(
                IOCTL_INTERNAL_USB_GET_PORT_STATUS,
                deviceExtension->TopOfStackDeviceObject,
                NULL,
                0,
                NULL,
                0,
                TRUE, /* INTERNAL */
                &event,
                &ioStatus);

    //
    // Call the class driver to perform the operation.  If the returned status
    // is PENDING, wait for the request to complete.
    //

    nextStack = IoGetNextIrpStackLocation(irp);
    ASSERT(nextStack != NULL);

    nextStack->Parameters.Others.Argument1 = PortStatus;

    D12_KdPrint (("D12TEST.SYS: calling USBD port status api\n"));

    ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject,
                            irp);

    D12_KdPrint (("D12TEST.SYS: return from IoCallDriver USBD %x\n", ntStatus));

    if (ntStatus == STATUS_PENDING) {

        D12_KdPrint (("D12TEST.SYS: Wait for single object\n"));

        status = KeWaitForSingleObject(
                       &event,
                       Suspended,
                       KernelMode,
                       FALSE,
                       NULL);

        D12_KdPrint (("D12TEST.SYS: Wait for single object, returned %x\n", status));
        
    } else {
        ioStatus.Status = ntStatus;
    }

    D12_KdPrint (("D12TEST.SYS: Port status = %x\n", *PortStatus));

    //
    // USBD maps the error code for us
    //
    ntStatus = ioStatus.Status;

    D12_KdPrint (("D12TEST.SYS: D12_GetPortStatus (%x)\n", ntStatus));

    return ntStatus;
}


NTSTATUS
D12_ResetParentPort(
    IN IN PDEVICE_OBJECT DeviceObject
    )
/*++

Routine Description:

    Reset the our parent port

Arguments:

Return Value:

    STATUS_SUCCESS if successful,
    STATUS_UNSUCCESSFUL otherwise

--*/
{
    NTSTATUS ntStatus, status = STATUS_SUCCESS;
    PIRP irp;
    KEVENT event;
    IO_STATUS_BLOCK ioStatus;
    PIO_STACK_LOCATION nextStack;
    PDEVICE_EXTENSION deviceExtension;

    D12_KdPrint (("D12TEST.SYS: enter D12_ResetPort\n"));

    deviceExtension = DeviceObject->DeviceExtension;

    //
    // issue a synchronous request
    //

    KeInitializeEvent(&event, NotificationEvent, FALSE);

    irp = IoBuildDeviceIoControlRequest(
                IOCTL_INTERNAL_USB_RESET_PORT,
                deviceExtension->TopOfStackDeviceObject,
                NULL,
                0,
                NULL,
                0,
                TRUE, /* INTERNAL */
                &event,
                &ioStatus);

    //
    // Call the class driver to perform the operation.  If the returned status
    // is PENDING, wait for the request to complete.
    //

    nextStack = IoGetNextIrpStackLocation(irp);
    ASSERT(nextStack != NULL);

    D12_KdPrint (("D12TEST.SYS: calling USBD enable port api\n"));

    ntStatus = IoCallDriver(deviceExtension->TopOfStackDeviceObject,
                            irp);
                            
    D12_KdPrint (("D12TEST.SYS: return from IoCallDriver USBD %x\n", ntStatus));

    if (ntStatus == STATUS_PENDING) {

        D12_KdPrint (("D12TEST.SYS: Wait for single object\n"));

        status = KeWaitForSingleObject(
                       &event,
                       Suspended,
                       KernelMode,
                       FALSE,
                       NULL);

        D12_KdPrint (("D12TEST.SYS: Wait for single object, returned %x\n", status));
        
    } else {
        ioStatus.Status = ntStatus;
    }

    //
    // USBD maps the error code for us
    //
    ntStatus = ioStatus.Status;

    D12_KdPrint (("D12TEST.SYS: D12_ResetPort (%x)\n", ntStatus));

    return ntStatus;
}


NTSTATUS
D12_ReadWriteRegister(

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人高清免费观看| 久久蜜桃av一区二区天堂| 欧美videossexotv100| 国产欧美久久久精品影院| 午夜免费久久看| 99久久精品国产精品久久| 日韩欧美成人激情| 天天影视色香欲综合网老头| 成人av电影在线网| 久久久无码精品亚洲日韩按摩| 五月天久久比比资源色| 99精品国产热久久91蜜凸| 精品国内片67194| 麻豆精品精品国产自在97香蕉| 色综合一区二区| 国产精品高潮久久久久无| 国产成人三级在线观看| 精品国产在天天线2019| 日韩高清不卡在线| 欧美日韩日日夜夜| 亚洲一区二区在线免费观看视频| 一本色道久久综合亚洲精品按摩| 国产精品视频在线看| 国产成人午夜电影网| 久久美女艺术照精彩视频福利播放| 麻豆精品蜜桃视频网站| 日韩女同互慰一区二区| 狠狠色狠狠色合久久伊人| 精品成人a区在线观看| 麻豆一区二区在线| 精品日韩一区二区三区| 国产一区二区三区久久久| 久久久久久久综合| 国产大陆精品国产| 欧美国产97人人爽人人喊| 国产 欧美在线| 国产精品国产三级国产三级人妇| av毛片久久久久**hd| 亚洲黄色录像片| 欧美日韩一区二区三区四区| 日韩成人精品在线| 日韩美女视频在线| 成人午夜大片免费观看| 亚洲色图色小说| 欧美丝袜自拍制服另类| 秋霞午夜av一区二区三区| 亚洲精品在线观看网站| 国产精品综合av一区二区国产馆| 国产精品视频线看| 欧美自拍偷拍一区| 韩国欧美国产1区| 综合久久久久久| 欧美日韩1区2区| 国产一区二区导航在线播放| 国产精品久久久久桃色tv| 欧美亚洲禁片免费| 免费人成精品欧美精品| 中文字幕精品—区二区四季| 91麻豆免费看片| 欧美aaaaaa午夜精品| 国产精品免费av| 4438亚洲最大| 国产福利精品导航| 一区二区三区中文免费| 欧美mv和日韩mv国产网站| 成人激情黄色小说| 日韩中文字幕亚洲一区二区va在线| 国产亚洲人成网站| 欧美日精品一区视频| 国产精品亚洲视频| 亚洲福中文字幕伊人影院| 欧美激情在线观看视频免费| 欧美日韩国产一二三| 懂色av噜噜一区二区三区av| 亚洲高清一区二区三区| 国产精品免费网站在线观看| 欧美二区在线观看| 色综合天天在线| 粉嫩蜜臀av国产精品网站| 男女男精品视频| 亚洲人精品午夜| 国产三级一区二区| 欧美一级专区免费大片| 欧洲一区在线电影| 成人福利视频在线看| 久久精品国产色蜜蜜麻豆| 亚洲午夜在线电影| 亚洲免费三区一区二区| 国产精品视频免费看| 久久嫩草精品久久久精品一| 91精品国产综合久久福利| 欧美人妖巨大在线| 色婷婷一区二区三区四区| 国产成人亚洲综合a∨婷婷| 九九**精品视频免费播放| 日韩精彩视频在线观看| 一区二区免费视频| 亚洲激情校园春色| 亚洲精品成人悠悠色影视| 亚洲国产精品ⅴa在线观看| 久久青草国产手机看片福利盒子| 欧美一区在线视频| 欧美久久高跟鞋激| 欧美精品九九99久久| 欧美精品少妇一区二区三区| 在线免费精品视频| 在线看不卡av| 日本国产一区二区| 一本久道久久综合中文字幕| 99精品欧美一区二区三区小说 | 亚洲成a人v欧美综合天堂下载| 国产精品丝袜91| 国产精品久久久久久久久搜平片 | 欧美一区三区二区| 欧美高清性hdvideosex| 欧美精品v日韩精品v韩国精品v| 欧美人成免费网站| 日韩一级片在线观看| 日韩免费观看高清完整版| 精品精品国产高清一毛片一天堂| 91精品国产免费| 欧美sm极限捆绑bd| 国产亚洲欧美日韩在线一区| 国产精品色眯眯| 综合在线观看色| 亚洲在线观看免费视频| 日产欧产美韩系列久久99| 久久99久久99小草精品免视看| 久久99久久久久| 韩国毛片一区二区三区| 成人免费不卡视频| 欧美性大战久久久久久久| 日韩午夜激情视频| 久久久精品国产免费观看同学| 国产精品私房写真福利视频| 一区二区三区.www| 日本不卡一二三| 国产成人午夜视频| 欧美亚洲综合久久| 日韩女优制服丝袜电影| 国产精品私人影院| 午夜日韩在线电影| 国产麻豆精品久久一二三| 一本到不卡免费一区二区| 在线播放中文字幕一区| 日本一区二区三区视频视频| 亚洲品质自拍视频| 免费高清成人在线| 成人激情av网| 91精品国产综合久久精品app| 久久亚区不卡日本| 一区二区久久久| 国产夫妻精品视频| 欧美日产在线观看| 国产精品久久久一本精品| 奇米一区二区三区| 91麻豆免费视频| 久久人人爽人人爽| 午夜国产精品一区| 高清免费成人av| 欧美一区二区三区四区五区 | 在线观看亚洲成人| 精品欧美乱码久久久久久1区2区| 亚洲日穴在线视频| 奇米精品一区二区三区四区| 91小视频免费看| 国产日韩欧美a| 麻豆精品新av中文字幕| 欧美日韩一区二区三区高清| 国产精品国产三级国产普通话99 | 麻豆中文一区二区| 欧美性猛片aaaaaaa做受| 亚洲国产高清不卡| 日韩成人免费看| 视频一区中文字幕国产| 国产馆精品极品| 日韩欧美国产精品一区| 亚洲伊人色欲综合网| aaa欧美大片| 亚洲精品一区二区三区四区高清| 午夜精品福利在线| 欧美视频你懂的| 亚洲精品写真福利| a级精品国产片在线观看| 久久综合色8888| 国产在线播放一区三区四| 日韩一区和二区| 奇米影视7777精品一区二区| 欧美日产在线观看| 亚洲成人免费电影| 欧美精品少妇一区二区三区| 亚洲无线码一区二区三区| 日本精品一级二级| 一区二区三区在线播放| 91福利精品视频| 亚洲一区电影777| 欧美日韩国产一区二区三区地区| 亚洲国产成人porn| 91精品国产91久久久久久一区二区| 五月天激情综合|