Пример #1
0
BOOL CATCodeMgr::ApplyOption( COptionNode* pRootNode )
{
    BOOL bRetVal = FALSE;

    CString strCurOptionString = m_optionRoot.ChildrenToString();

    // 적용시켜보고
    if( AdjustOption(pRootNode) == FALSE || m_optionRoot.ParseChildren( pRootNode->ChildrenToString() ) == FALSE )
    {
        // 실패면 원상복구
        m_optionRoot.ParseChildren( strCurOptionString );
        AdjustOption(&m_optionRoot);
    }
    else
    {
        // 적용 성공이면
        CString strOptionString = m_optionRoot.ChildrenToString();

#ifdef UNICODE
        wcscpy_s(m_wszOptionString, MAX_OPTION_LEN, strOptionString);
#else
        CString strOptionString;
        WideCharToMultiByte(CP_ACP, 0, strOptionString, -1, m_wszOptionString, MAX_OPTION_LEN, NULL, NULL);
#endif

        bRetVal = TRUE;
    }

    return bRetVal;
}
/*
========================
idMenuScreen_Shell_SystemOptions::idMenuDataSource_SystemSettings::AdjustField
========================
*/
void idMenuScreen_Shell_SystemOptions::idMenuDataSource_SystemSettings::AdjustField( const int fieldIndex, const int adjustAmount ) {
    switch ( fieldIndex ) {
    case SYSTEM_FIELD_FRAMERATE: {
        //Carl: Oculus Rift DK1 can be hacked to use refresh rates from 60Hz to 83Hz (71Hz max undistorted). CV1 will probably support 90Hz.
        //Carl: Doom 3 BFG also originally supported 120Hz. So list everything from 60 to 83, with 90 and 120 last.
        static const int numValues = 26;
        static const int values[numValues] = { 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 90, 120 };
        com_engineHz.SetInteger( AdjustOption( com_engineHz.GetInteger(), values, numValues, adjustAmount ) );
        break;
    }
    case SYSTEM_FIELD_VSYNC: {
        static const int numValues = 3;
        static const int values[numValues] = { 0, 1, 2 };
        r_swapInterval.SetInteger( AdjustOption( r_swapInterval.GetInteger(), values, numValues, adjustAmount ) );
        break;
    }
    case SYSTEM_FIELD_ANTIALIASING: {
        static const int numValues = 5;
        static const int values[numValues] = { 0, 2, 4, 8, 16 };
        r_multiSamples.SetInteger( AdjustOption( r_multiSamples.GetInteger(), values, numValues, adjustAmount ) );
        break;
    }
    case SYSTEM_FIELD_MOTIONBLUR: {
        static const int numValues = 5;
        static const int values[numValues] = { 0, 2, 3, 4, 5 };
        r_motionBlur.SetInteger( AdjustOption( r_motionBlur.GetInteger(), values, numValues, adjustAmount ) );
        break;
    }
    case SYSTEM_FIELD_LODBIAS: {
        const float percent = LinearAdjust( r_lodBias.GetFloat(), -1.0f, 1.0f, 0.0f, 100.0f );
        const float adjusted = percent + (float)adjustAmount * 5.0f;
        const float clamped = idMath::ClampFloat( 0.0f, 100.0f, adjusted );
        r_lodBias.SetFloat( LinearAdjust( clamped, 0.0f, 100.0f, -1.0f, 1.0f ) );
        break;
    }
    case SYSTEM_FIELD_BRIGHTNESS: {
        const float percent = LinearAdjust( r_lightScale.GetFloat(), 2.0f, 4.0f, 0.0f, 100.0f );
        const float adjusted = percent + (float)adjustAmount;
        const float clamped = idMath::ClampFloat( 0.0f, 100.0f, adjusted );
        r_lightScale.SetFloat( LinearAdjust( clamped, 0.0f, 100.0f, 2.0f, 4.0f ) );
        break;
    }
    case SYSTEM_FIELD_VOLUME: {
        const float percent = 100.0f * Square( 1.0f - ( s_volume_dB.GetFloat() / DB_SILENCE ) );
        const float adjusted = percent + (float)adjustAmount;
        const float clamped = idMath::ClampFloat( 0.0f, 100.0f, adjusted );
        s_volume_dB.SetFloat( DB_SILENCE - ( idMath::Sqrt( clamped / 100.0f ) * DB_SILENCE ) );
        break;
    }
    }
    cvarSystem->ClearModifiedFlags( CVAR_ARCHIVE );
}
Пример #3
0
BOOL CKirikiriApp::ApplyOption( COptionNode* pRootNode )
{
	BOOL bRetVal = FALSE;

	CString strCurOptionString = m_optionRoot.ChildrenToString();

	// 작용시켜보고
	if( AdjustOption(pRootNode) == FALSE || m_optionRoot.ParseChildren( pRootNode->ChildrenToString() ) == FALSE )
	{
		// 실패면 원상복구
		m_optionRoot.ParseChildren( strCurOptionString );
		AdjustOption(&m_optionRoot);
	}
	else
	{
		// 적용 성공이면
		CString strOptionString = m_optionRoot.ChildrenToString();
		wcscpy_s(m_wszOptionString, MAX_OPTION_LEN, (LPCTSTR)strOptionString);
		bRetVal = TRUE;
	}

	return bRetVal;
}
Пример #4
0
BOOL CATCodeMgr::ApplyOption( COptionNode* pRootNode )
{
	BOOL bRetVal = FALSE;
	
	CString strCurOptionString = m_optionRoot.ChildrenToString();

	// 새 옵션 루트에서 FORCEFONT가 없으면 FIXFONTSIZE, FONT 노드 제거
	if( pRootNode->GetChild(_T("FORCEFONT")) == NULL )
	{
		pRootNode->DeleteChild(_T("FIXFONTSIZE"));
		pRootNode->DeleteChild(_T("FONT"));
	}
	
	// 작용시켜보고
	if( AdjustOption(pRootNode) == FALSE || m_optionRoot.ParseChildren( pRootNode->ChildrenToString() ) == FALSE )
	{
		// 실패면 원상복구
		m_optionRoot.ParseChildren( strCurOptionString );
		AdjustOption(&m_optionRoot);
	}
	else
	{
		// 적용 성공이면
		CString strOptionString = m_optionRoot.ChildrenToString();

#ifdef UNICODE
		MyWideCharToMultiByte(949, 0, (LPCWSTR)strOptionString, -1, m_szOptionString, 4096, NULL, NULL);
#else
		strcpy(m_szOptionString, (LPCTSTR)strOptionString);
#endif

		bRetVal = TRUE;
	}

	return bRetVal;
}
Пример #5
0
BOOL CKirikiriApp::Init( HWND hAralWnd, LPWSTR wszPluginOption )
{
	Close();

	BOOL bRetVal = FALSE;

	// 부모 윈도우 핸들 저장
	if(NULL==hAralWnd) return FALSE;
	m_hContainerWnd = hAralWnd;

	// 컨테이너 함수 포인터 얻어오기
	m_hContainer = GetModuleHandle(_T("ATCTNR3.DLL"));
	if(m_hContainer && INVALID_HANDLE_VALUE != m_hContainer)
	{
		ZeroMemory(&m_sATCTNR3, sizeof(CONTAINER_PROC_ENTRY));
		m_sATCTNR3.procHookWin32Api			= (PROC_HookWin32Api) GetProcAddress(m_hContainer, "HookWin32Api");
		m_sATCTNR3.procUnhookWin32Api		= (PROC_UnhookWin32Api) GetProcAddress(m_hContainer, "UnhookWin32Api");
		m_sATCTNR3.procHookCodePoint		= (PROC_HookCodePoint) GetProcAddress(m_hContainer, "HookCodePoint");
		m_sATCTNR3.procUnhookCodePoint		= (PROC_UnhookCodePoint) GetProcAddress(m_hContainer, "UnhookCodePoint");
		m_sATCTNR3.procCreateTransCtx		= (PROC_CreateTransCtx) GetProcAddress(m_hContainer, "CreateTransCtx");
		m_sATCTNR3.procDeleteTransCtx		= (PROC_DeleteTransCtx) GetProcAddress(m_hContainer, "DeleteTransCtx");
		m_sATCTNR3.procTranslateUsingCtx	= (PROC_TranslateUsingCtx) GetProcAddress(m_hContainer, "TranslateUsingCtx");
		m_sATCTNR3.procIsAppLocaleLoaded	= (PROC_IsAppLocaleLoaded) GetProcAddress(m_hContainer, "IsAppLocaleLoaded");
		m_sATCTNR3.procSuspendAllThread		= (PROC_SuspendAllThread) GetProcAddress(m_hContainer, "SuspendAllThread");
		m_sATCTNR3.procResumeAllThread		= (PROC_ResumeAllThread) GetProcAddress(m_hContainer, "ResumeAllThread");
		m_sATCTNR3.procIsAllThreadSuspended = (PROC_IsAllThreadSuspended) GetProcAddress(m_hContainer, "IsAllThreadSuspended");

	}

	if( m_sATCTNR3.procHookWin32Api && m_sATCTNR3.procUnhookWin32Api
		&& m_sATCTNR3.procHookCodePoint && m_sATCTNR3.procUnhookCodePoint
		&& m_sATCTNR3.procCreateTransCtx && m_sATCTNR3.procDeleteTransCtx
		&& m_sATCTNR3.procTranslateUsingCtx && m_sATCTNR3.procIsAppLocaleLoaded
		&& m_sATCTNR3.procSuspendAllThread && m_sATCTNR3.procResumeAllThread
		&& m_sATCTNR3.procIsAllThreadSuspended)
	{
		// 어플로케일 관련 함수
		m_sTextFunc.pfnOrigMultiByteToWideChar =
			(PROC_MultiByteToWideChar) CRegistryMgr::RegReadDWORD(_T("HKEY_CURRENT_USER\\Software\\AralGood"), _T("M2WAddr"));

		m_sTextFunc.pfnOrigWideCharToMultiByte =
			(PROC_WideCharToMultiByte) CRegistryMgr::RegReadDWORD(_T("HKEY_CURRENT_USER\\Software\\AralGood"), _T("W2MAddr"));

		if( m_sTextFunc.pfnOrigMultiByteToWideChar && m_sTextFunc.pfnOrigWideCharToMultiByte )
		{
			
			// 스크립트 매니저
			if(m_ScriptMgr.Init() == TRUE)
			{
				// Create context
				if(m_sATCTNR3.procCreateTransCtx(L"KiriKiriContext") == TRUE)
				{
					// 기리기리 후킹
					bRetVal = HookKirikiri();
					if(FALSE == bRetVal)
					{
						MessageBox(hAralWnd, _T("기리기리 엔진 패턴을 찾을 수 없습니다."), _T("Aral Trans"), MB_OK);
					}

				}
			}

		}
	}

	if( bRetVal == TRUE )
	{

		// 옵션 먹이기
		m_wszOptionString = wszPluginOption;

		if(m_wszOptionString == NULL)
		{
			m_wszOptionString = new wchar_t[4096];
			ZeroMemory(m_wszOptionString, sizeof(wchar_t) * 4096);
		}

		CString strOptionString	= m_wszOptionString;		
		strOptionString = strOptionString.Trim();
		if(strOptionString.IsEmpty())
		{
			strOptionString = _T("CACHE(ZIP)");
		}

		if( m_optionRoot.ParseChildren(strOptionString) )
		{
			// 옵션 적용
			AdjustOption(&m_optionRoot);
		}
	}
	else
	{
		Close();
	}

	return bRetVal;
}
/*
========================
idMenuScreen_Shell_SystemOptions::idMenuDataSource_SystemSettings::AdjustField
========================
*/
void idMenuScreen_Shell_SystemOptions::idMenuDataSource_SystemSettings::AdjustField( const int fieldIndex, const int adjustAmount )
{
	switch( fieldIndex )
	{
		case SYSTEM_FIELD_FRAMERATE:
		{
			static const int numValues = 2;
			static const int values[numValues] = { 60, 120 };
			com_engineHz.SetInteger( AdjustOption( com_engineHz.GetInteger(), values, numValues, adjustAmount ) );
			break;
		}
		case SYSTEM_FIELD_VSYNC:
		{
			static const int numValues = 3;
			static const int values[numValues] = { 0, 1, 2 };
			r_swapInterval.SetInteger( AdjustOption( r_swapInterval.GetInteger(), values, numValues, adjustAmount ) );
			break;
		}
		case SYSTEM_FIELD_ANTIALIASING:
		{
			// RB: disabled 16x MSAA
			static const int numValues = 4;
			static const int values[numValues] = { 0, 2, 4, 8 };
			// RB end
			r_multiSamples.SetInteger( AdjustOption( r_multiSamples.GetInteger(), values, numValues, adjustAmount ) );
			break;
		}
		case SYSTEM_FIELD_MOTIONBLUR:
		{
			static const int numValues = 5;
			static const int values[numValues] = { 0, 2, 3, 4, 5 };
			r_motionBlur.SetInteger( AdjustOption( r_motionBlur.GetInteger(), values, numValues, adjustAmount ) );
			break;
		}
		// RB begin
		case SYSTEM_FIELD_SHADOWMAPPING:
		{
			static const int numValues = 2;
			static const int values[numValues] = { 0, 1 };
			r_useShadowMapping.SetInteger( AdjustOption( r_useShadowMapping.GetInteger(), values, numValues, adjustAmount ) );
			break;
		}
		/*case SYSTEM_FIELD_LODBIAS:
		{
			const float percent = LinearAdjust( r_lodBias.GetFloat(), -1.0f, 1.0f, 0.0f, 100.0f );
			const float adjusted = percent + ( float )adjustAmount * 5.0f;
			const float clamped = idMath::ClampFloat( 0.0f, 100.0f, adjusted );
			r_lodBias.SetFloat( LinearAdjust( clamped, 0.0f, 100.0f, -1.0f, 1.0f ) );
			break;
		}*/
		// RB end
		case SYSTEM_FIELD_BRIGHTNESS:
		{
			const float percent = LinearAdjust( r_lightScale.GetFloat(), 2.0f, 4.0f, 0.0f, 100.0f );
			const float adjusted = percent + ( float )adjustAmount;
			const float clamped = idMath::ClampFloat( 0.0f, 100.0f, adjusted );
			r_lightScale.SetFloat( LinearAdjust( clamped, 0.0f, 100.0f, 2.0f, 4.0f ) );
			break;
		}
		case SYSTEM_FIELD_VOLUME:
		{
			const float percent = 100.0f * Square( 1.0f - ( s_volume_dB.GetFloat() / DB_SILENCE ) );
			const float adjusted = percent + ( float )adjustAmount;
			const float clamped = idMath::ClampFloat( 0.0f, 100.0f, adjusted );
			s_volume_dB.SetFloat( DB_SILENCE - ( idMath::Sqrt( clamped / 100.0f ) * DB_SILENCE ) );
			break;
		}
	}
	cvarSystem->ClearModifiedFlags( CVAR_ARCHIVE );
}
Пример #7
0
BOOL CATCodeMgr::Init( HWND hAralWnd, LPWSTR wszPluginOption )
{
    Close();

    BOOL bRetVal = FALSE;

    // 부모 윈도우 핸들 저장
    if(NULL==hAralWnd) return FALSE;
    m_hContainerWnd = hAralWnd;

    // 컨테이너 함수 포인터 얻어오기
    m_hContainer = GetModuleHandle(_T("ATCTNR3.DLL"));
    if(m_hContainer && INVALID_HANDLE_VALUE != m_hContainer)
    {
        ZeroMemory(&m_sContainerFunc, sizeof(CONTAINER_PROC_ENTRY));
        m_sContainerFunc.procHookWin32Api		= (PROC_HookWin32Api) GetProcAddress(m_hContainer, "HookWin32Api");
        m_sContainerFunc.procUnhookWin32Api		= (PROC_UnhookWin32Api) GetProcAddress(m_hContainer, "UnhookWin32Api");
        m_sContainerFunc.procHookCodePoint		= (PROC_HookCodePoint) GetProcAddress(m_hContainer, "HookCodePoint");
        m_sContainerFunc.procUnhookCodePoint	= (PROC_UnhookCodePoint) GetProcAddress(m_hContainer, "UnhookCodePoint");
        m_sContainerFunc.procCreateTransCtx		= (PROC_CreateTransCtx) GetProcAddress(m_hContainer, "CreateTransCtx");
        m_sContainerFunc.procDeleteTransCtx		= (PROC_DeleteTransCtx) GetProcAddress(m_hContainer, "DeleteTransCtx");
        m_sContainerFunc.procTranslateUsingCtx	= (PROC_TranslateUsingCtx) GetProcAddress(m_hContainer, "TranslateUsingCtx");
        m_sContainerFunc.procIsAppLocaleLoaded	= (PROC_IsAppLocaleLoaded) GetProcAddress(m_hContainer, "IsAppLocaleLoaded");
        m_sContainerFunc.procSuspendAllThread	= (PROC_SuspendAllThread) GetProcAddress(m_hContainer, "SuspendAllThread");
        m_sContainerFunc.procResumeAllThread	= (PROC_ResumeAllThread) GetProcAddress(m_hContainer, "ResumeAllThread");
        m_sContainerFunc.procIsAllThreadSuspended = (PROC_IsAllThreadSuspended) GetProcAddress(m_hContainer, "IsAllThreadSuspended");
    }

    if( m_sContainerFunc.procHookWin32Api && m_sContainerFunc.procUnhookWin32Api
            && m_sContainerFunc.procHookCodePoint && m_sContainerFunc.procUnhookCodePoint
            && m_sContainerFunc.procCreateTransCtx && m_sContainerFunc.procDeleteTransCtx
            && m_sContainerFunc.procTranslateUsingCtx && m_sContainerFunc.procIsAppLocaleLoaded
            && m_sContainerFunc.procSuspendAllThread && m_sContainerFunc.procResumeAllThread
            && m_sContainerFunc.procIsAllThreadSuspended)
    {
        // 모든 쓰레드 정지
        m_sContainerFunc.procSuspendAllThread();

        // LoadLibrary 함수 후킹
        if( m_sContainerFunc.procHookWin32Api( L"kernel32.dll", L"LoadLibraryA", NewLoadLibraryA, 1 ) )
        {
            //m_pfnLoadLibraryA = (PROC_LoadLibrary) m_sContainerFunc.pfnGetOrigDllFunction("kernel32.dll", "LoadLibraryA");
        }

        if( m_sContainerFunc.procHookWin32Api( L"kernel32.dll", L"LoadLibraryW", NewLoadLibraryW, 1 ) )
        {
            //m_pfnLoadLibraryW = (PROC_LoadLibrary) m_sContainerFunc.pfnGetOrigDllFunction("kernel32.dll", "LoadLibraryW");
        }

        // 클립보드 관련
        m_bRunClipboardThread = TRUE;
        m_hClipTextChangeEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);
        m_hClipboardThread = (HANDLE)_beginthreadex(NULL, 0, ClipboardThreadFunc, NULL, 0, NULL);

        // 옵션 스트링 파싱
        m_wszOptionString = wszPluginOption;

        if(m_wszOptionString == NULL)
        {
            m_wszOptionString = new wchar_t[MAX_OPTION_LEN];
            ZeroMemory(m_wszOptionString, MAX_OPTION_LEN);
        }

#ifdef UNICODE
        CString strOptionString	= m_wszOptionString;
#else
        CString strOptionString;
        WideCharToMultiByte(CP_ACP, 0, m_wszOptionString, -1, strOptionString.GetBufferSetLength(MAX_OPTION_LEN), MAX_OPTION_LEN, NULL, NULL);
#endif

        if( m_optionRoot.ParseChildren(strOptionString) )
        {
            bRetVal = TRUE;
        }

        // 모든 쓰레드 재가동
        m_sContainerFunc.procResumeAllThread();

    }

    if( bRetVal == TRUE )
    {
        // 옵션 적용
        AdjustOption(&m_optionRoot);
    }
    else
    {
        Close();
    }

    return bRetVal;
}
Пример #8
0
BOOL CATCodeMgr::Init( HWND hSettingWnd, LPSTR cszOptionStringBuffer )
{
	Close();

	BOOL bRetVal = FALSE;

	// 부모 윈도우 핸들 저장
	if(NULL==hSettingWnd) return FALSE;
	m_hContainerWnd = hSettingWnd;

	// 컨테이너 함수 포인터 얻어오기
	m_hContainer = GetModuleHandle(_T("ATCTNR.DLL"));
	if(m_hContainer)
	{
		m_sContainerFunc.pfnGetCurAlgorithm		= (PROC_GetCurAlgorithm) GetProcAddress( m_hContainer, "GetCurAlgorithm" );
		m_sContainerFunc.pfnGetCurTranslator	= (PROC_GetCurTranslator) GetProcAddress( m_hContainer, "GetCurTranslator" );
		m_sContainerFunc.pfnHookDllFunction		= (PROC_HookDllFunction) GetProcAddress( m_hContainer, "HookDllFunction" );
		m_sContainerFunc.pfnGetOrigDllFunction	= (PROC_GetOrigDllFunction) GetProcAddress( m_hContainer, "GetOrigDllFunction" );
		m_sContainerFunc.pfnUnhookDllFunction	= (PROC_UnhookDllFunction) GetProcAddress( m_hContainer, "UnhookDllFunction" );
		m_sContainerFunc.pfnHookCodePoint		= (PROC_HookCodePoint) GetProcAddress( m_hContainer, "HookCodePoint" );
		m_sContainerFunc.pfnUnhookCodePoint		= (PROC_UnhookCodePoint) GetProcAddress( m_hContainer, "UnhookCodePoint" );
		m_sContainerFunc.pfnTranslateText		= (PROC_TranslateText) GetProcAddress( m_hContainer, "TranslateText" );
		m_sContainerFunc.pfnIsAppLocaleLoaded	= (PROC_IsAppLocaleLoaded) GetProcAddress( m_hContainer, "IsAppLocaleLoaded" );
		m_sContainerFunc.pfnEnableAppLocale		= (PROC_EnableAppLocale) GetProcAddress( m_hContainer, "EnableAppLocale" );
	}

	if( m_sContainerFunc.pfnGetCurAlgorithm && m_sContainerFunc.pfnGetCurTranslator
		&& m_sContainerFunc.pfnHookDllFunction && m_sContainerFunc.pfnGetOrigDllFunction
		&& m_sContainerFunc.pfnUnhookDllFunction && m_sContainerFunc.pfnHookCodePoint
		&& m_sContainerFunc.pfnUnhookCodePoint && m_sContainerFunc.pfnTranslateText
		&& m_sContainerFunc.pfnIsAppLocaleLoaded && m_sContainerFunc.pfnEnableAppLocale )
	{
		
		// LoadLibrary 함수 후킹	 
		if( m_sContainerFunc.pfnHookDllFunction( "kernel32.dll", "LoadLibraryA", NewLoadLibraryA ) )
		{
			m_pfnLoadLibraryA = (PROC_LoadLibrary) m_sContainerFunc.pfnGetOrigDllFunction("kernel32.dll", "LoadLibraryA");
		}

		if( m_sContainerFunc.pfnHookDllFunction( "kernel32.dll", "LoadLibraryW", NewLoadLibraryW ) )
		{
			m_pfnLoadLibraryW = (PROC_LoadLibrary) m_sContainerFunc.pfnGetOrigDllFunction("kernel32.dll", "LoadLibraryW");
		}

		// 폰트 함수군 후킹
		if( m_sContainerFunc.pfnHookDllFunction( "GDI32.dll", "CreateFontA", NewCreateFontA ) )
		{
			m_sFontFunc.pfnCreateFontA = (PROC_CreateFont) m_sContainerFunc.pfnGetOrigDllFunction("GDI32.dll", "CreateFontA");
		}

		if( m_sContainerFunc.pfnHookDllFunction( "GDI32.dll", "CreateFontW", NewCreateFontW ) )
		{
			m_sFontFunc.pfnCreateFontW = (PROC_CreateFont) m_sContainerFunc.pfnGetOrigDllFunction("GDI32.dll", "CreateFontW");
		}

		if( m_sContainerFunc.pfnHookDllFunction( "GDI32.dll", "CreateFontIndirectA", NewCreateFontIndirectA ) )
		{
			m_sFontFunc.pfnCreateFontIndirectA = (PROC_CreateFontIndirect) m_sContainerFunc.pfnGetOrigDllFunction("GDI32.dll", "CreateFontIndirectA");
		}

		if( m_sContainerFunc.pfnHookDllFunction( "GDI32.dll", "CreateFontIndirectW", NewCreateFontIndirectW ) )
		{
			m_sFontFunc.pfnCreateFontIndirectW = (PROC_CreateFontIndirect) m_sContainerFunc.pfnGetOrigDllFunction("GDI32.dll", "CreateFontIndirectW");
		}


		// 텍스트 함수군 후킹

		// GetGlyphOutlineA
		if( m_sContainerFunc.pfnHookDllFunction( "GDI32.DLL", "GetGlyphOutlineA", NewGetGlyphOutlineA ) )
		{
			m_sTextFunc.pfnGetGlyphOutlineA = 
				(PROC_GetGlyphOutline) m_sContainerFunc.pfnGetOrigDllFunction("GDI32.DLL", "GetGlyphOutlineA");
		}

		// GetGlyphOutlineW
		if( m_sContainerFunc.pfnHookDllFunction( "GDI32.DLL", "GetGlyphOutlineW", NewGetGlyphOutlineW ) )
		{
			m_sTextFunc.pfnGetGlyphOutlineW = 
				(PROC_GetGlyphOutline) m_sContainerFunc.pfnGetOrigDllFunction("GDI32.DLL", "GetGlyphOutlineW");
		}

		// TextOutA
		if( m_sContainerFunc.pfnHookDllFunction( "GDI32.DLL", "TextOutA", NewTextOutA ) )
		{
			m_sTextFunc.pfnTextOutA = 
				(PROC_TextOut) m_sContainerFunc.pfnGetOrigDllFunction("GDI32.DLL", "TextOutA");
		}

		// TextOutW
		if( m_sContainerFunc.pfnHookDllFunction( "GDI32.DLL", "TextOutW", NewTextOutW ) )
		{
			m_sTextFunc.pfnTextOutW = 
				(PROC_TextOut) m_sContainerFunc.pfnGetOrigDllFunction("GDI32.DLL", "TextOutW");
		}

		// ExtTextOutA
		if( m_sContainerFunc.pfnHookDllFunction( "GDI32.DLL", "ExtTextOutA", NewExtTextOutA ) )
		{
			m_sTextFunc.pfnExtTextOutA = 
				(PROC_ExtTextOut) m_sContainerFunc.pfnGetOrigDllFunction("GDI32.DLL", "ExtTextOutA");
		}

		// ExtTextOutW
		if( m_sContainerFunc.pfnHookDllFunction( "GDI32.DLL", "ExtTextOutW", NewExtTextOutW ) )
		{
			m_sTextFunc.pfnExtTextOutW = 
				(PROC_ExtTextOut) m_sContainerFunc.pfnGetOrigDllFunction("GDI32.DLL", "ExtTextOutW");
		}

		// DrawTextA
		if( m_sContainerFunc.pfnHookDllFunction( "USER32.DLL", "DrawTextA", NewDrawTextA ) )
		{
			m_sTextFunc.pfnDrawTextA = 
				(PROC_DrawText) m_sContainerFunc.pfnGetOrigDllFunction("USER32.DLL", "DrawTextA");
		}

		// DrawTextW
		if( m_sContainerFunc.pfnHookDllFunction( "USER32.DLL", "DrawTextW", NewDrawTextW ) )
		{
			m_sTextFunc.pfnDrawTextW = 
				(PROC_DrawText) m_sContainerFunc.pfnGetOrigDllFunction("USER32.DLL", "DrawTextW");
		}

		// DrawTextExA
		if( m_sContainerFunc.pfnHookDllFunction( "USER32.DLL", "DrawTextExA", NewDrawTextExA ) )
		{
			m_sTextFunc.pfnDrawTextExA = 
				(PROC_DrawTextEx) m_sContainerFunc.pfnGetOrigDllFunction("USER32.DLL", "DrawTextExA");
		}

		// DrawTextExW
		if( m_sContainerFunc.pfnHookDllFunction( "USER32.DLL", "DrawTextExW", NewDrawTextExW ) )
		{
			m_sTextFunc.pfnDrawTextExW = 
				(PROC_DrawTextEx) m_sContainerFunc.pfnGetOrigDllFunction("USER32.DLL", "DrawTextExW");
		}

		// 어플로케일 관련 함수
		m_sTextFunc.pfnOrigMultiByteToWideChar =
			(PROC_MultiByteToWideChar) CRegistryMgr::RegReadDWORD(_T("HKEY_CURRENT_USER\\Software\\AralGood"), _T("M2WAddr"));

		m_sTextFunc.pfnOrigWideCharToMultiByte =
			(PROC_WideCharToMultiByte) CRegistryMgr::RegReadDWORD(_T("HKEY_CURRENT_USER\\Software\\AralGood"), _T("W2MAddr"));

		if( m_sTextFunc.pfnExtTextOutA && m_sTextFunc.pfnExtTextOutW
			&& m_sTextFunc.pfnGetGlyphOutlineA && m_sTextFunc.pfnGetGlyphOutlineW
			&& m_sTextFunc.pfnOrigMultiByteToWideChar && m_sTextFunc.pfnOrigWideCharToMultiByte
			&& m_sTextFunc.pfnTextOutA && m_sTextFunc.pfnTextOutW 
			&& m_sTextFunc.pfnDrawTextA	&& m_sTextFunc.pfnDrawTextW
			&& m_sTextFunc.pfnDrawTextExA && m_sTextFunc.pfnDrawTextExW
			
			&& m_pfnLoadLibraryA && m_pfnLoadLibraryW
			
			&& m_sFontFunc.pfnCreateFontA && m_sFontFunc.pfnCreateFontW
			&& m_sFontFunc.pfnCreateFontIndirectA && m_sFontFunc.pfnCreateFontIndirectW )
		{
			// 클립보드 관련
			m_bRunClipboardThread = TRUE;
			m_hClipTextChangeEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);
			m_hClipboardThread = (HANDLE)_beginthreadex(NULL, 0, ClipboardThreadFunc, NULL, 0, NULL);

			// 옵션 스트링 파싱
			m_szOptionString = cszOptionStringBuffer;

			if(m_szOptionString == NULL)
			{
				m_szOptionString = new char[4096];
				ZeroMemory(m_szOptionString, 4096);
			}

			if( m_szOptionString[0] == _T('\0') )
			{
				//strcpy(m_szOptionString, "FORCEFONT,ENCODEKOR,FONT(궁서,-24)");
			}

			//if( m_optionRoot.ParseChildren("FORCEFONT, HOOK( 0x00410320, TRANS([ESP+0x4],ANSI), TRANS([ESP+0xC],ANSI) ), ENCODEKOR") )

#ifdef UNICODE
			wchar_t wszTmpString[4096];
			MyMultiByteToWideChar(949, 0, m_szOptionString, -1, wszTmpString, 4096);
			CString strOptionString = wszTmpString;
#else
			CString strOptionString	= m_szOptionString;		
#endif

			if( m_optionRoot.ParseChildren(strOptionString) )
			{
				// 옵션 적용
				AdjustOption(&m_optionRoot);

				bRetVal = TRUE;
			}
			
		}
	}

	if( FALSE == bRetVal ) Close();

	return bRetVal;
}