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

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

?? comport.c

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

NTSTATUS QueryInfo(POSPDOEXT *pdoExt, PIRP irp)
{
	NTSTATUS status;
	PIO_STACK_LOCATION irpSp;

	irpSp = IoGetCurrentIrpStackLocation(irp);

	switch (irpSp->Parameters.QueryFile.FileInformationClass){

		case FileBasicInformation:
			DBGVERBOSE(("  QueryInfo: FileBasicInformation"));
			{
				PFILE_BASIC_INFORMATION basicInfoBuf = irp->AssociatedIrp.SystemBuffer;
				ASSERT(basicInfoBuf);
				RtlCopyMemory(basicInfoBuf, &pdoExt->fileBasicInfo, sizeof(FILE_BASIC_INFORMATION));
				irp->IoStatus.Information = sizeof(FILE_BASIC_INFORMATION);
				status = STATUS_SUCCESS;
			}
			break;

		case FileStandardInformation:
			DBGVERBOSE(("  QueryInfo: FileStandardInformation"));
			{
				PFILE_STANDARD_INFORMATION stdInfoBuf = irp->AssociatedIrp.SystemBuffer;
				ASSERT(stdInfoBuf);
				stdInfoBuf->AllocationSize.QuadPart = 0;
				stdInfoBuf->EndOfFile = stdInfoBuf->AllocationSize;
				stdInfoBuf->NumberOfLinks = 0;
				stdInfoBuf->DeletePending = FALSE;
				stdInfoBuf->Directory = FALSE;
				irp->IoStatus.Information = sizeof(FILE_STANDARD_INFORMATION);
				status = STATUS_SUCCESS;
			}
			break;

		case FilePositionInformation:
			DBGVERBOSE(("  QueryInfo: FilePositionInformation"));
			/*
			 *  Always return position 0
			 */
			((PFILE_POSITION_INFORMATION)irp->AssociatedIrp.SystemBuffer)->CurrentByteOffset.QuadPart = 0;
			irp->IoStatus.Information = sizeof(FILE_POSITION_INFORMATION);
			status = STATUS_SUCCESS;
			break;

		case FileEndOfFileInformation:
			DBGWARN(("  QueryInfo: FileEndOfFileInformation"));
			irp->IoStatus.Information = 0;
			status = STATUS_INVALID_PARAMETER;
			break;

		default:
			DBGWARN(("  QueryInfo: ??? (%xh)", (ULONG)irpSp->Parameters.QueryFile.FileInformationClass));
			irp->IoStatus.Information = 0;
			status = STATUS_INVALID_PARAMETER;
			break;

	}


	return status;
}

NTSTATUS SetInfo(POSPDOEXT *pdoExt, PIRP irp)
{
	NTSTATUS status;
	PIO_STACK_LOCATION irpSp;

	irpSp = IoGetCurrentIrpStackLocation(irp);

	switch (irpSp->Parameters.SetFile.FileInformationClass){

		case FileBasicInformation:
			DBGVERBOSE(("  SetInfo: FileBasicInformation"));
			{
				PFILE_BASIC_INFORMATION basicInfoBuf = irp->AssociatedIrp.SystemBuffer;
				ASSERT(basicInfoBuf);
				RtlCopyMemory(&pdoExt->fileBasicInfo, basicInfoBuf, sizeof(FILE_BASIC_INFORMATION));
				irp->IoStatus.Information = sizeof(FILE_BASIC_INFORMATION);
				status = STATUS_SUCCESS;
			}
			break;

		case FileEndOfFileInformation:
			DBGVERBOSE(("  SetInfo: FileEndOfFileInformation"));
			irp->IoStatus.Information = 0;
			status = STATUS_SUCCESS;
			break;

		#define FileAllocationInformation 19  // BUGBUG - defined in ntioapi.h
		case FileAllocationInformation:
			DBGVERBOSE(("  SetInfo: FileAllocationInformation"));
			irp->IoStatus.Information = 0;
			status = STATUS_SUCCESS;
			break;

		default:
			DBGWARN(("  SetInfo: ??? (%xh)", (ULONG)irpSp->Parameters.SetFile.FileInformationClass));
			irp->IoStatus.Information = 0;
			status = STATUS_INVALID_PARAMETER;
			break;
	}

	return status;
}



