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

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

?? comport.c

?? 微軟的point of sale的源代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
                             */
                            WCHAR comPortIndexString[4+1];
                            ULONG thisComNumber;
                            for (i = 0; (i < 4) && (i < keyValueInfo->DataLength/sizeof(WCHAR)); i++){
                                comPortIndexString[i] = valuePtr[3+i];
                            }
                            comPortIndexString[i] = UNICODE_NULL;

                            thisComNumber = LAtoD(comPortIndexString);
                            if (thisComNumber == 0){
                                ASSERT(thisComNumber != 0);
                            }
                            else if (thisComNumber <= sizeof(ULONG)*8){
                                comNameMask |= 1 << (thisComNumber-1);
                            }
                            else {
                                ASSERT(thisComNumber <= sizeof(ULONG)*8);
                            }
                        }
                    }
                }
            } while (NT_SUCCESS(status));

            /*
             *  First clear bit in comNameMask represents the first available COM name.
             */
            for (i = 0; i < sizeof(ULONG)*8; i++){
                if (!(comNameMask & (1 << i))){
                    WCHAR comName[] = L"COMxxxx";
                    ULONG comNumLen;

                    /*
                     *  Save the COM port number that we're returning.
                     */
                    comNumber = i+1;
                    DBGVERBOSE(("GetFreeComPortNumber: got free COM port #%xh.", comNumber));

                    /*
                     *  Write a temporary COMx=COMx holder value to the SERIALCOMM key
                     *  so that no other PDOs get this COM port number.
                     *  This value will get overwritten by <symbolicLinkName=COMx> when the pdo is started.
                     */
                    comNumLen = MyLog(10, comNumber)+1;
                    ASSERT(comNumLen <= 4);
                    NumToDecString(comName+3, (USHORT)comNumber, (USHORT)comNumLen);
                    comName[3+comNumLen] = UNICODE_NULL;
			        status = RtlWriteRegistryValue(	RTL_REGISTRY_DEVICEMAP, 
											        L"SERIALCOMM",
											        comName, 
											        REG_SZ,
											        comName,
											        (3 + comNumLen + 1) * sizeof(WCHAR));
                    ASSERT(NT_SUCCESS(status));

                    break;
                }
            }


        }
        else {
            DBGERR(("GetFreeComPortNumber: ZwOpenKey failed with status %xh", status));
        }

    }
    else {
    
        /*
         *  Windows NT.  
         *      Use the COM Name Arbiter bitmap.
         */

	    HANDLE hKey;
	    OBJECT_ATTRIBUTES objectAttributes;
	    UNICODE_STRING keyName;
	    NTSTATUS status;


	    RtlInitUnicodeString(&keyName, L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\COM Name Arbiter");
	    InitializeObjectAttributes( &objectAttributes,
								    &keyName,
								    OBJ_CASE_INSENSITIVE,
								    NULL,				
								    (PSECURITY_DESCRIPTOR)NULL);

	    status = ZwOpenKey(	&hKey,
						    KEY_QUERY_VALUE | KEY_SET_VALUE,
						    &objectAttributes);
	    if (NT_SUCCESS(status)){
		    UNICODE_STRING valueName;
		    PVOID rawData;
		    ULONG dataSize;

		    RtlInitUnicodeString(&valueName, L"ComDB");

		    ASSERT(hKey);

		    dataSize = sizeof(KEY_VALUE_PARTIAL_INFORMATION);

		    /*
		     *  Allocate one extra byte in case we have to add a byte to ComDB
		     */
		    rawData = ALLOCPOOL(NonPagedPool, dataSize+1);

		    if (rawData){
			    status = ZwQueryValueKey(	hKey, 
										    &valueName, 
										    KeyValuePartialInformation,
										    rawData,
										    dataSize,
										    &dataSize);
			    if (status == STATUS_BUFFER_OVERFLOW){
				    FREEPOOL(rawData);
				    ASSERT(dataSize > FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data));

				    /*
				     *  Allocate one extra byte in case we have to add a byte to ComDB
				     */
				    rawData = ALLOCPOOL(NonPagedPool, dataSize+1);
				    if (rawData){
					    status = ZwQueryValueKey(	hKey, 
												    &valueName, 
												    KeyValuePartialInformation,
												    rawData,
												    dataSize,
												    &dataSize);
				    }
			    }

			    if (NT_SUCCESS(status)){
				    PKEY_VALUE_PARTIAL_INFORMATION keyPartialInfo = (PKEY_VALUE_PARTIAL_INFORMATION)rawData;
				    ULONG b, i;
				    BOOLEAN done = FALSE;

				    ASSERT(dataSize >= FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data));
				    
				    ASSERT(keyPartialInfo->Type == REG_BINARY);

				    /*
				     *  The ComDB value is just a bit mask where bit n set indicates
				     *  that COM port # n+1 is taken.
				     *  Get the index of the first unset bit; starting with bit 2 (COM3).
				     */
				    for (b = 0; (b < dataSize-FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data)) && !done; b++){
				    
					    for (i = (b == 0) ? 2 : 0; (i < 8) && !done; i++){
						    if (keyPartialInfo->Data[b] & (1 << i)){
							    /*
							     *  This COM port (#8*b+i+1) is taken, go to the next one.
							     */
						    }
						    else {
							    /*
							     *  Found a free COM port.  
							     *  Write the value back with the new bit set.
							     *  Only write back the number of bytes we read earlier.
							     *  Only use this COM port if the write succeeds.
							     *
							     *  Note:	careful with the size of the KEY_VALUE_PARTIAL_INFORMATION
							     *			struct.  Its real size is 0x0D bytes, 
							     *			but the compiler aligns it to 0x10 bytes.
							     *			So use FIELD_OFFSET, not sizeof, to determine
							     *			how many bytes to write.
							     */
							    keyPartialInfo->Data[b] |= (1 << i);
							    status = ZwSetValueKey(	hKey, 
													    &valueName,
													    0,
													    REG_BINARY,
													    (PVOID)keyPartialInfo->Data, 
													    dataSize-FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data));
							    if (NT_SUCCESS(status)){
								    comNumber = 8*b + i + 1;
								    DBGVERBOSE(("GetFreeComPortNumber: got free COM port #%xh.", comNumber));
							    }
							    else {
								    DBGERR(("GetFreeComPortNumber: ZwSetValueKey failed with %xh.", status));
							    }

							    done = TRUE;
						    }
					    }
				    }

				    if ((b == dataSize-FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data)) && !done){
					    /*
					     *  No more available bits in ComDB, so add a byte.
					     */
					    ASSERT(comNumber == -1);
					    ASSERT(b > 0);
					    DBGWARN(("ComDB overflow -- adding new byte"));

					    keyPartialInfo->Data[b] = 1;
					    dataSize++;

					    status = ZwSetValueKey(	hKey, 
											    &valueName,
											    0,
											    REG_BINARY,
											    (PVOID)keyPartialInfo->Data, 
											    dataSize-FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data));
					    if (NT_SUCCESS(status)){
						    comNumber = 8*b + 1;
						    DBGVERBOSE(("GetFreeComPortNumber: got free COM port #%xh.", comNumber));
					    }
					    else {
						    DBGERR(("GetFreeComPortNumber: ZwSetValueKey #2 failed with %xh.", status));
					    }
				    }

				    ASSERT(comNumber != -1);
			    }
			    else {
				    DBGERR(("GetFreeComPortNumber: ZwQueryValueKey failed with %xh.", status));
			    }

			    /*
			     *  Check that we didn't fail the second allocation before freeing this buffer.
			     */
			    if (rawData){
				    FREEPOOL(rawData);
			    }
		    }
		    else {
			    status = STATUS_INSUFFICIENT_RESOURCES;
		    }

		    status = ZwClose(hKey);
		    ASSERT(NT_SUCCESS(status));
	    }
	    else {
		    DBGERR(("GetFreeComPortNumber: ZwOpenKey failed with %xh.", status));
	    }

    }

    ASSERT(comNumber != -1);
	return comNumber;
}



