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

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

?? usb.c

?? 微軟的point of sale的源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*++

Copyright (c) 1999  Microsoft Corporation

Module Name:

    usb.c

Abstract: ESC/POS (serial) interface for USB Point-of-Sale devices

Author:

    ervinp

Environment:

    Kernel mode

Revision History:


--*/

#include <WDM.H>

#include <usbdi.h>
#include "usbdlib.h"
#include <usbioctl.h>

#include "escpos.h"
#include "debug.h"


NTSTATUS InitUSB(PARENTFDOEXT *parentFdoExt)
/*++

Routine Description:

    Intialize USB-related data

Arguments:

    parentFdoExt - device extension for targetted device object

Return Value:

    NT status code

--*/
{
	NTSTATUS status;

	status = GetDeviceDescriptor(parentFdoExt);
	if (NT_SUCCESS(status)){
		status = GetConfigDescriptor(parentFdoExt);
		if (NT_SUCCESS(status)){
			status = SelectConfiguration(parentFdoExt);
		}
	}

	return status;
}




NTSTATUS GetConfigDescriptor(PARENTFDOEXT *parentFdoExt)
/*++

Routine Description:

    Function retrieves the configuration descriptor from the device

Arguments:

    parentFdoExt - device extension for targetted device object

Return Value:

    NT status code

--*/
{
    URB urb = { 0 };
    USB_CONFIGURATION_DESCRIPTOR configDescBase = { 0 };
    NTSTATUS status;

    PAGED_CODE();

    /*
     *  Get the first part of the configuration descriptor.
     *  It will tell us the size of the full configuration descriptor, 
     *  including all the following interface descriptors, etc.
     */

    UsbBuildGetDescriptorRequest(&urb,
                                 (USHORT) sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
                                 USB_CONFIGURATION_DESCRIPTOR_TYPE,
                                 0,
                                 0,
                                 (PVOID)&configDescBase,
                                 NULL,
                                 sizeof(USB_CONFIGURATION_DESCRIPTOR),
                                 NULL);

    status = SubmitUrb(parentFdoExt->topDevObj, &urb, TRUE, NULL, NULL);

    if (NT_SUCCESS(status)) {

        ULONG configDescLen = configDescBase.wTotalLength;
 
        /*
         *  Now allocate the right-sized buffer for the full configuration descriptor.
         */
        ASSERT(configDescLen < 0x1000);
        parentFdoExt->configDesc = ALLOCPOOL(NonPagedPool, configDescLen);
        if (parentFdoExt->configDesc) {

            RtlZeroMemory(parentFdoExt->configDesc, configDescLen);

            UsbBuildGetDescriptorRequest(&urb,
                                         (USHORT) sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
                                         USB_CONFIGURATION_DESCRIPTOR_TYPE,
                                         0,
                                         0,
                                         parentFdoExt->configDesc,
                                         NULL,
                                         configDescLen,
                                         NULL);

            status = SubmitUrb(parentFdoExt->topDevObj, &urb, TRUE, NULL, NULL);

            if (NT_SUCCESS(status)) {
                DBGVERBOSE(("Got config desc @ %ph, len=%xh.", parentFdoExt->configDesc, urb.UrbControlDescriptorRequest.TransferBufferLength));
                ASSERT(urb.UrbControlDescriptorRequest.TransferBufferLength == configDescLen);
            }
        }
        else {
            status = STATUS_INSUFFICIENT_RESOURCES;
        }
    }

    ASSERT(NT_SUCCESS(status));
    return status;
}



NTSTATUS GetDeviceDescriptor(PARENTFDOEXT *parentFdoExt)
/*++

Routine Description:

    Function retrieves the device descriptor from the device

Arguments:

    parentFdoExt - device extension for targetted device object

Return Value:

    NT status code

--*/
{
    URB urb;
    NTSTATUS status;

    PAGED_CODE();

    RtlZeroMemory(&parentFdoExt->deviceDesc, sizeof(parentFdoExt->deviceDesc));

    UsbBuildGetDescriptorRequest(&urb,
                                 (USHORT) sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST),
                                 USB_DEVICE_DESCRIPTOR_TYPE,
                                 0,
                                 0,
                                 (PVOID)&parentFdoExt->deviceDesc,
                                 NULL,
                                 sizeof(parentFdoExt->deviceDesc),
                                 NULL);

    status = SubmitUrb(parentFdoExt->topDevObj, &urb, TRUE, NULL, NULL);

    if (NT_SUCCESS(status)){
        DBGVERBOSE(("Got device desc @ %ph, len=%xh (should be %xh).", (PVOID)&parentFdoExt->deviceDesc, urb.UrbControlDescriptorRequest.TransferBufferLength, sizeof(parentFdoExt->deviceDesc)));
    }

    ASSERT(NT_SUCCESS(status));
    return status;
}