NTSTATUS FlushBuffers(POSPDOEXT *pdoExt)
{
    LIST_ENTRY irpsToCompleteList;
    PLIST_ENTRY listEntry;
    PIRP irp;
    KIRQL oldIrql;
    NTSTATUS status = STATUS_SUCCESS;

    DBGVERBOSE(("FlushBuffers"));

    /*
     *  This is so we don't loop forever if they get re-queued on the same thread.
     */
    InitializeListHead(&irpsToCompleteList);

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

    /*
     *  Flush all pending Read and Wait Irps (if serial emulation feature is ON)
     */
    while (irp = DequeueReadIrp(pdoExt, TRUE)){
        InsertTailList(&irpsToCompleteList, &irp->Tail.Overlay.ListEntry);
    }

    if (pdoExt->parentFdoExt->posFlag & SERIAL_EMULATION) {
        while (irp = DequeueWaitIrp(pdoExt)){
            InsertTailList(&irpsToCompleteList, &irp->Tail.Overlay.ListEntry);
        }
    }

    /*
     *  Empty out the queued readPackets.  
     *  It's ok to free locked memory with the spinlock held.
     */
    while (!IsListEmpty(&pdoExt->completedReadPacketsList)){
        READPACKET *readPacket;

	    listEntry = RemoveHeadList(&pdoExt->completedReadPacketsList);
	    ASSERT(listEntry);
	    readPacket = CONTAINING_RECORD(listEntry, READPACKET, listEntry);
        FreeReadPacket(readPacket);
    }

    KeReleaseSpinLock(&pdoExt->devExtSpinLock, oldIrql);

    while (!IsListEmpty(&irpsToCompleteList)) {
        listEntry = RemoveHeadList(&irpsToCompleteList);
        ASSERT(listEntry);
        irp = CONTAINING_RECORD(listEntry, IRP, Tail.Overlay.ListEntry);
        irp->IoStatus.Information = 0;
        irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
        IoCompleteRequest(irp, IO_NO_INCREMENT);
    }

    return status;
}



NTSTATUS InternalIoctl(POSPDOEXT *pdoExt, PIRP irp)
{
	NTSTATUS status;
	PIO_STACK_LOCATION irpSp;

	irpSp = IoGetCurrentIrpStackLocation(irp);

	switch (irpSp->Parameters.DeviceIoControl.IoControlCode){

		// BUGBUG FINISH

		default:
			DBGVERBOSE(("InternalIoctl: ??? (%xh)", (ULONG)irpSp->Parameters.DeviceIoControl.IoControlCode));
			status = irp->IoStatus.Status;
			break;
	}

	return status;
}



