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

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

?? comport.c

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

Copyright (c) 1999  Microsoft Corporation

Module Name:

    comport.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 CreateSymbolicLink(POSPDOEXT *pdoExt)
{
	NTSTATUS status;
	PWCHAR comPortName;
	static WCHAR comNamePrefix[] = L"\\DosDevices\\COM";
	WCHAR buf[sizeof(comNamePrefix)/sizeof(WCHAR) + 4];
	LONG numLen = MyLog(10, pdoExt->comPortNumber)+1;

	ASSERT((numLen > 0) && (numLen <= 4));

	RtlCopyMemory(buf, comNamePrefix, sizeof(comNamePrefix));

	NumToDecString(	buf+sizeof(comNamePrefix)/sizeof(WCHAR)-1, 
					(USHORT)pdoExt->comPortNumber, 
					(USHORT)numLen);
	buf[sizeof(comNamePrefix)/sizeof(WCHAR) - 1 + numLen] = UNICODE_NULL;

	comPortName = MemDup(buf, sizeof(buf));
	if (comPortName){
		RtlInitUnicodeString(&pdoExt->symbolicLinkName, comPortName);

		status = IoCreateSymbolicLink(&pdoExt->symbolicLinkName, &pdoExt->pdoName);
		if (NT_SUCCESS(status)){
			UNICODE_STRING comPortSuffix;

			/*
			 *  Create the '\Device\POS_x = COMx' entry under HKLM\DEVICEMAP\SERIALCOMM
			 */
			RtlInitUnicodeString(&comPortSuffix, pdoExt->symbolicLinkName.Buffer+(sizeof(L"\\DosDevices\\")-sizeof(WCHAR))/sizeof(WCHAR));
			status = RtlWriteRegistryValue(	RTL_REGISTRY_DEVICEMAP, 
                                            L"SERIALCOMM",
                                            pdoExt->pdoName.Buffer, 
                                            REG_SZ,
                                            comPortSuffix.Buffer,
                                            comPortSuffix.Length + sizeof(WCHAR));
            if (NT_SUCCESS(status)){
                if (isWin9x){
                    NTSTATUS tmpStatus;

                    /*
                     *  Delete the temporary 'COMx=COMx' holder value we created earlier.
                     */
                    tmpStatus = RtlDeleteRegistryValue( RTL_REGISTRY_DEVICEMAP, 
                                                        L"SERIALCOMM",
                                                        comPortSuffix.Buffer);
                }
            }
            else {
                DBGERR(("CreateSymbolicLink: RtlWriteRegistryValue failed with status %xh.", status));
            }

		}
        else {
            DBGERR(("IoCreateSymbolicLink failed with status %xh.", status));
        }
	}
	else {
        ASSERT(comPortName);
		status = STATUS_INSUFFICIENT_RESOURCES;
	}

	return status;
}


NTSTATUS DestroySymbolicLink(POSPDOEXT *pdoExt)
{
	NTSTATUS status;

    /*
     *  Delete the symbolic link.
     *  pdoExt->pdoName.Buffer, which was allocated at pdo creation time,
     *  will get deleted when we delete the pdo.
     */
	ASSERT(pdoExt->symbolicLinkName.Buffer);
	IoDeleteSymbolicLink(&pdoExt->symbolicLinkName);

	status = RtlDeleteRegistryValue(RTL_REGISTRY_DEVICEMAP, 
					L"SERIALCOMM",
					pdoExt->pdoName.Buffer);

	FREEPOOL(pdoExt->symbolicLinkName.Buffer);

	return status;
}