VOID ReleaseCOMPort(LONG comPortNumber)
{

    if (isWin9x){
        /*
         *  We punt on this for Win9x.  
         *  That's ok since the SERIALCOMM keys are dynamically-generated at each boot,
         *  so if start fails a COM port number will just be unavailable until the next boot.
         */
        DBGWARN(("ReleaseCOMPort: not implemented for Win9x")); // BUGBUG
    }
    else {

        HANDLE hKey = NULL;
        OBJECT_ATTRIBUTES objectAttributes;
        UNICODE_STRING keyName;
        NTSTATUS status;

        ASSERT(comPortNumber > 0);

        RtlInitUnicodeString(&keyName, L"\\Registry\\Machine\\System\\CurrentControlSet\\Control\\COM Name Arbiter");
        InitializeObjectAttributes( &objectAttributes,
							        &keyName,
							        OBJ_CASE_INSENSITIVE,
							        NULL,				
							        (PSECURITY_DESCRIPTOR)NULL);

        status = ZwOpenKey(&hKey, KEY_QUERY_VALUE | KEY_SET_VALUE, &objectAttributes);
        if (NT_SUCCESS(status)){
	        UNICODE_STRING valueName;
	        PVOID rawData;
	        ULONG dataSize;

	        RtlInitUnicodeString(&valueName, L"ComDB");

	        ASSERT(hKey);

	        dataSize = sizeof(KEY_VALUE_PARTIAL_INFORMATION);
	        rawData = ALLOCPOOL(NonPagedPool, dataSize);

	        if (rawData){
		        status = ZwQueryValueKey(	hKey, 
									        &valueName, 
									        KeyValuePartialInformation,
									        rawData,
									        dataSize,
									        &dataSize);
		        if (status == STATUS_BUFFER_OVERFLOW){
			        FREEPOOL(rawData);
			        ASSERT(dataSize > FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data));

			        rawData = ALLOCPOOL(NonPagedPool, dataSize);
			        if (rawData){
				        status = ZwQueryValueKey(	hKey, 
											        &valueName, 
											        KeyValuePartialInformation,
											        rawData,
											        dataSize,
											        &dataSize);
			        }
		        }

		        if (NT_SUCCESS(status)){
			        PKEY_VALUE_PARTIAL_INFORMATION keyPartialInfo = (PKEY_VALUE_PARTIAL_INFORMATION)rawData;

			        ASSERT(dataSize > FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data));

			        ASSERT(keyPartialInfo->Type == REG_BINARY);

			        /*
			         *  The ComDB value is just a bit mask where bit n set indicates
			         *  that COM port # n+1 is taken.
			         *  Get the index of the first unset bit; starting with bit 2 (COM3).
			         *
			         *  Note:	careful with the size of the KEY_VALUE_PARTIAL_INFORMATION
			         *			struct.  Its real size is 0x0D bytes, 
			         *			but the compiler aligns it to 0x10 bytes.
			         *			So use FIELD_OFFSET, not sizeof, to determine
			         *			how many bytes to write.
			         */
			        ASSERT(comPortNumber >= 3);
			        if ((comPortNumber > 0) && (comPortNumber <= (LONG)(dataSize-FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data))*8)){
				        ASSERT(keyPartialInfo->Data[(comPortNumber-1)/8] & (1 << ((comPortNumber-1) & 7)));
				        keyPartialInfo->Data[(comPortNumber-1)/8] &= ~(1 << ((comPortNumber-1) & 7));
				        status = ZwSetValueKey(	hKey, 
										        &valueName,
										        0,
										        REG_BINARY,
										        (PVOID)keyPartialInfo->Data, 
										        dataSize-FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data));
				        if (NT_SUCCESS(status)){
					        DBGVERBOSE(("ReleaseCOMPort: released COM port # %xh.", comPortNumber));
				        }
				        else {
					        DBGERR(("ReleaseCOMPort: ZwSetValueKey failed with %xh.", status));
				        }
			        }
			        else {
				        ASSERT((comPortNumber > 0) && (comPortNumber <= (LONG)(dataSize-FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data))*8));
			        }
		        }
		        else {
			        DBGERR(("ReleaseCOMPort: ZwQueryValueKey failed with %xh.", status));
		        }

		        /*
		         *  Check that we didn't fail the second allocation before freeing this buffer.
		         */
		        if (rawData){
			        FREEPOOL(rawData);
		        }
	        }
	        else {
		        status = STATUS_INSUFFICIENT_RESOURCES;
	        }

	        status = ZwClose(hKey);
	        ASSERT(NT_SUCCESS(status));
        }
        else {
	        DBGERR(("ReleaseCOMPort: ZwOpenKey failed with %xh.", status));
        }
    }

}