LONG GetComPort(PARENTFDOEXT *parentFdoExt, ULONG comInterfaceIndex)
/*++

Routine Description:

    Get the serial COM port index for a serial interface we're about to create.
    If this is not the first plug-in, it should be sitting in the registry.
    If this is the first plug-in, call GetFreeComPortNumber to reserve a new
    static COM port for this device and store it in our software key.

Arguments:


Return Value:

    Return COM port number or -1 if unsuccessful.

--*/
{
    LONG comNumber = -1;
    NTSTATUS status;
    HANDLE hRegDevice;

    status = IoOpenDeviceRegistryKey(   parentFdoExt->physicalDevObj, 
                                        PLUGPLAY_REGKEY_DEVICE, 
                                        KEY_READ, 
                                        &hRegDevice);
    if (NT_SUCCESS(status)){
        UNICODE_STRING keyName;
        PKEY_VALUE_FULL_INFORMATION keyValueInfo;
        ULONG keyValueTotalSize, actualLength;
        WCHAR interfaceKeyName[] = L"COMPortForInterfaceXXXX";

        NumToHexString( interfaceKeyName+sizeof(interfaceKeyName)/sizeof(WCHAR)-1-4, 
                        (USHORT)comInterfaceIndex, 
                        4);

        RtlInitUnicodeString(&keyName, interfaceKeyName); 
        keyValueTotalSize = sizeof(KEY_VALUE_FULL_INFORMATION) +
                            keyName.Length*sizeof(WCHAR) +
                            sizeof(ULONG);
        keyValueInfo = ALLOCPOOL(PagedPool, keyValueTotalSize);
        if (keyValueInfo){
            status = ZwQueryValueKey(   hRegDevice,
                                        &keyName,
                                        KeyValueFullInformation,
                                        keyValueInfo,
                                        keyValueTotalSize,
                                        &actualLength); 
            if (NT_SUCCESS(status)){

                ASSERT(keyValueInfo->Type == REG_DWORD);
                ASSERT(keyValueInfo->DataLength == sizeof(ULONG));
                                
                comNumber = (LONG)*((PULONG)(((PCHAR)keyValueInfo)+keyValueInfo->DataOffset));
                DBGVERBOSE(("GetComPort: read comport #%xh for interface %xh from registry.", (ULONG)comNumber, comInterfaceIndex));
            }
            else {

                /*
                 *  No COM port number recorded in registry.
                 *  Allocate a new static COM port from the COM name arbiter
                 *  and record it in our software key for the next PnP.
                 */
                comNumber = GetFreeComPortNumber();
                if (comNumber == -1){
                    DBGERR(("GetComPort: GetFreeComPortNumber failed"));
                }
                else {
                    status = ZwSetValueKey( hRegDevice,
                                            &keyName,
                                            0,
                                            REG_DWORD,
                                            &comNumber,
                                            sizeof(ULONG));
                    if (!NT_SUCCESS(status)){
                        DBGERR(("GetComPort: ZwSetValueKey failed with status %xh.", status));
                    }
                }
            }

            FREEPOOL(keyValueInfo);
        }
        else {
            ASSERT(keyValueInfo);
        }

        ZwClose(hRegDevice);
    }
    else {
        DBGERR(("GetComPort: IoOpenDeviceRegistryKey failed with %xh.", status));
    }


    return comNumber;
}




LONG GetFreeComPortNumber()
/*++

Routine Description:

    Find the index of the next unused serial COM port name in the system
    (e.g. COM3, COM4, etc).

Arguments:


Return Value:

    Return COM port number or -1 if unsuccessful.

--*/

