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

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

?? usb.c

?? 微軟的point of sale的源代碼
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/*++

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;

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人一级片网址| 欧美一激情一区二区三区| 日本欧美韩国一区三区| 1区2区3区精品视频| 亚洲欧洲国产日本综合| 视频一区二区欧美| 久久av老司机精品网站导航| 秋霞国产午夜精品免费视频| 精品在线免费观看| 高清成人免费视频| 91激情在线视频| 69堂成人精品免费视频| 欧美成人乱码一区二区三区| 久久综合av免费| 亚洲成年人影院| 国产美女精品一区二区三区| eeuss鲁片一区二区三区在线看| 在线精品视频小说1| 欧美电影免费观看高清完整版在| 国产精品色噜噜| 免费成人性网站| 欧美日韩一区二区欧美激情| 久久看人人爽人人| 无码av免费一区二区三区试看| 国内不卡的二区三区中文字幕| 色综合久久中文字幕综合网| 26uuu色噜噜精品一区| 亚洲图片另类小说| 26uuu国产一区二区三区| 一区二区三区免费网站| 高潮精品一区videoshd| 久久婷婷成人综合色| 男人的天堂久久精品| 欧美一级理论片| 免费一级欧美片在线观看| 欧美在线视频日韩| 亚洲综合久久久| 欧美日韩中字一区| 水野朝阳av一区二区三区| 欧美日韩性生活| 日韩精品91亚洲二区在线观看 | 午夜精品福利一区二区三区av| av不卡一区二区三区| 一区二区在线观看免费| 一本久道久久综合中文字幕| 久久久影院官网| 成人黄色免费短视频| 亚洲日本在线a| 884aa四虎影成人精品一区| 免费在线看成人av| 看电影不卡的网站| 久久色在线观看| 久久综合999| 欧美久久久久久久久久| 国产精品色婷婷久久58| 色综合久久99| 婷婷综合五月天| 国产精品免费观看视频| 91精品麻豆日日躁夜夜躁| 色综合久久综合网97色综合| 国内精品伊人久久久久影院对白| 亚洲欧美另类小说视频| 国产精品剧情在线亚洲| 久久久99精品免费观看不卡| 欧美精品三级在线观看| 欧美日韩另类一区| 91免费看片在线观看| 国产91精品露脸国语对白| 国产精一区二区三区| 日韩影院免费视频| 曰韩精品一区二区| 国产精品久久久久久妇女6080| 久久精品一区蜜桃臀影院| 久久精品男人天堂av| 久久久美女艺术照精彩视频福利播放| 91精品国产综合久久精品麻豆| 日本视频中文字幕一区二区三区| 91免费精品国自产拍在线不卡| 成人一道本在线| 在线视频中文字幕一区二区| 色94色欧美sute亚洲线路一久| 欧美日韩激情一区| 精品88久久久久88久久久| 国产精品不卡视频| 五月婷婷综合网| 国产成人精品亚洲午夜麻豆| 日本高清不卡视频| 欧美一区二区女人| 一区二区三区精品| 久久99国产精品久久99| 99v久久综合狠狠综合久久| 日韩欧美久久久| 亚洲狼人国产精品| 国产精品一区二区久久不卡 | 国产自产2019最新不卡| 波多野结衣精品在线| 精品国产免费视频| 亚洲成a人片综合在线| 粉嫩一区二区三区在线看| 6080亚洲精品一区二区| 国产精品免费观看视频| 亚洲一区二区偷拍精品| 亚洲欧美日韩人成在线播放| 国产一区二区在线影院| 欧美性一二三区| 亚洲国产一区二区视频| 国产91精品一区二区麻豆网站| 久久这里只有精品6| 视频一区二区不卡| 日韩欧美久久一区| 国产精品一区久久久久| 国产亚洲欧美日韩在线一区| 国产美女精品一区二区三区| 久久精品视频一区二区三区| 石原莉奈在线亚洲三区| 777久久久精品| 成人精品电影在线观看| 精品视频在线免费观看| 奇米在线7777在线精品| 欧美一级国产精品| 国产呦精品一区二区三区网站| 久久久蜜桃精品| 色哟哟精品一区| 天堂一区二区在线| 国产午夜亚洲精品羞羞网站| 色综合天天综合| 国产乱码一区二区三区| 一区二区三区丝袜| 91精品国产麻豆国产自产在线| 亚洲精品一区二区三区99| 国产激情一区二区三区| 亚洲午夜久久久久中文字幕久| 91精品国产色综合久久不卡电影| 国产综合色精品一区二区三区| 亚洲特黄一级片| 亚洲国产成人在线| 日韩一级片在线观看| 91在线视频免费观看| 日韩精品久久久久久| 亚洲女同女同女同女同女同69| 精品久久久久久久久久久久包黑料 | 日韩欧美一级片| 一本大道久久精品懂色aⅴ| jlzzjlzz欧美大全| 国产成人在线免费观看| 国产精品亚洲视频| 美女精品自拍一二三四| 久久不见久久见免费视频7| 图片区小说区区亚洲影院| 水蜜桃久久夜色精品一区的特点| 亚洲综合一区在线| 亚洲二区在线视频| 婷婷综合在线观看| 久久不见久久见免费视频1| 日韩综合小视频| 欧美一区二区不卡视频| 日韩美女主播在线视频一区二区三区 | 亚洲欧美日韩国产综合在线| 亚洲乱码国产乱码精品精98午夜| 成人欧美一区二区三区| 亚洲妇熟xx妇色黄| 蜜臀a∨国产成人精品| 激情六月婷婷久久| 成人福利在线看| 欧美日韩极品在线观看一区| 91精品免费在线| 国产精品免费看片| 婷婷开心久久网| 99这里只有久久精品视频| 欧美高清激情brazzers| 欧美经典一区二区三区| 亚洲一区在线观看网站| 国产精品一区2区| 91麻豆精品国产91| 国产精品私人影院| 男女性色大片免费观看一区二区 | 色综合久久久久网| 欧美mv日韩mv国产| 一卡二卡欧美日韩| 国产精品色婷婷久久58| 久久精品免费观看| 日韩欧美国产午夜精品| 午夜影视日本亚洲欧洲精品| aa级大片欧美| 中文字幕在线观看不卡视频| 国产成人午夜精品影院观看视频| 91精品国产综合久久久久| 中文字幕精品一区二区精品绿巨人| 午夜视频一区在线观看| 成人一区二区三区中文字幕| 国产欧美日本一区二区三区| 青青青伊人色综合久久| www国产精品av| 成人97人人超碰人人99| 国产精品色噜噜| 一本一本久久a久久精品综合麻豆| 亚洲欧美偷拍另类a∨色屁股| 色呦呦日韩精品| 秋霞影院一区二区| 国产日韩av一区二区|