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 ); }
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; }
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; }
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 ); }
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; }
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; }