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

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

?? activex.cpp

?? ReactOS是一些高手根據Windows XP的內核編寫出的類XP。內核實現機理和API函數調用幾乎相同。甚至可以兼容XP的程序。喜歡研究系統內核的人可以看一看。
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
#include "stdafx.h"

namespace MSTSCLib
{
#include "mstsclib_h.h"
};

namespace MSTSCLib_Redist
{
// extremely ew, but actually the cleanest way to import the alternate UUIDs
#include "mstsclib_redist_i.c"
};

#include "rdesktop/rdesktop.h"
#include "rdesktop/proto.h"

namespace
{
#ifdef _MSC_VER
extern "C" char __ImageBase;
#endif

HMODULE GetCurrentModule()
{
	return reinterpret_cast<HMODULE>(&__ImageBase);
}

}

namespace
{

LONG g_moduleRefCount = 0;

void lockServer()
{
	InterlockedIncrement(&g_moduleRefCount);
}

void unlockServer()
{
	InterlockedDecrement(&g_moduleRefCount);
}

bool canUnloadServer()
{
	return g_moduleRefCount == 0;
}

}

namespace
{

void FreeLpsz(LPSTR lpsz)
{
	if(lpsz)
		delete[] lpsz;
}

LPSTR AllocLpsz(const CHAR * lpsz, size_t cb)
{
	LPSTR lpszNew = new CHAR[cb + 1];

	if(lpszNew == NULL)
		return NULL;

	CopyMemory(lpszNew, lpsz, cb);
	lpszNew[cb] = 0;

	return lpszNew;
}

LPSTR AllocLpsz(const WCHAR * lpwsz, int cchIn)
{
	int cch = WideCharToMultiByte(CP_ACP, 0, lpwsz, cchIn, NULL, 0, NULL, NULL);

	if(cch <= 0)
		return NULL;

	LPSTR lpsz = new CHAR[cch];

	if(lpsz == NULL)
		return NULL;

	cch = WideCharToMultiByte(CP_ACP, 0, lpwsz, cchIn, lpsz, cch, NULL, NULL);

	if(cch <= 0)
	{
		FreeLpsz(lpsz);
		return NULL;
	}

	return lpsz;
}

LPSTR BstrToLpsz(BSTR bstr)
{
	return AllocLpsz(bstr, SysStringLen(bstr));
}

BSTR LpszToBstr(LPSTR lpsz)
{
	int cch = MultiByteToWideChar(CP_ACP, 0, lpsz, -1, NULL, 0);

	if(cch <= 0)
		return NULL;

	BSTR bstr = SysAllocStringLen(NULL, cch);

	if(bstr == NULL)
		return NULL;

	cch = MultiByteToWideChar(CP_ACP, 0, lpsz, -1, bstr, cch);

	if(cch <= 0)
	{
		SysFreeString(bstr);
		return NULL;
	}

	return bstr;
}

}