?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品69久久久久水密桃| 色av综合在线| 亚洲美腿欧美偷拍| 日韩视频在线永久播放| 成人黄色小视频在线观看| 伦理电影国产精品| 亚洲精品ww久久久久久p站| 久久久久久久久久久久久久久99| 欧美在线免费观看视频| 成人午夜激情影院| 美女视频黄 久久| 三级一区在线视频先锋| 亚洲美女屁股眼交3| 国产精品无码永久免费888| 日韩欧美在线网站| 欧美日韩亚洲综合| 欧美中文字幕一二三区视频| av电影在线观看完整版一区二区| 久久国产剧场电影| 美女在线一区二区| 亚洲国产成人精品视频| 亚洲私人影院在线观看| 欧美经典一区二区| 久久久影院官网| 日韩欧美美女一区二区三区| 91精品久久久久久蜜臀| 欧美色精品在线视频| 欧美亚洲日本一区| 在线影院国内精品| 91国偷自产一区二区三区成为亚洲经典| 成人激情小说乱人伦| 丁香天五香天堂综合| 国产福利一区在线| 高清久久久久久| 大尺度一区二区| 菠萝蜜视频在线观看一区| 成人三级在线视频| 成人福利视频网站| 一本色道久久综合亚洲aⅴ蜜桃 | 国产·精品毛片| 国产成人自拍网| 国产91丝袜在线18| 成人h动漫精品一区二区| 成人一区二区三区| 白白色 亚洲乱淫| 色中色一区二区| 欧美影视一区在线| 91精品午夜视频| 精品欧美久久久| 久久久亚洲高清| 国产精品国产精品国产专区不蜜| 国产精品伦一区| 亚洲精品久久久久久国产精华液| 一区二区三区免费| 婷婷中文字幕综合| 久久99热狠狠色一区二区| 国产一区二区三区观看| 丁香六月久久综合狠狠色| 色综合视频在线观看| 欧美日韩国产综合久久| 日韩写真欧美这视频| 久久综合久久鬼色| 最新日韩av在线| 午夜久久久影院| 国产一区二区三区四| 91美女蜜桃在线| 91精品欧美综合在线观看最新| 久久久噜噜噜久久人人看| 亚洲精品视频在线观看网站| 日本亚洲欧美天堂免费| 国产成人精品免费| 欧美自拍偷拍午夜视频| 26uuu亚洲| 亚洲精品国产第一综合99久久| 日韩中文字幕区一区有砖一区| 国产夫妻精品视频| 欧美午夜在线观看| 久久尤物电影视频在线观看| 亚洲人妖av一区二区| 日韩电影免费在线| 99视频在线精品| 日韩欧美色电影| 亚洲精品久久嫩草网站秘色| 狠狠色伊人亚洲综合成人| 波多野结衣亚洲一区| 欧美精品aⅴ在线视频| 国产精品乱人伦中文| 日本中文在线一区| 99国产精品国产精品久久| 欧美一三区三区四区免费在线看 | 亚洲国产精华液网站w| 亚洲一区免费视频| 国产一区美女在线| 欧美三级欧美一级| 国产精品沙发午睡系列990531| 婷婷综合久久一区二区三区| 99国产一区二区三精品乱码| 日韩一区和二区| 亚洲一区自拍偷拍| 成人a区在线观看| 日韩欧美在线观看一区二区三区| 亚洲视频在线观看三级| 国产精品一线二线三线精华| 欧美丝袜丝交足nylons图片| 欧美韩国日本综合| 激情久久久久久久久久久久久久久久| 91免费版pro下载短视频| 久久精品一区八戒影视| 日韩精品一二三| 在线观看免费成人| 中文字幕综合网| 国产成人一区二区精品非洲| 精品日韩欧美在线| 日韩电影网1区2区| 717成人午夜免费福利电影| 亚洲精品视频在线观看免费 | 91在线无精精品入口| 欧美变态tickle挠乳网站| 亚洲国产人成综合网站| 93久久精品日日躁夜夜躁欧美| 国产三级精品三级在线专区| 免费观看日韩电影| 91精品国产欧美一区二区| 午夜精品视频一区| 欧美在线观看视频一区二区| 亚洲日本va午夜在线影院| 99麻豆久久久国产精品免费 | 欧美手机在线视频| 亚洲黄一区二区三区| 99国产精品久| 亚洲人成精品久久久久久| 97精品久久久午夜一区二区三区| 欧美国产一区在线| 成人黄色综合网站| 综合久久给合久久狠狠狠97色| zzijzzij亚洲日本少妇熟睡| 一区在线中文字幕| 91香蕉视频mp4| 亚洲激情av在线| 欧美色大人视频| 视频一区中文字幕| 欧美高清性hdvideosex| 日本色综合中文字幕| 欧美一区二区三级| 久草这里只有精品视频| 精品国产91久久久久久久妲己| 国产一区二区伦理片| 中文字幕欧美激情| 91看片淫黄大片一级在线观看| 亚洲精品欧美二区三区中文字幕| 在线视频你懂得一区| 青青草伊人久久| 国产亚洲精品久| 91国偷自产一区二区三区观看 | 日韩免费高清电影| 国产一区三区三区| ...中文天堂在线一区| 欧美日韩精品欧美日韩精品一| 日韩 欧美一区二区三区| 久久免费看少妇高潮| 99久久er热在这里只有精品15| 亚洲美女少妇撒尿| 日韩精品一区二区三区视频播放| 国产一区二区三区黄视频| 亚洲男女毛片无遮挡| 欧美一区二区视频在线观看2020| 国产专区欧美精品| 亚洲精品国产高清久久伦理二区| 69久久99精品久久久久婷婷| 国产麻豆9l精品三级站| 亚洲美女淫视频| 日韩欧美国产1| 99久久精品国产一区| 日本伊人精品一区二区三区观看方式| 久久奇米777| 91极品美女在线| 国产精品自拍三区| 一区二区三区.www| 久久毛片高清国产| 精品视频一区二区三区免费| 国产精品中文有码| 亚洲午夜久久久久久久久久久 | 亚洲国产精品激情在线观看| 欧美三日本三级三级在线播放| 国产在线麻豆精品观看| 亚洲综合在线五月| 久久嫩草精品久久久精品| 欧美日本一道本在线视频| 懂色av一区二区在线播放| 麻豆精品在线视频| 一区二区三区欧美激情| 国产清纯美女被跳蛋高潮一区二区久久w| 色视频成人在线观看免| 国产一区二区三区黄视频| 视频在线在亚洲| 亚洲欧美激情插| 久久蜜桃香蕉精品一区二区三区| 欧美日韩国产小视频| 日本电影欧美片| 成人app在线|