NTSTATUS OpenComPort(POSPDOEXT *pdoExt, PIRP irp)
{
	NTSTATUS status;
	PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(irp);

	// BUGBUG FINISH - security, permissions, etc.

	DBGVERBOSE(("OpenComPort: shareAccess=%xh, desiredAccess=%xh, options=%xh.", 
							(ULONG)irpSp->Parameters.Create.ShareAccess, 
							(ULONG)irpSp->Parameters.Create.SecurityContext->DesiredAccess, 
							(ULONG)irpSp->Parameters.Create.Options));

	if (irpSp->Parameters.Create.Options & FILE_DIRECTORY_FILE){
        /*
         *  Attempt to open this device as a directory
         */
		DBGWARN(("OpenComPort: STATUS_NOT_A_DIRECTORY"));
	        status = STATUS_NOT_A_DIRECTORY;
	}
	else {
		FILEEXT *fileExt = ALLOCPOOL(NonPagedPool, sizeof(FILEEXT));
		if (fileExt){
			KIRQL oldIrql;

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

			if (IsListEmpty(&pdoExt->fileExtensionList)){

				ASSERT(irpSp->FileObject->FsContext == NULL);
				irpSp->FileObject->FsContext = fileExt;	// BUGBUG ?

				fileExt->signature = ESCPOS_TAG;
				fileExt->fileObject = irpSp->FileObject;
				InsertTailList(&pdoExt->fileExtensionList, &fileExt->listEntry);
				status = STATUS_SUCCESS;
			}
			else {
				/*
				 *  Only allow one open for now
				 */
				DBGWARN(("OpenComPort: failing repeat open"));
				FREEPOOL(fileExt);
				status = STATUS_SHARING_VIOLATION;
			}

			KeReleaseSpinLock(&pdoExt->devExtSpinLock, oldIrql);
		}
		else {
			status = STATUS_INSUFFICIENT_RESOURCES;
		}
	}

	irp->IoStatus.Information = 0;

	return status;
}


NTSTATUS CloseComPort(POSPDOEXT *pdoExt, PIRP irp)
{
	NTSTATUS status;
	KIRQL oldIrql;
	FILEEXT *callerFileExt, *myFileExt;
	PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(irp);

	ASSERT(irpSp->FileObject);
	ASSERT(irpSp->FileObject->FsContext);
	callerFileExt = (FILEEXT *)irpSp->FileObject->FsContext;
	ASSERT(callerFileExt->signature == ESCPOS_TAG);

	KeAcquireSpinLock(&pdoExt->devExtSpinLock, &oldIrql);
	
	if (IsListEmpty(&pdoExt->fileExtensionList)){
		status = STATUS_DEVICE_DATA_ERROR;
	}
	else {
		PLIST_ENTRY listEntry;
			
		// BUGBUG - assume only one open for now
		listEntry = RemoveHeadList(&pdoExt->fileExtensionList);
		myFileExt = CONTAINING_RECORD(listEntry, FILEEXT, listEntry);
		ASSERT(myFileExt->signature == ESCPOS_TAG);
		if (myFileExt == callerFileExt){
			status = STATUS_SUCCESS;
		}
		else {
			/*
			 *  We only allow one open, so this should have been the one
			 */
			ASSERT(myFileExt == callerFileExt);
			InsertHeadList(&pdoExt->fileExtensionList, &myFileExt->listEntry);
			status = STATUS_DEVICE_DATA_ERROR;
		}
	}

	KeReleaseSpinLock(&pdoExt->devExtSpinLock, oldIrql);

	/*
	 *  Wait until we've dropped the spinlock to call outside the driver to free memory.
	 */
	if (NT_SUCCESS(status)){
		irpSp->FileObject->FsContext = NULL;
		FREEPOOL(myFileExt);
	}
	else {
		DBGERR(("CloseComPort: failing with status %xh.", status));
	}

	irp->IoStatus.Information = 0;

	return status;
}