namespace
{

template<class T, class U> T aligndown(const T& X, const U& align)
{
	return X & ~(T(align) - 1);
}

template<class T, class U> T alignup(const T& X, const U& align)
{
	return aligndown(X + (align - 1), align);
}

/* Convert between bitmap formats */
uint8 * win32_convert_scanlines(int width, int height, int bitcount, int fromalign, int toalign, const uint8 * data, uint8 ** buffer)
{
	// TBD: profile & optimize the most common cases
	assert(width > 0);
	assert(height);
	assert(bitcount && bitcount <= 32);
	assert(fromalign <= toalign);
	assert(data);
	assert(buffer);

	bool flipped = height < 0;

	if(flipped)
		height = - height;

	int bytesperrow = alignup(width * bitcount, 8) / 8;
	int fromstride = alignup(bytesperrow, fromalign);
	int tostride = alignup(bytesperrow, toalign);
	assert(fromstride <= tostride);

	int datasize = tostride * height;

	uint8 * dibits = new uint8[datasize];

	const uint8 * src = data;
	uint8 * dest = dibits;

	const int pad = tostride - fromstride;

	assert(pad < 4);
	__assume(pad < 4);

	if(flipped)
	{
		dest += (height - 1) * tostride;
		tostride = - tostride;
	}

	for(int i = 0; i < height; ++ i)
	{
		memcpy(dest, src, fromstride);
		memset(dest + fromstride, 0, pad);
		src += fromstride;
		dest += tostride;
	}

	*buffer = dibits;
	return dibits;
}

/* Creates bitmaps */
HBITMAP win32_create_dib(LONG width, LONG height, WORD bitcount, const BYTE * data)
{
	struct b_
	{
		BITMAPINFO bmi;
		RGBQUAD colormap[256 - ARRAYSIZE(RTL_FIELD_TYPE(BITMAPINFO, bmiColors))];
	}
	b;

	b.bmi.bmiHeader.biSize = sizeof(b.bmi.bmiHeader);
	b.bmi.bmiHeader.biWidth = width;
	b.bmi.bmiHeader.biHeight = height;
	b.bmi.bmiHeader.biPlanes = 1;
	b.bmi.bmiHeader.biBitCount = bitcount;
	b.bmi.bmiHeader.biCompression = BI_RGB;
	b.bmi.bmiHeader.biSizeImage = 0;
	b.bmi.bmiHeader.biXPelsPerMeter = 0;
	b.bmi.bmiHeader.biYPelsPerMeter = 0;

	if(bitcount > 8)
	{
		b.bmi.bmiHeader.biClrUsed = 0;
		b.bmi.bmiHeader.biClrImportant = 0;
	}
	else
	{
		b.bmi.bmiHeader.biClrUsed = 2 << bitcount;
		b.bmi.bmiHeader.biClrImportant = 2 << bitcount;

		// TODO: palette
	}

	// FIXME: beyond ugly
	HDC hdc = CreateCompatibleDC(NULL);

	if(hdc == NULL)
		return NULL;

	HBITMAP hbm = CreateDIBitmap(hdc, &b.bmi.bmiHeader, CBM_INIT, data, &b.bmi, DIB_RGB_COLORS);

	if(hbm == NULL)
		error("CreateDIBitmap %dx%dx%d failed\n", width, height, bitcount);

	DeleteDC(hdc);
	return hbm;
}

/* Creates brushes */
HBRUSH win32_create_brush(BRUSH * brush, COLORREF fgcolour)
{
	if(brush == NULL)
		return (HBRUSH)GetStockObject(NULL_BRUSH);

	switch(brush->style)
	{
	case BS_SOLID:
	case BS_NULL:
	case BS_HATCHED:
	case BS_PATTERN:
	case BS_PATTERN8X8:
		break;

	default:
		return NULL;
	}

	switch(brush->style)
	{
	case BS_SOLID:
		return CreateSolidBrush(fgcolour);

	case BS_HATCHED:
		return CreateHatchBrush(brush->pattern[0], fgcolour);

	case BS_NULL:
		return (HBRUSH)GetStockObject(NULL_BRUSH);

	case BS_PATTERN:
	case BS_PATTERN8X8:
		{
			uint16 pattern[8];

			for(size_t i = 0; i < 8; ++ i)
				pattern[i] = brush->pattern[i];

			HBITMAP hpattern = CreateBitmap(8, 8, 1, 1, pattern);
			HBRUSH hbr = CreatePatternBrush(hpattern);
			DeleteObject(hpattern);
			return hbr;
		}

	DEFAULT_UNREACHABLE;
	}
}
};

/*
	"sealed" can improve optimizations by asserting a class cannot be derived
	from, optimizing out accesses to the v-table from inside the class
*/
#if defined(_MSC_VER) && _MSC_VER >= 1400
#define SEALED_ sealed
#else
#define SEALED_
#endif


