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

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

?? touch-driver-proxy.cpp

?? TouchPanel driver which encapsulate real driver. This driver helps to hook by user application touch
?? CPP
字號:



#include <windows.h>
#include <Pmpolicy.h>
#include "touch-driver-proxy.h"
#include "logger.h"


#ifdef __cplusplus
extern "C"{
#endif 

#define TOUCH_DRV_FN	L"touch.dll"
#define _GET_PROC_PTR(procType, procName)	\
	if (!pfn##procName) { \
	_LOG(L"Loading func '%s'\n", L#procName); \
		pfn##procName = (procType)GetProcAddress(g_hTouchLib, L#procName); \
	} 
	//\
	//_LOG(L"Calling func '%s'\n", L#procName);

#define GET_PROC_PTR(procType, procName) \
	_GET_PROC_PTR(procType, procName); \
	if (!pfn##procName) { \
		_LOG(L"Error loading func '%s'\n", L#procName); \
	}

#define GET_PROC_PTR_RZERO(procType, procName) \
	_GET_PROC_PTR(procType, procName); \
	if (!pfn##procName) { \
		_LOG(L"Error loading func '%s'\n", L#procName); \
		return 0; \
	}

#define GET_PROC_PTR_RNOTH(procType, procName) \
	_GET_PROC_PTR(procType, procName); \
	if (!pfn##procName) { \
		_LOG(L"Error loading func '%s'\n", L#procName); \
		return; \
	}


#define MAX_CALLBACKS		10
typedef struct proxy_callback
{
	HWND tpcbHWND;
	DWORD tpcbMessage;
} ProxyCallback, *PProxyCallback;

typedef struct shared_tag
{
	CRITICAL_SECTION lock;
	ProxyCallback cbs[MAX_CALLBACKS];
	int cbsUsed;
} SharedMem, *PSharedMem;

HANDLE shmem_map = 0;
PSharedMem shmem_dll = 0;

HMODULE g_hTouchLib;
bool powerHandlerInitialized;
PFN_TOUCH_PANEL_GET_DEVICE_CAPS pfnTouchPanelGetDeviceCaps;
PFN_TOUCH_PANEL_SET_MODE pfnTouchPanelSetMode;
PFN_TOUCH_PANEL_INITIALIZE_CURSOR pfnTouchPanelInitializeCursor;
PFN_TOUCH_PANEL_ENABLE pfnTouchPanelEnable;
PFN_TOUCH_PANEL_DISABLE pfnTouchPanelDisable;
PFN_TOUCH_PANEL_READ_CALIBRATION_POINT pfnTouchPanelReadCalibrationPoint;
PFN_TOUCH_PANEL_READ_CALIBRATION_ABORT pfnTouchPanelReadCalibrationAbort;
PFN_TOUCH_PANEL_SET_CALIBRATION pfnTouchPanelSetCalibration;
PFN_TOUCH_PANEL_CALIBRATE_A_POINT pfnTouchPanelCalibrateAPoint;
PFN_TOUCH_PANEL_POWER_HANDLER pfnTouchPanelPowerHandler;
PFN_TOUCH_GET_QUEUE_PTR pfnTouchGetQueuePtr;
PFN_TOUCH_GET_FOCUS_WND pfnTouchGetFocusWnd;
PFN_TOUCH_GET_LAST_TOUCH_FOCUS_WND pfnTouchGetLastTouchFocusWnd;
PFN_TOUCH_RESET pfnTouchReset;
PFN_TOUCH_CREATE_EVENT pfnTouchCreateEvent;
PFN_TOUCH_GET_REGISTERED_WINDOW pfnTouchGetRegisteredWindow;
PFN_TOUCH_REGISTER_WINDOW pfnTouchRegisterWindow;
PFN_TOUCH_UNREGISTER_WINDOW pfnTouchUnregisterWindow;
PFN_TOUCH_SET_VALUE pfnTouchSetValue;
PFN_TOUCH_GET_VALUE pfnTouchGetValue;

PFN_TOUCH_PANEL_CALLBACK pfnTouchPanelCallbackOriginal;
void TouchPanelPowerHandler(BOOL	bOff);
static bool TouchPanelPowerFlag = true;

bool TouchPanelProxyRegisterMessage(HWND cbHwnd, DWORD cbMessage)
{
	_LOG(L"registerProxyCb: %08X:%08X\n", cbHwnd, cbMessage);	
	bool ret = false;
	EnterCriticalSection(&(shmem_dll->lock));	
	if (shmem_dll->cbsUsed < MAX_CALLBACKS && cbMessage && cbHwnd)
	{
		int i = shmem_dll->cbsUsed;
		for (int j=0; j<i; j++)
		{
			if (shmem_dll->cbs[j].tpcbHWND == cbHwnd && shmem_dll->cbs[j].tpcbMessage == cbMessage)
			{
				i = -1;
				break;
			}
		}
		if (i >= 0)
		{
			shmem_dll->cbs[i].tpcbHWND = cbHwnd;
			shmem_dll->cbs[i].tpcbMessage = cbMessage;	
			shmem_dll->cbsUsed++;
		}
		ret = true;
	}
	_LOG(L"registerProxyCb: %08X:%08X => %d\n", cbHwnd, cbMessage, ret);	
	LeaveCriticalSection(&(shmem_dll->lock));
	return ret;
}

static void removeProxyCallback(int i)
{
	int cnt = shmem_dll->cbsUsed;
	_LOG(L"removeProxyCallback (%d from %d)\n", i, cnt);
	for (int j=i+1; j<cnt; j++) shmem_dll->cbs[j-1] = shmem_dll->cbs[j];
	if (i<cnt) shmem_dll->cbsUsed--;
}

bool TouchPanelProxyUnregisterMessage(HWND cbHwnd, DWORD cbMessage)
{
	_LOG(L"unregisterProxyCb: %08X:%08X\n", cbHwnd, cbMessage);	
	bool ret = false;
	EnterCriticalSection(&(shmem_dll->lock));	
	if (shmem_dll->cbsUsed > 0)
	{
		int cnt = shmem_dll->cbsUsed;
		int i;
		for (i=0; i<cnt; i++)
		{
			if (shmem_dll->cbs[i].tpcbHWND == cbHwnd && shmem_dll->cbs[i].tpcbMessage == cbMessage)
				break;
		}
		if (i < cnt)
		{
			removeProxyCallback(i);
			ret = true;
		}
	}
	_LOG(L"unregisterProxyCb: %08X:%08X => %d\n", cbHwnd, cbMessage, ret);	
	LeaveCriticalSection(&(shmem_dll->lock));
	return ret;
}


BOOL TouchPanelCallbackInternal(TOUCH_PANEL_SAMPLE_FLAGS flags, INT	x, INT	y)
{
	_LOG(L"tpcb: (%d,%d; %02X)\n", x, y, flags);

	if (!pfnTouchPanelCallbackOriginal) return FALSE;
	if (!TouchPanelPowerFlag) return FALSE;
	DWORD msgResult = 2;
	if (shmem_dll->cbsUsed > 0)
	{		
		WPARAM wParam = flags;
		LPARAM lParam = MAKELONG(x, y);
		EnterCriticalSection(&(shmem_dll->lock));
		for (int i=shmem_dll->cbsUsed-1; i>=0; i--)
		{
			_LOG(L"SendMessage(%08X,%08X)\n", shmem_dll->cbs[i].tpcbHWND, shmem_dll->cbs[i].tpcbMessage);
			if (SendMessageTimeout(shmem_dll->cbs[i].tpcbHWND, shmem_dll->cbs[i].tpcbMessage, wParam, lParam, SMTO_NORMAL, 2000, &msgResult))
			{
				_LOG(L"SendMessage(%08X,%08X) => %d\n", shmem_dll->cbs[i].tpcbHWND, shmem_dll->cbs[i].tpcbMessage, msgResult);
				if (msgResult < 2) break; 
			}
			else 
			{
				_LOG(L"SendMessage to callback wnd(%08X:%08X) failed\n", shmem_dll->cbs[i].tpcbHWND, shmem_dll->cbs[i].tpcbMessage);
				removeProxyCallback(i);
			}
		}
		LeaveCriticalSection(&(shmem_dll->lock));
	}
	if (msgResult < 2) return (msgResult ? TRUE : FALSE); 
	return pfnTouchPanelCallbackOriginal(flags, x, y);
}

BOOL TouchPanelGetDeviceCaps(INT iIndex, LPVOID lpOutput)
{
	GET_PROC_PTR_RZERO(PFN_TOUCH_PANEL_GET_DEVICE_CAPS, TouchPanelGetDeviceCaps);
	return pfnTouchPanelGetDeviceCaps(iIndex, lpOutput);
}

BOOL TouchPanelSetMode(INT iIndex, LPVOID lpInput)
{
	GET_PROC_PTR_RZERO(PFN_TOUCH_PANEL_SET_MODE, TouchPanelSetMode);
	return pfnTouchPanelSetMode(iIndex, lpInput);
}

BOOL TouchPanelInitializeCursor(PFN_DISP_DRIVER_MOVE_CURSOR pFn)
{
	GET_PROC_PTR_RZERO(PFN_TOUCH_PANEL_INITIALIZE_CURSOR, TouchPanelInitializeCursor);
	return pfnTouchPanelInitializeCursor(pFn);
}

BOOL TouchPanelEnable(PFN_TOUCH_PANEL_CALLBACK pFn)
{
	if (!powerHandlerInitialized) 
	{
		powerHandlerInitialized = true;
		TouchPanelPowerHandler(false);
	}
	if (pFn == 0) return FALSE;
	GET_PROC_PTR_RZERO(PFN_TOUCH_PANEL_ENABLE, TouchPanelEnable);
	pfnTouchPanelCallbackOriginal = pFn;
	return pfnTouchPanelEnable(TouchPanelCallbackInternal);
}

VOID TouchPanelDisable()
{
	pfnTouchPanelCallbackOriginal = 0;
	GET_PROC_PTR_RNOTH(PFN_TOUCH_PANEL_DISABLE, TouchPanelDisable);
	pfnTouchPanelDisable();
}

BOOL TouchPanelReadCalibrationPoint(INT	*pUncalibratedX, INT *pUncalibratedY)
{
	GET_PROC_PTR_RZERO(PFN_TOUCH_PANEL_READ_CALIBRATION_POINT, TouchPanelReadCalibrationPoint);
	return pfnTouchPanelReadCalibrationPoint(pUncalibratedX, pUncalibratedY);
}

VOID TouchPanelReadCalibrationAbort()
{
	GET_PROC_PTR_RNOTH(PFN_TOUCH_PANEL_READ_CALIBRATION_ABORT, TouchPanelReadCalibrationAbort);
	pfnTouchPanelReadCalibrationAbort();
}

BOOL TouchPanelSetCalibration(INT32	cCalibrationPoints,	INT32	*pScreenXBuffer, INT32	*pScreenYBuffer, INT32	*pUncalXBuffer,	INT32	*pUncalYBuffer)
{
	GET_PROC_PTR_RZERO(PFN_TOUCH_PANEL_SET_CALIBRATION, TouchPanelSetCalibration);
	return pfnTouchPanelSetCalibration(cCalibrationPoints, pScreenXBuffer, pScreenYBuffer, pUncalXBuffer, pUncalYBuffer);
}


void TouchPanelCalibrateAPoint(INT32   UncalX, INT32   UncalY, INT32   *pCalX, INT32   *pCalY)
{
	GET_PROC_PTR_RNOTH(PFN_TOUCH_PANEL_CALIBRATE_A_POINT, TouchPanelCalibrateAPoint);
	pfnTouchPanelCalibrateAPoint(UncalX, UncalY, pCalX, pCalY);
}

void TouchPanelPowerHandler(BOOL	bOff)
{
	TouchPanelPowerFlag = !bOff;
	//pfnTouchPanelCallbackOriginal = 0;
	GET_PROC_PTR_RNOTH(PFN_TOUCH_PANEL_POWER_HANDLER, TouchPanelPowerHandler);
	pfnTouchPanelPowerHandler(bOff);
}


LPVOID TouchGetQueuePtr()
{
	GET_PROC_PTR_RZERO(PFN_TOUCH_GET_QUEUE_PTR, TouchGetQueuePtr);
	return pfnTouchGetQueuePtr();
}

HWND TouchGetFocusWnd()
{
	GET_PROC_PTR_RZERO(PFN_TOUCH_GET_FOCUS_WND, TouchGetFocusWnd);
	return pfnTouchGetFocusWnd();
}

HWND TouchGetLastTouchFocusWnd()
{
	GET_PROC_PTR_RZERO(PFN_TOUCH_GET_LAST_TOUCH_FOCUS_WND, TouchGetLastTouchFocusWnd);
	return pfnTouchGetLastTouchFocusWnd();
}

void TouchReset(BOOL bSetAllValuesToDefault)
{
	GET_PROC_PTR_RNOTH(PFN_TOUCH_RESET, TouchReset);
	pfnTouchReset(bSetAllValuesToDefault);
}

void TouchCreateEvent(int iX, int iY)
{
	GET_PROC_PTR_RNOTH(PFN_TOUCH_CREATE_EVENT, TouchCreateEvent);
	pfnTouchCreateEvent(iX, iY);
}

HWND TouchGetRegisteredWindow()
{
	GET_PROC_PTR_RZERO(PFN_TOUCH_GET_REGISTERED_WINDOW, TouchGetRegisteredWindow);
	return pfnTouchGetRegisteredWindow();
}

BOOL TouchRegisterWindow(HWND hClientWnd)
{
	GET_PROC_PTR_RZERO(PFN_TOUCH_REGISTER_WINDOW, TouchRegisterWindow);
	return pfnTouchRegisterWindow(hClientWnd);
}

void TouchUnregisterWindow(HWND hClientWnd)
{
	GET_PROC_PTR_RNOTH(PFN_TOUCH_UNREGISTER_WINDOW, TouchUnregisterWindow);
	pfnTouchUnregisterWindow(hClientWnd);
}

void TouchSetValue(DWORD dwName, DWORD dwValue)
{
	GET_PROC_PTR_RNOTH(PFN_TOUCH_SET_VALUE, TouchSetValue);
	pfnTouchSetValue(dwName, dwValue);
}

LRESULT TouchGetValue(DWORD dwName, DWORD dwValue)
{
	GET_PROC_PTR_RZERO(PFN_TOUCH_GET_VALUE, TouchGetValue);
	return pfnTouchGetValue(dwName, dwValue);
}


static bool deleteCriticalSection;
extern "C" HINSTANCE LoadDriver(LPCWSTR lpszFileName);//defined in pkfuncs.h

BOOL TouchPanelDllEntry(HANDLE  hinstDll, DWORD   fdwReason, LPVOID  lpvReserved)
{
    BOOL ReturnCode = TRUE;

    switch ( fdwReason )
    {
        case DLL_PROCESS_ATTACH:
			_LOG(L"Process attach\n");
            DisableThreadLibraryCalls((HMODULE) hinstDll);
			g_hTouchLib = LoadDriver(TOUCH_DRV_FN);
			GET_PROC_PTR_RZERO(PFN_TOUCH_PANEL_POWER_HANDLER, TouchPanelPowerHandler);
			if (g_hTouchLib)
			{
				shmem_map = CreateFileMapping(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, sizeof(SharedMem), L"touchpx/shmem");
				if (!shmem_map) ReturnCode = FALSE;
				else
				{
					bool doInit = (GetLastError()!=ERROR_ALREADY_EXISTS);
					shmem_dll = (PSharedMem)MapViewOfFile(shmem_map, FILE_MAP_WRITE, 0, 0, 0);
					if (!shmem_dll) ReturnCode = FALSE;
					else
					{
						if (doInit) 
						{
							ZeroMemory(shmem_dll, sizeof(SharedMem));
							deleteCriticalSection = true;
							InitializeCriticalSection(&(shmem_dll->lock));
						}
						else
							deleteCriticalSection = false;
					}
				}
			}
			else
			{
				ReturnCode = FALSE;
			}
            break;


        case DLL_PROCESS_DETACH:
			_LOG(L"Process detach\n");
			ReturnCode = FreeLibrary(g_hTouchLib);
			if (deleteCriticalSection) DeleteCriticalSection(&(shmem_dll->lock));
			if (shmem_dll) UnmapViewOfFile(shmem_dll);
			if (shmem_map) CloseHandle(shmem_map);			
            break;
    }
	_LOG(L"DllEntry ret: %d\n", ReturnCode);
    return ( ReturnCode );
}

BOOL WINAPI DllMain (HANDLE hinstDLL, DWORD dwReason, LPVOID lpvReserved)
{
    return TouchPanelDllEntry(hinstDLL, dwReason, lpvReserved);
}


#ifdef __cplusplus
   }
#endif //ifdef __cplusplus

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
最新欧美精品一区二区三区| 久久人人97超碰com| 91亚洲资源网| 国产高清在线精品| 国产精品综合在线视频| 国产一级精品在线| 成+人+亚洲+综合天堂| 北条麻妃国产九九精品视频| 99久久综合色| 日本乱人伦一区| 在线成人小视频| 日韩精品一区二区三区视频播放 | 免费成人在线网站| 久久av中文字幕片| 成人午夜激情视频| 94-欧美-setu| 在线电影一区二区三区| 久久精品人人做人人爽人人| 国产精品麻豆欧美日韩ww| 亚洲一级二级在线| 开心九九激情九九欧美日韩精美视频电影 | 国产高清不卡一区| 色菇凉天天综合网| 日韩一区二区三区视频在线| 欧美国产日本视频| 亚洲国产中文字幕| 国产乱人伦偷精品视频不卡| 91福利在线导航| 欧美一区二区久久久| 久久精品男人天堂av| 亚洲天堂免费在线观看视频| 午夜精品一区二区三区三上悠亚| 精品制服美女丁香| 欧美综合色免费| 精品国产精品网麻豆系列| 中文字幕一区二区三区乱码在线| 亚洲国产三级在线| 不卡视频在线看| 日韩精品中文字幕在线不卡尤物| 亚洲欧洲日本在线| 精品一区二区影视| 欧美日韩中文一区| 中文字幕免费观看一区| 天堂成人国产精品一区| www.亚洲精品| 久久蜜桃av一区二区天堂| 午夜精品视频一区| 91麻豆精东视频| 久久久九九九九| 免费成人在线视频观看| 在线精品视频免费播放| 亚洲欧洲国产日韩| 国产精品一区免费视频| 欧美一区二区三区免费| 亚洲一区二区三区不卡国产欧美| 成人99免费视频| 久久精品欧美一区二区三区麻豆| 日本不卡视频在线观看| 欧美色男人天堂| 亚洲综合精品久久| 91香蕉视频在线| 国产精品网站在线| 国产成人精品一区二区三区四区 | 国产美女在线观看一区| 精品美女在线播放| 伦理电影国产精品| 9191成人精品久久| 午夜视频在线观看一区二区| 色狠狠色狠狠综合| 亚洲一区二区高清| 欧美色成人综合| 舔着乳尖日韩一区| 欧美精品色综合| 丝袜亚洲另类丝袜在线| 欧美福利电影网| 免费在线一区观看| 精品久久国产老人久久综合| 久久国产综合精品| 亚洲精品在线电影| 丰满少妇在线播放bd日韩电影| 久久精品欧美日韩精品 | 精品视频1区2区| 亚洲午夜电影在线观看| 在线播放/欧美激情| 日本va欧美va欧美va精品| 日韩欧美国产一区二区在线播放| 美日韩一区二区| 精品国产电影一区二区| 成人性生交大片| 一区二区不卡在线视频 午夜欧美不卡在 | 国产午夜久久久久| 成人av免费网站| 亚洲国产wwwccc36天堂| 欧美一区二区三区影视| 国产激情一区二区三区四区| 亚洲天堂成人网| 9191成人精品久久| 国产v综合v亚洲欧| 亚洲高清不卡在线观看| 精品国产乱码久久久久久免费 | 强制捆绑调教一区二区| 欧美激情综合网| 欧美吻胸吃奶大尺度电影 | 亚洲黄色在线视频| 日本不卡视频在线观看| 欧美日韩黄视频| 韩国精品主播一区二区在线观看| 久久免费午夜影院| 欧洲另类一二三四区| 久久成人久久鬼色| 成人欧美一区二区三区在线播放| 欧美日韩亚洲丝袜制服| 国产激情精品久久久第一区二区 | 国产麻豆视频精品| 一区二区三区在线视频免费| 精品国产伦理网| 欧美日韩在线综合| 国产精品18久久久久久久久久久久 | 成人影视亚洲图片在线| 亚洲超碰97人人做人人爱| 国产拍揄自揄精品视频麻豆| 欧美美女直播网站| 成人免费看视频| 久久er精品视频| 亚洲成av人片| 亚洲日本va在线观看| 久久久久97国产精华液好用吗| 欧美另类久久久品| 91视视频在线观看入口直接观看www| 另类调教123区| 五月激情综合婷婷| 亚洲综合色噜噜狠狠| 一色屋精品亚洲香蕉网站| www国产亚洲精品久久麻豆| 欧美精品aⅴ在线视频| 在线观看91视频| jizz一区二区| 成人福利视频在线| 国产91清纯白嫩初高中在线观看| 精品一区精品二区高清| 日韩不卡免费视频| 三级亚洲高清视频| 视频在线观看国产精品| 亚洲电影你懂得| 亚洲国产一区二区三区青草影视 | 欧美一级夜夜爽| 69堂国产成人免费视频| 欧美日韩精品三区| 欧美日韩精品高清| 精品婷婷伊人一区三区三| 精品视频一区三区九区| 欧美喷水一区二区| 欧美日韩小视频| 91精品国产免费| 日韩精品一区二区三区swag| 欧美mv日韩mv国产网站app| www久久久久| 国产精品素人视频| 最新热久久免费视频| 亚洲欧美另类小说| 亚洲第一电影网| 麻豆成人91精品二区三区| 激情欧美一区二区三区在线观看| 国产美女精品在线| 成人国产在线观看| 欧美在线制服丝袜| 欧美一区永久视频免费观看| 精品国产百合女同互慰| 国产精品丝袜黑色高跟| 亚洲欧美激情小说另类| 亚洲成人高清在线| 男男成人高潮片免费网站| 国产高清不卡二三区| 91免费国产在线观看| 欧美日韩久久久久久| www国产成人| 亚洲另类春色国产| 美女mm1313爽爽久久久蜜臀| 国产精品一区久久久久| 色综合咪咪久久| 日韩欧美久久久| 国产精品久久久久久久久久免费看 | 91麻豆国产福利在线观看| 精品视频一区三区九区| 精品国产sm最大网站免费看| 国产精品国模大尺度视频| 日精品一区二区三区| 国产福利一区在线| 制服丝袜av成人在线看| 国产精品成人免费 | xnxx国产精品| 一区二区三区国产精品| 国产在线一区二区综合免费视频| 91视频xxxx| 久久九九全国免费| 亚洲成人一区在线| 成人av免费在线观看| 精品久久国产97色综合| 亚洲亚洲人成综合网络| 成人美女在线观看|