PWCHAR CreateChildPdoName(PARENTFDOEXT *parentFdoExt, ULONG portNumber)
{
	static WCHAR pdoNamePrefix[] = L"\\Device\\POS_";
	WCHAR buf[sizeof(pdoNamePrefix)/sizeof(WCHAR)+4] = { 0 };
	PWCHAR result;
	ULONG numLen = MyLog(10, portNumber)+1;

	ASSERT((numLen > 0) && (numLen <= 4));

	RtlCopyMemory(buf, pdoNamePrefix, sizeof(pdoNamePrefix));
	NumToDecString(buf+sizeof(pdoNamePrefix)/sizeof(WCHAR)-1, (USHORT)portNumber, (USHORT)numLen);

	result = MemDup(buf, sizeof(buf));

	return result;
}


NTSTATUS CreateCOMPdo(	PARENTFDOEXT *parentFdoExt,
                        ULONG comInterfaceIndex,
                        ENDPOINTINFO *inputEndpointInfo, 
                        ENDPOINTINFO *outputEndpointInfo,
                        ENDPOINTINFO *statusEndpointInfo)
{
    NTSTATUS status;
    LONG comPortNumber;

    comPortNumber = GetComPort(parentFdoExt, comInterfaceIndex);
    if (comPortNumber == -1){
        status = STATUS_DEVICE_DATA_ERROR;
    }
    else {
        PWCHAR deviceName = CreateChildPdoName(parentFdoExt, comPortNumber);
        if (deviceName){
            PDEVICE_OBJECT pdo;
            UNICODE_STRING uPdoName;

            RtlInitUnicodeString(&uPdoName, deviceName);

            status = IoCreateDevice(parentFdoExt->driverObj, 
                                    sizeof(DEVEXT),
                                    &uPdoName,  // name for this device
                                    FILE_DEVICE_SERIAL_PORT, 
                                    0,			// device characteristics
                                    FALSE,		// exclusive - BUGBUG ?
                                    &pdo);		// our device object

            if (NT_SUCCESS(status)){
                DEVEXT *devExt = (DEVEXT *)pdo->DeviceExtension;
                POSPDOEXT *pdoExt;
                KIRQL oldIrql;

                RtlZeroMemory(devExt, sizeof(DEVEXT));

                devExt->signature = DEVICE_EXTENSION_SIGNATURE;
                devExt->isPdo = TRUE;

                pdoExt = &devExt->pdoExt;

                pdoExt->state = STATE_INITIALIZED;
                pdoExt->pdo = pdo;
                pdoExt->parentFdoExt = parentFdoExt;
                pdoExt->comPortNumber = comPortNumber;

                /*
                 *  Initializing variables and endpointinfo for Serial Emulation
                 */
                if (parentFdoExt->posFlag & SERIAL_EMULATION) {
                    InitializeSerEmulVariables(pdoExt);
                    pdoExt->statusEndpointInfo = *statusEndpointInfo;
                    DBGVERBOSE(("CreateCOMPdo: EndpointInfo & Variables for Serial Emulation initialized"));
                }

                RtlInitUnicodeString(&pdoExt->pdoName, deviceName);

                InitializeListHead(&pdoExt->fileExtensionList);
                InitializeListHead(&pdoExt->pendingReadIrpsList);
                InitializeListHead(&pdoExt->pendingWriteIrpsList);
                InitializeListHead(&pdoExt->completedReadPacketsList);

                KeInitializeSpinLock(&pdoExt->devExtSpinLock);

                ExInitializeWorkItem(&pdoExt->writeWorkItem, WorkItemCallback_Write, pdoExt);
                ExInitializeWorkItem(&pdoExt->readWorkItem, WorkItemCallback_Read, pdoExt);

                pdoExt->totalQueuedReadDataLength = 0;

                /*
                 *  Copy contents of endpointInfo structures. To incorporate 
                 *  the ODD_ENDPOINT feature we have to make the checks below.
                 */
                if (inputEndpointInfo){
                    pdoExt->inputEndpointInfo = *inputEndpointInfo;
                }

                if (outputEndpointInfo){
                    pdoExt->outputEndpointInfo = *outputEndpointInfo;
                }

                pdo->StackSize = parentFdoExt->functionDevObj->StackSize+1;

                /*
                 *  Insert child PDO in parent's device relations array.
                 */
                KeAcquireSpinLock(&parentFdoExt->devExtSpinLock, &oldIrql);
                parentFdoExt->deviceRelations->Objects[parentFdoExt->deviceRelations->Count++] = pdo;
                KeReleaseSpinLock(&parentFdoExt->devExtSpinLock, oldIrql);

                ASSERT(!(pdo->Flags & DO_POWER_PAGABLE)); 
                pdo->Flags |= DO_POWER_PAGABLE;

                DBGVERBOSE(("CreateCOMPdo: created pdo %ph, pdoExt = %ph.", pdo, pdoExt));
            }
            else {
                DBGERR(("CreateCOMPdo: IoCreateDevice failed with status %xh.", status));
            }
        }
        else {
            status = STATUS_INSUFFICIENT_RESOURCES;
        }

        if (!NT_SUCCESS(status)){
	        ReleaseCOMPort(comPortNumber);
        }
    }

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


NTSTATUS CleanupIO(POSPDOEXT *pdoExt, PIRP irp)
{
	// BUGBUG FINISH
	irp->IoStatus.Information = 0;
	return STATUS_SUCCESS;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
美国毛片一区二区三区| 日本女优在线视频一区二区| 久久综合九色综合欧美98| 欧美色国产精品| 欧美吞精做爰啪啪高潮| 欧美私人免费视频| 在线成人av影院| 日韩欧美国产麻豆| 精品国产凹凸成av人导航| 欧美va日韩va| 亚洲精品在线观看视频| 欧美mv日韩mv亚洲| 国产欧美日韩在线看| 中文子幕无线码一区tr| 1区2区3区精品视频| 亚洲女人的天堂| 午夜激情综合网| 麻豆精品精品国产自在97香蕉| 久久成人久久鬼色| 波多野结衣亚洲一区| 91色在线porny| 欧美一区二区三区不卡| 日本一区二区三区高清不卡| 日韩伦理电影网| 免费观看一级欧美片| 国产盗摄女厕一区二区三区| 91视频精品在这里| 精品国产自在久精品国产| 中文字幕成人网| 丝袜亚洲另类欧美综合| 国产91综合一区在线观看| 色综合亚洲欧洲| 亚洲精品一区二区三区精华液| 国产精品污网站| 午夜电影久久久| av亚洲精华国产精华| 7777精品伊人久久久大香线蕉完整版 | 国产精品国产三级国产aⅴ原创| 中文字幕综合网| 久久99久久久久| 91精品办公室少妇高潮对白| 欧美成人vr18sexvr| 亚洲精品中文字幕乱码三区| 美国毛片一区二区| 欧美视频一区二| 中文字幕视频一区| 开心九九激情九九欧美日韩精美视频电影 | 在线观看亚洲专区| 中国av一区二区三区| 日韩和欧美一区二区| 97久久人人超碰| 国产欧美中文在线| 六月婷婷色综合| 欧美高清dvd| 亚洲精品乱码久久久久久黑人 | 最新国产成人在线观看| 精品亚洲欧美一区| 欧美美女黄视频| 亚洲成年人网站在线观看| 风流少妇一区二区| 精品国免费一区二区三区| 午夜伊人狠狠久久| 欧美日韩一级大片网址| 亚洲码国产岛国毛片在线| 不卡一区在线观看| 国产精品国模大尺度视频| 国产成人在线看| 国产精品视频观看| 成人sese在线| 中文字幕在线观看一区| 99热精品国产| 一区二区三区精品视频| 91极品美女在线| 亚洲综合色网站| 欧美久久一区二区| 欧美a级一区二区| 日韩欧美一级片| 精品中文字幕一区二区| 日韩免费观看高清完整版 | 亚洲丰满少妇videoshd| 欧美天堂一区二区三区| 一区二区三区不卡视频在线观看 | 日韩一区二区免费电影| 日本亚洲天堂网| 精品欧美久久久| 丁香激情综合国产| 亚洲女同一区二区| 欧美男人的天堂一二区| 麻豆一区二区三| 久久久亚洲午夜电影| 成人18精品视频| 亚洲成人免费看| 久久伊人中文字幕| 91婷婷韩国欧美一区二区| 怡红院av一区二区三区| 欧美二区乱c少妇| 国产经典欧美精品| 国产精品福利av| 91精品欧美一区二区三区综合在 | 欧美在线高清视频| 麻豆精品视频在线观看免费 | 欧美日韩成人激情| 国内精品不卡在线| 亚洲猫色日本管| 精品国产一区二区在线观看| 成人av在线播放网址| 亚洲第一久久影院| 国产欧美一区二区精品秋霞影院| 91在线看国产| 久久精品国产999大香线蕉| 中文字幕免费观看一区| 欧美久久久久久蜜桃| 成人性生交大片免费看视频在线| 亚洲午夜在线电影| 国产午夜亚洲精品不卡| 欧美性生活久久| 国产成人免费网站| 免费看欧美美女黄的网站| 国产精品乱码妇女bbbb| 欧美午夜精品免费| 成人免费视频一区| 蜜桃免费网站一区二区三区 | 欧美丰满少妇xxxbbb| 成人精品免费视频| 日本欧美在线观看| 一区二区在线观看免费| 国产亚洲一区字幕| 日韩亚洲欧美中文三级| 色哟哟亚洲精品| 成人午夜电影小说| 国内国产精品久久| 久久黄色级2电影| 秋霞电影网一区二区| 亚洲电影第三页| 亚洲精品欧美在线| 亚洲天堂精品在线观看| 亚洲国产精品国自产拍av| 欧美大尺度电影在线| 欧美精品 日韩| 欧美日韩国产系列| 欧美三级蜜桃2在线观看| 99视频精品全部免费在线| 大白屁股一区二区视频| 国产一区二区三区在线观看精品| 亚洲香肠在线观看| 亚洲蜜臀av乱码久久精品| 亚洲欧洲一区二区三区| 国产精品三级视频| 国产精品网站在线| 国产精品麻豆网站| 中文字幕中文字幕一区| 亚洲欧洲成人自拍| 亚洲天堂精品在线观看| 亚洲激情一二三区| 一区二区三区欧美激情| 亚洲小说欧美激情另类| 五月激情六月综合| 日本女优在线视频一区二区| 男人操女人的视频在线观看欧美| 免费成人av在线| 精品一区免费av| 国产精品羞羞答答xxdd| 成人av资源下载| 欧美主播一区二区三区美女| 欧美日韩激情一区二区| 欧美日韩一区精品| 欧美一卡二卡三卡四卡| 精品少妇一区二区三区日产乱码| 久久综合色婷婷| 日韩一区中文字幕| 亚洲第一精品在线| 国产又粗又猛又爽又黄91精品| 国产精品白丝av| 91社区在线播放| 欧美一区二区三级| 中文字幕欧美一区| 天堂成人国产精品一区| 国产一区二区三区四区五区美女 | 尤物视频一区二区| 另类的小说在线视频另类成人小视频在线| 亚洲女同ⅹxx女同tv| 国产精品国产三级国产a| 亚洲电影视频在线| 国产成人精品免费网站| 欧美综合亚洲图片综合区| 欧美一区二区三区白人| 欧美—级在线免费片| 亚洲午夜成aⅴ人片| 国产精品99久久久久久久vr | 午夜精品福利在线| 成人亚洲一区二区一| 精品视频一区三区九区| 欧美电影免费观看完整版| 亚洲欧洲色图综合| 久久99在线观看| 欧美日韩中文字幕精品| 国产精品午夜免费| 精品在线播放午夜| 欧美军同video69gay| 国产精品美女久久久久高潮|