NTSTATUS ReadPipe(	PARENTFDOEXT *parentFdoExt, 
			USBD_PIPE_HANDLE pipeHandle, 
			READPACKET *readPacket,
			BOOLEAN synchronous
			)
{
    PURB urb;
    NTSTATUS status;

    ASSERT(pipeHandle);
    DBGVERBOSE(("ReadPipe: dataLen=%xh, sync=%xh", readPacket->length, (ULONG)synchronous));

    urb = ALLOCPOOL(NonPagedPool, sizeof(URB));
    if (urb){
        RtlZeroMemory(urb, sizeof(URB));

        urb->UrbBulkOrInterruptTransfer.Hdr.Function = URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER;
        urb->UrbBulkOrInterruptTransfer.Hdr.Length = sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER);
        urb->UrbBulkOrInterruptTransfer.PipeHandle = pipeHandle;
        urb->UrbBulkOrInterruptTransfer.TransferBufferLength = readPacket->length;
        urb->UrbBulkOrInterruptTransfer.TransferBufferMDL = NULL;
        urb->UrbBulkOrInterruptTransfer.TransferBuffer = readPacket->data;
        urb->UrbBulkOrInterruptTransfer.TransferFlags = USBD_SHORT_TRANSFER_OK | USBD_TRANSFER_DIRECTION_IN;
        urb->UrbBulkOrInterruptTransfer.UrbLink = NULL;

        if (synchronous){
            /*
             *  Synchronous read.
             */
            status = SubmitUrb(parentFdoExt->topDevObj, urb, TRUE, NULL, 0);
            readPacket->length = urb->UrbBulkOrInterruptTransfer.TransferBufferLength;
            FREEPOOL(urb);
        }
        else {
            /*
             *  Asynchronous read.
             *  Completion routine will free URB.
             */
            IncrementPendingActionCount(parentFdoExt);
            readPacket->urb = urb;
            status = SubmitUrb(	parentFdoExt->topDevObj, 
					            urb, 
					            FALSE,					// asynchronous
					            ReadPipeCompletion,		// completion routine
					            readPacket				// completion context
					            );
        }
    }
    else {
        status = STATUS_INSUFFICIENT_RESOURCES;
    }

    return status;
}



NTSTATUS ReadPipeCompletion(IN PDEVICE_OBJECT devObj, IN PIRP irp, IN PVOID context)
{
    READPACKET *readPacket = (READPACKET *)context;
    NTSTATUS status = irp->IoStatus.Status;
    POSPDOEXT *pdoExt;
    KIRQL oldIrql;

    ASSERT(readPacket->signature == READPACKET_SIG);
    pdoExt = readPacket->context;


    /*
     *  Set the readPacket's length to the actual length returned by the device.
     */
    ASSERT(readPacket->urb->UrbBulkOrInterruptTransfer.TransferBufferLength <= readPacket->length);
    readPacket->length = readPacket->urb->UrbBulkOrInterruptTransfer.TransferBufferLength;

    DBGVERBOSE(("ReadPipeCompletion: irp=%ph, status=%xh, data=%ph, len=%xh, context=%ph.", irp, status, readPacket->data, readPacket->length, readPacket->context)); 

    FREEPOOL(readPacket->urb);
    readPacket->urb = BAD_POINTER;

    if (NT_SUCCESS(status)){

	    DBGSHOWBYTES("READ PIPE result", readPacket->data, readPacket->length);

	    if (pdoExt){

		    KeAcquireSpinLock(&pdoExt->devExtSpinLock, &oldIrql);

		    ASSERT(pdoExt->inputEndpointInfo.endpointIsBusy);
		    pdoExt->inputEndpointInfo.endpointIsBusy = FALSE;

		    /*
		     *  Queue this completed readPacket
		     */
		    ASSERT(readPacket->offset == 0);

		    /*
		     *  Do NOT queue empty readPackets.
		     */
            if(readPacket->length == 0)
                FreeReadPacket(readPacket);
            else {
                InsertTailList(&pdoExt->completedReadPacketsList, &readPacket->listEntry);
                pdoExt->totalQueuedReadDataLength += readPacket->length;
            }

		    KeReleaseSpinLock(&pdoExt->devExtSpinLock, oldIrql);

		    /*
		     *  Now try to satisfy pending read IRPs with the completed readPacket data.
		     */
		    SatisfyPendingReads(pdoExt);
	    }
	    else {
		    DBGVERBOSE(("Just debug testing -- not processing read result"));
		    FreeReadPacket(readPacket);
	    }
    }
    else {
	    FreeReadPacket(readPacket);
    }


    /*
     *  If there are more read IRPs pending, issue another read.
     */
    if (pdoExt){
	    BOOLEAN scheduleAnotherRead;

	    KeAcquireSpinLock(&pdoExt->devExtSpinLock, &oldIrql);
	    scheduleAnotherRead = !IsListEmpty(&pdoExt->pendingReadIrpsList);
	    KeReleaseSpinLock(&pdoExt->devExtSpinLock, oldIrql);

	    if (scheduleAnotherRead){
		    DBGVERBOSE(("ReadPipeCompletion: scheduling read workItem"));
		    ExQueueWorkItem(&pdoExt->readWorkItem, DelayedWorkQueue);
	    }
    }


    /*
     *  This IRP was allocated by SubmitUrb().  Free it here.
     *  Return STATUS_MORE_PROCESSING_REQUIRED so the kernel does not
     *  continue processing this IRP.
     */
    IoFreeIrp(irp);
    DecrementPendingActionCount(pdoExt->parentFdoExt);
    return STATUS_MORE_PROCESSING_REQUIRED;
}