/* Class that implements the RDP client GUI */
class RdpClientUI
{
public:
	// TODO: pass the client settings relevant to the GUI here
	HRESULT Initialize(HWND hwndParent)
	{
		// TODO: create the various windows
		// TODO: create display window thread
		// TODO: create input thread
		return E_FAIL;
	}

public:
	static BOOL Startup()
	{
		WNDCLASSEX wcexUI = { sizeof(wcexUI) };
		WNDCLASSEX wcexConsole = { sizeof(wcexConsole) };
		WNDCLASSEX wcexDisplay = { sizeof(wcexDisplay) };
		WNDCLASSEX wcexInput = { sizeof(wcexInput) };

		HBRUSH nullBrush = (HBRUSH)GetStockObject(HOLLOW_BRUSH);

		wcexUI.lpfnWndProc = NULL; // TODO
		wcexUI.hInstance = GetCurrentModule();
		wcexUI.hCursor = LoadCursor(NULL, IDC_ARROW);
		wcexUI.hbrBackground = nullBrush;
		wcexUI.lpszClassName = TEXT("MissTosca_UI");

		wcexConsole.style = CS_VREDRAW | CS_HREDRAW;
		wcexConsole.lpfnWndProc = NULL; // TODO
		wcexConsole.hInstance = GetCurrentModule();
		wcexConsole.hCursor = LoadCursor(NULL, IDC_ARROW);
		wcexConsole.hbrBackground = nullBrush;
		wcexConsole.lpszClassName = TEXT("MissTosca_Console");

		wcexDisplay.style = CS_VREDRAW | CS_HREDRAW;
		wcexDisplay.lpfnWndProc = NULL; // TODO
		wcexDisplay.hInstance = GetCurrentModule();
		wcexDisplay.hCursor = LoadCursor(NULL, IDC_ARROW);
		wcexDisplay.hbrBackground = nullBrush;
		wcexDisplay.lpszClassName = TEXT("MissTosca_Display");
		
		wcexInput.style = CS_VREDRAW | CS_HREDRAW;
		wcexInput.lpfnWndProc = NULL; // TODO
		wcexInput.hInstance = GetCurrentModule();
		wcexInput.hCursor = NULL;
		wcexInput.hbrBackground = nullBrush;
		wcexInput.lpszClassName = TEXT("MissTosca_Input");

		return
			RegisterClassEx(&wcexUI) &&
			RegisterClassEx(&wcexConsole) &&
			RegisterClassEx(&wcexDisplay) &&
			RegisterClassEx(&wcexInput);
	}

	static void Shutdown()
	{
		// TODO
	}

	/*
		This is the main UI window. It's the direct child of the control
		window, it fills its whole extent and it contains the scrollbars.
		When activated, it will move keyboard focus to the input window
	*/
private:
	HWND m_uiWindow;
	LONG m_scrollHPos;
	LONG m_scrollVPos;

	LRESULT UIWindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
	{
		switch(uMsg)
		{
			// Keep the keyboard focus on the input window
		case WM_ACTIVATE:
			switch(LOWORD(wParam))
			{
			case WA_INACTIVE:
				break;

			case WA_ACTIVE:
			case WA_CLICKACTIVE:
				if(!HIWORD(wParam))
					SetFocus(m_inputWindow);
			}

			return 0;

			// Resized: rearrange children windows, adjust scrollbars
		case WM_SIZE:
			{
				if(IsIconic(m_uiWindow))
					break;

				RECT rcClient;
				GetWindowRect(m_uiWindow, &rcClient);

				if(m_smartSizing)
				{
					// we are not supposed to maintain aspect ratio. Container has to do that
					m_consoleX = 0;
					m_consoleY = 0;
					m_consoleWidth = rcClient.right;
					m_consoleHeight = rcClient.bottom;
				}
				else
				{
					// center horizontally, no horizontal scrollbar
					if(rcClient.right >= m_consoleWidth)
						m_consoleX = (m_consoleWidth - rcClient.right) / 2;

					// center vertically, no vertical scrollbar
					if(rcClient.bottom >= m_consoleHeight)
						m_consoleY = (m_consoleHeight - rcClient.right) / 2;
				}

				SCROLLINFO scroll = { sizeof(scroll), SIF_ALL, 0 };
			
				// update the horizontal scrollbar
				scroll.nMax = m_consoleWidth;
				scroll.nPage = rcClient.right;
				scroll.nPos = 0 - m_consoleX;
				SetScrollInfo(m_uiWindow, SB_HORZ, &scroll, TRUE);

				// update the vertical scrollbar
				scroll.nMax = m_consoleHeight;
				scroll.nPage = rcClient.bottom;
				scroll.nPos = 0 - m_consoleY;
				SetScrollInfo(m_uiWindow, SB_VERT, &scroll, TRUE);

				// move/resize the console window
				MoveWindow(m_consoleWindow, m_consoleX, m_consoleY, m_consoleWidth, m_consoleHeight, TRUE);
			}

			return 0;

		case WM_HSCROLL:
			{
				SCROLLINFO scroll = { sizeof(scroll), SIF_TRACKPOS };
				GetScrollInfo(m_uiWindow, SB_HORZ, &scroll);
				m_consoleX = - scroll.nTrackPos;
				MoveWindow(m_consoleWindow, m_consoleX, m_consoleY, m_consoleWidth, m_consoleHeight, TRUE);
			}

			return 0;

		case WM_VSCROLL:
			{
				SCROLLINFO scroll = { sizeof(scroll), SIF_TRACKPOS };
				GetScrollInfo(m_uiWindow, SB_VERT, &scroll);
				m_consoleY = - scroll.nTrackPos;
				MoveWindow(m_consoleWindow, m_consoleX, m_consoleY, m_consoleWidth, m_consoleHeight, TRUE);
			}

			return 0;

		default:
			break;
		}

		return DefWindowProc(m_uiWindow, uMsg, wParam, lParam);
	}