{
	LONG comNumber = -1;


    if (isWin9x){
        /*
         *  Windows 98
         *      Find the first unused name under Hardware\DeviceMap\SerialComm.
         *
         *
         *      BUGBUG:
         *          This algorithm does not find all the COM ports reserved
         *          by modems.  May want to port tomgreen's AllocateCommPort
         *          function from \faulty\Wdm10\usb\driver\ccport\utils.c
         */
	    HANDLE hKey;
	    UNICODE_STRING keyName;
	    NTSTATUS status;
	    OBJECT_ATTRIBUTES objectAttributes;

	    RtlInitUnicodeString(&keyName, L"\\Registry\\Machine\\Hardware\\DeviceMap\\SerialComm");
	    InitializeObjectAttributes( &objectAttributes,
								    &keyName,
								    OBJ_CASE_INSENSITIVE,
								    NULL,				
								    (PSECURITY_DESCRIPTOR)NULL);

	    status = ZwOpenKey(&hKey, KEY_QUERY_VALUE | KEY_SET_VALUE, &objectAttributes);
	    if (NT_SUCCESS(status)){
            #define MAX_COMPORT_NAME_LEN (sizeof("COMxxxx")-1)
            UCHAR keyValueBytes[sizeof(KEY_VALUE_FULL_INFORMATION)+(MAX_COMPORT_NAME_LEN+1)*sizeof(WCHAR)+sizeof(ULONG)];
            PKEY_VALUE_FULL_INFORMATION keyValueInfo = (PKEY_VALUE_FULL_INFORMATION)keyValueBytes;
            ULONG i, actualLen;
            ULONG keyIndex = 0;

            /*
             *  This bitmask represents the used COM ports.
             *  Bit i set indicates com port i+1 is reserved.
             *  Initialize with COM1 and COM2 reserved.
             *
             *  BUGBUG - only works for up to 32 ports.
             */
            ULONG comNameMask = 3;

            do {
                status = ZwEnumerateValueKey(
                            hKey,
                            keyIndex++,
                            KeyValueFullInformation,
                            keyValueInfo,
                            sizeof(keyValueBytes),
                            &actualLen); 
                if (NT_SUCCESS(status)){
                    if (keyValueInfo->Type == REG_SZ){
                        PWCHAR valuePtr = (PWCHAR)(((PCHAR)keyValueInfo)+keyValueInfo->DataOffset);
                        if (!WStrNCmpI(valuePtr, L"COM", 3)){
                            /*
                             *  valuePtr+3 points the index portion of the COMx string,
                             *  but we can't call LAtoD on it because it is
                             *  NOT NULL-TERMINATED.
                             *  So copy the index into our own buffer, 
                             *  null-terminate that, 
                             *  and call LAtoD to get the numerical index.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
av电影在线观看一区| 一区二区三区在线免费观看| 一本到不卡免费一区二区| 国产一区二区主播在线| 日本中文字幕不卡| 青娱乐精品视频| 国内欧美视频一区二区| 韩国欧美国产1区| 丰满少妇久久久久久久| 成人精品gif动图一区| www.欧美日韩| 欧美影院一区二区| 欧美一区日本一区韩国一区| 日韩欧美一区二区久久婷婷| 精品精品国产高清a毛片牛牛 | 日本不卡高清视频| 免费精品99久久国产综合精品| 奇米综合一区二区三区精品视频 | 精品精品欲导航| 国产喂奶挤奶一区二区三区| 欧美极品美女视频| 亚洲精品伦理在线| 日韩精品电影一区亚洲| 韩国av一区二区三区四区| 国产ts人妖一区二区| 日本电影欧美片| 欧美一区二区三区性视频| 久久精品亚洲乱码伦伦中文| 亚洲日本在线天堂| 日本亚洲视频在线| 高清av一区二区| 欧美日本韩国一区二区三区视频 | 一区二区三区中文在线| 免费高清不卡av| 成人毛片在线观看| 69精品人人人人| 国产精品成人免费精品自在线观看| 亚洲一线二线三线视频| 国产麻豆成人精品| 欧美吞精做爰啪啪高潮| 久久亚洲精华国产精华液| 一区二区三区四区不卡视频| 国产综合色在线| 在线精品视频一区二区| 精品电影一区二区三区 | 精品捆绑美女sm三区| 亚洲猫色日本管| 九一九一国产精品| 欧美日韩亚州综合| 亚洲天堂免费看| 国产不卡免费视频| 日韩欧美一二三| 亚洲成人久久影院| 99re8在线精品视频免费播放| 91精品蜜臀在线一区尤物| 国产精品国产a| 国产精品一区在线| 91精品国产综合久久国产大片| 国产精品毛片久久久久久| 青娱乐精品视频在线| 欧美性一区二区| 亚洲品质自拍视频| 成人高清在线视频| 久久日韩精品一区二区五区| 丝袜亚洲精品中文字幕一区| 色综合中文字幕国产 | 亚洲国产成人一区二区三区| 美女高潮久久久| 欧美精品丝袜中出| 亚洲国产中文字幕| 欧美日韩一区二区在线观看 | 麻豆一区二区三| 91精品麻豆日日躁夜夜躁| 亚洲国产精品一区二区尤物区| 91麻豆免费在线观看| 综合自拍亚洲综合图不卡区| 成人免费av网站| 亚洲精品成人天堂一二三| 99re视频这里只有精品| ...av二区三区久久精品| 国产精品亚洲第一| 日本一区二区免费在线| 成人午夜在线视频| 国产精品三级电影| 成人国产一区二区三区精品| 最新中文字幕一区二区三区| 99精品黄色片免费大全| 亚洲免费电影在线| 欧洲一区在线电影| 日韩综合小视频| 2024国产精品视频| 成人国产精品免费网站| 亚洲女厕所小便bbb| 欧美日韩三级在线| 久久99国产精品久久99| 欧美激情一区二区三区不卡| 91色.com| 蜜臀99久久精品久久久久久软件| 日韩免费观看高清完整版| 国产精品一区二区三区网站| 国产精品麻豆视频| 欧美日韩国产免费一区二区| 国产一区美女在线| 亚洲精品五月天| 精品理论电影在线| 色呦呦网站一区| 精品在线你懂的| 亚洲女子a中天字幕| 日韩免费成人网| 色综合久久中文字幕| 男女男精品网站| 成人免费小视频| 日韩网站在线看片你懂的| 国产精品18久久久久久久久久久久 | 欧美视频一区二区在线观看| 麻豆精品国产传媒mv男同| 国产精品久久久久影视| 日韩欧美专区在线| 91免费观看国产| 国产一区二区伦理| 亚洲va天堂va国产va久| 欧美经典一区二区三区| 欧美一区二区免费观在线| aaa国产一区| 国产福利精品一区二区| 日韩不卡免费视频| 亚洲色图欧洲色图| 久久伊人中文字幕| 91精品欧美久久久久久动漫| 不卡免费追剧大全电视剧网站| 乱一区二区av| 午夜精品久久久久久久久| 亚洲欧洲日韩在线| 精品99久久久久久| 欧美一区二区视频在线观看2020| 97国产一区二区| 国产成人免费9x9x人网站视频| 亚洲综合色丁香婷婷六月图片| 国产精品全国免费观看高清| 精品乱码亚洲一区二区不卡| 欧美一区三区二区| 欧美日韩和欧美的一区二区| 色综合久久综合| 一本色道**综合亚洲精品蜜桃冫| 处破女av一区二区| 国产精品1024| 国产福利精品导航| 国产成人av影院| 福利电影一区二区| 国产福利不卡视频| 国产激情视频一区二区在线观看 | 亚洲人成在线观看一区二区| 中文字幕不卡的av| 国产精品久久夜| 中文字幕在线一区免费| 国产精品毛片久久久久久久| 国产精品国产三级国产有无不卡| 日本一区二区视频在线观看| 国产精品女人毛片| 国产精品高潮呻吟| 亚洲激情六月丁香| 午夜伦理一区二区| 日本美女一区二区| 国产精品亚洲午夜一区二区三区 | 欧美色爱综合网| 欧美日韩国产在线观看| 777欧美精品| 久久久噜噜噜久噜久久综合| 久久亚洲精华国产精华液| 日本一区二区综合亚洲| 亚洲三级在线免费观看| 亚洲国产日韩一级| 老司机精品视频线观看86| 国产精品性做久久久久久| 成人一区二区在线观看| 色综合天天综合在线视频| 欧美三级电影在线看| 精品三级av在线| 亚洲伦理在线精品| 人人狠狠综合久久亚洲| 国产成人久久精品77777最新版本| 99精品视频在线观看免费| 欧美日韩一二区| 欧美激情中文不卡| 亚洲国产精品久久久久秋霞影院| 美女视频黄a大片欧美| 成人激情开心网| 日韩写真欧美这视频| 亚洲视频一二三区| 麻豆视频观看网址久久| 色综合久久久久综合体| 日韩精品专区在线影院重磅| 国产精品久久久久久久岛一牛影视| 亚洲高清中文字幕| 懂色av一区二区三区蜜臀| 精品视频在线看| 国产精品卡一卡二卡三| 日本欧美肥老太交大片| 色综合视频一区二区三区高清| 日韩欧美色电影|