NTSTATUS WritePipe(PARENTFDOEXT *parentFdoExt, USBD_PIPE_HANDLE pipeHandle, PUCHAR data, ULONG dataLen)
{
	URB urb;
	NTSTATUS status;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕视频一区二区三区久| 夜夜嗨av一区二区三区中文字幕| 国产日产欧美一区二区三区 | 色天天综合色天天久久| 制服丝袜av成人在线看| 国产精品免费aⅴ片在线观看| 亚洲一卡二卡三卡四卡无卡久久| 国产呦萝稀缺另类资源| 色噜噜偷拍精品综合在线| 精品国免费一区二区三区| 一区二区三区欧美视频| 成人黄页毛片网站| 欧美v日韩v国产v| 三级欧美在线一区| 色偷偷久久人人79超碰人人澡 | 国产精品色婷婷| 久国产精品韩国三级视频| 欧美亚日韩国产aⅴ精品中极品| 欧美国产综合一区二区| 久久国产精品露脸对白| 欧美人动与zoxxxx乱| 亚洲在线观看免费| 日本高清成人免费播放| 国产精品色哟哟网站| 国产成人综合视频| 久久久精品欧美丰满| 麻豆一区二区三| 欧美一区二区三区人| 日韩成人一区二区三区在线观看| 欧美视频第二页| 亚洲综合在线第一页| 色综合天天天天做夜夜夜夜做| 国产亚洲精品久| 国产精品一区三区| 国产视频一区二区在线观看| 国产成人免费视频网站高清观看视频| 日韩欧美国产一区在线观看| 久久se精品一区精品二区| 日韩欧美一级二级三级| 久久99精品国产麻豆婷婷洗澡| 欧美一区二区三区四区视频| 美洲天堂一区二卡三卡四卡视频| 制服丝袜av成人在线看| 狠狠色综合日日| 久久久久久久网| 国产精品一二二区| 中文字幕五月欧美| 欧美日韩中字一区| 青青草成人在线观看| 精品黑人一区二区三区久久| 国产黑丝在线一区二区三区| 1000精品久久久久久久久| 欧美亚男人的天堂| 精品一区二区三区日韩| 国产精品区一区二区三| 日本久久电影网| 日韩经典中文字幕一区| 久久嫩草精品久久久精品| 粉嫩蜜臀av国产精品网站| 亚洲美女屁股眼交| 日韩一级在线观看| 成人午夜免费电影| 亚洲在线免费播放| 久久久久久久久久久99999| 99精品欧美一区二区三区综合在线| 一区二区三区在线观看网站| 欧美一二三四在线| 成人国产视频在线观看| 亚洲福利国产精品| 久久久国际精品| 欧美性受xxxx黑人xyx| 国产一区二区精品久久99| 中文字幕日本不卡| 91精品国产全国免费观看| 成人一道本在线| 日本vs亚洲vs韩国一区三区二区| 中文字幕精品一区二区精品绿巨人 | 日本中文一区二区三区| 国产精品入口麻豆原神| 欧美日韩国产系列| 成人免费毛片片v| 欧美aaa在线| 亚洲综合在线免费观看| 久久午夜国产精品| 欧美精品在欧美一区二区少妇| 国产成人99久久亚洲综合精品| 五月天激情综合网| 亚洲欧洲无码一区二区三区| 日韩精品一区二区三区蜜臀| 欧美日精品一区视频| 99精品欧美一区二区三区小说| 久久精品国产亚洲高清剧情介绍 | 欧美性感一类影片在线播放| 福利视频网站一区二区三区| 免费观看在线色综合| 亚洲综合在线五月| 亚洲人成网站精品片在线观看| 久久久久久一二三区| 欧美成人精品福利| 9191精品国产综合久久久久久| 91片在线免费观看| 成人性生交大片免费看视频在线| 蜜臀精品一区二区三区在线观看| 亚洲综合丝袜美腿| 亚洲三级理论片| 国产精品毛片久久久久久久| 久久精品视频一区二区三区| 精品黑人一区二区三区久久| 日韩午夜激情免费电影| 欧美剧在线免费观看网站 | 亚洲风情在线资源站| 亚洲激情av在线| 亚洲欧美日韩国产综合在线 | 麻豆成人久久精品二区三区红 | 欧美午夜不卡在线观看免费| 91美女视频网站| 91久久精品日日躁夜夜躁欧美| www.亚洲国产| 91丝袜美腿高跟国产极品老师 | 99久免费精品视频在线观看 | 综合久久久久久久| 亚洲人成伊人成综合网小说| 日韩一区欧美小说| 亚洲婷婷在线视频| 亚洲精品福利视频网站| 亚洲一区中文在线| 日韩国产精品久久久久久亚洲| 天天色天天爱天天射综合| 人人超碰91尤物精品国产| 免费人成精品欧美精品| 免费高清在线一区| 国产一区二区看久久| 99在线精品免费| 欧美日韩国产天堂| 精品免费99久久| 亚洲色图色小说| 视频一区二区不卡| 国产在线看一区| 91一区二区在线观看| 欧美无人高清视频在线观看| 日韩一区二区精品在线观看| 久久综合久久鬼色| 国产精品蜜臀在线观看| 亚洲va欧美va人人爽| 国产伦精一区二区三区| 99国产精品久久久| 日韩精品一区二区三区在线| 国产精品你懂的| 天天射综合影视| 岛国精品在线观看| 欧美性色欧美a在线播放| 精品国精品国产| 一区二区三区日韩精品| 激情丁香综合五月| 在线视频综合导航| 欧美精品一区二区高清在线观看| 日韩一区欧美一区| 日韩电影在线一区二区三区| 成人精品视频.| 欧美一级日韩免费不卡| 最新久久zyz资源站| 蜜臀久久99精品久久久画质超高清| 成人丝袜高跟foot| 日韩一区二区影院| 亚洲日韩欧美一区二区在线| 久久99精品久久久久| 欧美日韩一区二区三区在线看| 久久久久国产精品人| 日韩精品电影在线| 91电影在线观看| 日本一区二区三区高清不卡| 日本午夜一本久久久综合| 91同城在线观看| 国产欧美日韩视频在线观看| 久久av老司机精品网站导航| 色欧美88888久久久久久影院| 国产欧美久久久精品影院| 蜜桃av噜噜一区二区三区小说| 在线免费观看一区| 成人免费小视频| 丁香婷婷综合色啪| 精品国产乱码久久久久久蜜臀 | 日韩精品1区2区3区| 日本道在线观看一区二区| 国产欧美日韩在线看| 国产尤物一区二区| 久久亚洲一区二区三区四区| 午夜视频久久久久久| 欧美制服丝袜第一页| 尤物在线观看一区| 一本一道综合狠狠老| 亚洲欧洲中文日韩久久av乱码| 成人激情免费视频| 国产亚洲精品免费| 国产不卡一区视频| 亚洲国产精品成人综合| 国产91精品露脸国语对白| 久久久www成人免费无遮挡大片 | 日韩精品色哟哟| 欧美日韩一区二区三区四区五区|