	/*
		This is the full-screen title bar. It's displayed at the top of the
		main UI window while in full-screen mode, and it contains two toolbars
		with the pin, minimize, restore and close buttons
	*/
	HWND m_fullScreenBarWindow;

	/*
		This is the console window. It has the same extent as the display on
		the remote computer, or it fills the UI window in smart resizing mode,
		and it contains the input and display windows
	*/
private:
	HWND m_consoleWindow;
	LONG m_consoleX;
	LONG m_consoleY;
	LONG m_consoleWidth;
	LONG m_consoleHeight;
	bool m_smartSizing;

	LRESULT ConsoleWindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
	{
		switch(uMsg)
		{
		case WM_SIZE:
			{
				RECT rcClient;
				GetClientRect(m_consoleWindow, &rcClient);

				MoveWindow(m_inputWindow, 0, 0, rcClient.right, rcClient.bottom, TRUE);
				MoveWindow(m_displayWindow, 0, 0, rcClient.right, rcClient.bottom, TRUE);
			}

			return 0;

		default:
			break;
		}

		return DefWindowProc(m_consoleWindow, uMsg, wParam, lParam);
	}

	/*
		This is the display window. It represents the virtual display of the
		remote computer. It completely fills its parent, the console window,
		and it runs in its own thread for performance reasons
	*/
private:
	HWND m_displayWindow;
	LONG m_displayBufferWidth;
	LONG m_displayBufferHeight;
	HDC m_displayBuffer;
	void * m_displayBufferRaw;
	int m_displayBufferSave;
	int m_displayBufferBitDepth;
	int m_displayBufferByteDepth;
	int m_displayBufferStride;
	RECT m_displayBufferClip;
	CRITICAL_SECTION m_displayBufferMutex;

	LRESULT DisplayWindowProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
	{
		switch(uMsg)
		{
		case WM_DESTROY:
			PostQuitMessage(0);
			return 0;

		case WM_PRINTCLIENT:
			if(wParam == 0)
				break;

		case WM_PAINT:
			{
				HDC hdc = (HDC)wParam;

				EnterCriticalSection(&m_displayBufferMutex);

				if(hdc)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲精品乱码久久久久久黑人| 蜜桃视频一区二区三区| 秋霞午夜av一区二区三区| 色综合一个色综合亚洲| 欧美大片在线观看| 一级女性全黄久久生活片免费| 成人高清视频在线观看| 久久综合色鬼综合色| 国产九色精品成人porny| 日韩一本二本av| 久久精品国产久精国产| 欧美xxxx在线观看| 国产综合成人久久大片91| 337p日本欧洲亚洲大胆精品| 国产酒店精品激情| 国产日本一区二区| 91免费版在线| 亚洲一区二区av电影| 91久久免费观看| 午夜精品福利一区二区蜜股av| 色婷婷亚洲精品| 1024成人网| 91精品国产综合久久久蜜臀粉嫩| 日产国产高清一区二区三区| 日韩一区二区三区视频| 免费观看日韩av| 欧美国产精品v| 色婷婷狠狠综合| 亚洲高清免费观看 | 亚洲黄网站在线观看| 91在线一区二区三区| 亚洲高清在线精品| 日韩片之四级片| 91免费观看视频在线| 美女性感视频久久| 26uuu色噜噜精品一区| 久久先锋资源网| 欧美怡红院视频| 国产黄色91视频| 亚洲激情在线播放| 中文字幕精品综合| 日韩欧美在线影院| 欧美日韩免费观看一区二区三区| 看电视剧不卡顿的网站| 洋洋av久久久久久久一区| 久久精品人人做| 精品国产精品网麻豆系列| 777午夜精品视频在线播放| 欧美性视频一区二区三区| 99国产麻豆精品| 波多野结衣在线一区| 国模少妇一区二区三区| 美腿丝袜亚洲一区| 日韩av一区二区三区| 亚洲成人av电影在线| 五月激情六月综合| 亚洲乱码一区二区三区在线观看| 国产精品久久久久一区二区三区 | 亚洲综合视频网| 亚洲欧美日韩久久| 亚洲成在人线在线播放| 日韩中文字幕不卡| 亚洲不卡在线观看| 男女性色大片免费观看一区二区 | 日韩成人一级片| 麻豆精品一二三| 麻豆精品视频在线观看免费| 另类小说图片综合网| 国产乱理伦片在线观看夜一区| 成人午夜在线免费| 成人午夜碰碰视频| 色999日韩国产欧美一区二区| 欧美日韩一区二区在线视频| 欧美军同video69gay| 久久免费视频色| 亚洲午夜久久久久| 国产精品18久久久久久久久| 色综合中文字幕国产 | 国产精品不卡视频| 精品中文av资源站在线观看| 成人av片在线观看| 欧美成人三级电影在线| 中文字幕一区在线观看视频| 亚洲成人av免费| 99久久国产综合色|国产精品| 久久这里只有精品视频网| 亚洲欧美电影院| 懂色一区二区三区免费观看| 7777精品伊人久久久大香线蕉的 | 亚洲综合色自拍一区| 91视频在线看| 中文字幕乱码亚洲精品一区| 免费视频最近日韩| 91丨porny丨国产入口| 久久久久国产精品免费免费搜索| 亚洲成人午夜影院| 欧洲视频一区二区| 国产精品久久久久久久久久久免费看| 亚洲成人自拍网| 欧美色精品在线视频| 亚洲一区二区三区影院| 91官网在线观看| 亚洲一区精品在线| 欧美人伦禁忌dvd放荡欲情| 亚洲精品福利视频网站| av福利精品导航| 一区二区三区在线影院| 色成年激情久久综合| 亚洲日本欧美天堂| 欧美在线免费播放| 亚洲自拍另类综合| 欧美一级片免费看| 黑人精品欧美一区二区蜜桃| 久久综合狠狠综合| 国产成人精品免费| 亚洲美女屁股眼交| 欧美亚洲国产bt| 激情综合网av| 国产精品污网站| 欧美系列日韩一区| 美女被吸乳得到大胸91| 久久久久久久久久久久久久久99| 国产一区二区毛片| 国产精品理伦片| 欧美日韩午夜在线视频| 久久国产精品免费| 亚洲人成小说网站色在线| 欧美日韩黄色影视| 国产精品一区不卡| 亚洲国产三级在线| 国产精品久久久久久久久免费丝袜| 色婷婷精品久久二区二区蜜臂av | 国产精品 欧美精品| 日韩国产成人精品| 国产精品成人免费精品自在线观看| 91在线云播放| 国产精品一区二区视频| 蜜臀久久久久久久| 亚洲国产视频一区| 自拍偷拍亚洲激情| 中文字幕不卡在线| 久久麻豆一区二区| 精品国产污网站| 在线观看视频一区二区| 成人av免费网站| 日韩成人免费电影| 亚洲一区二区影院| 一级特黄大欧美久久久| 亚洲三级久久久| 亚洲私人黄色宅男| 一卡二卡欧美日韩| 午夜久久久影院| 国产精品18久久久久久久久| 99re在线视频这里只有精品| 亚洲男人的天堂av| 欧美视频三区在线播放| 日韩国产欧美三级| 久久久青草青青国产亚洲免观| 风间由美一区二区av101| 亚洲免费成人av| 91.com视频| 国内精品国产成人国产三级粉色| 国产亚洲精品资源在线26u| 不卡av免费在线观看| 亚洲一区在线视频观看| 日韩视频一区二区三区| 国产激情一区二区三区桃花岛亚洲| 国产精品国产自产拍高清av| 在线一区二区三区四区五区| 免费精品99久久国产综合精品| 久久精品亚洲麻豆av一区二区 | 欧美大黄免费观看| 国产v综合v亚洲欧| 亚洲激情在线播放| 日韩一区二区三区三四区视频在线观看 | 亚洲国产高清aⅴ视频| 91亚洲国产成人精品一区二区三 | 国产成人亚洲综合色影视| 国产精品不卡一区| 精品视频全国免费看| 奇米精品一区二区三区在线观看一 | 欧美三级中文字幕在线观看| 欧美日韩亚洲综合一区| 日韩一级片在线观看| 美女国产一区二区| 久久综合中文字幕| av中文字幕不卡| 一区二区三区在线免费播放| 丰满白嫩尤物一区二区| 亚洲欧美区自拍先锋| 色一情一伦一子一伦一区| 三级影片在线观看欧美日韩一区二区 | 亚洲美女屁股眼交3| 色综合久久中文字幕综合网| 亚洲第一久久影院| 精品福利在线导航| 一本色道久久综合亚洲aⅴ蜜桃 | 国产精品视频免费看| 粉嫩av一区二区三区| 亚洲男帅同性gay1069|