diff --git a/gui/ITHVNR.rc b/gui/ITHVNR.rc
index 3f66f64..7cc7e84 100644
--- a/gui/ITHVNR.rc
+++ b/gui/ITHVNR.rc
@@ -19,14 +19,14 @@ STYLE DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYS
CAPTION "Process Explorer"
FONT 8, "MS Shell Dlg", 400, 0, 1
{
- DEFPUSHBUTTON "È®ÀÎ", IDOK, 281, 189, 53, 14, 0, WS_EX_LEFT
- PUSHBUTTON "ÇÁ·ÎÇÊ Á¦°Å", IDC_BUTTON6, 226, 189, 53, 14, 0, WS_EX_LEFT
- CONTROL "", IDC_LIST1, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_SHOWSELALWAYS | LVS_SINGLESEL | LVS_REPORT, 7, 20, 327, 164, WS_EX_LEFT
- LTEXT "ÇÁ·Î¼¼½º", IDC_STATIC, 7, 7, 65, 13, SS_LEFT | SS_CENTERIMAGE, WS_EX_LEFT
- PUSHBUTTON "ºÎÂø", IDC_BUTTON2, 61, 189, 53, 14, 0, WS_EX_LEFT
- PUSHBUTTON "Å»Âø", IDC_BUTTON3, 116, 189, 53, 14, 0, WS_EX_LEFT
- PUSHBUTTON "ÇÁ·ÎÇÊ Ãß°¡", IDC_BUTTON5, 171, 189, 53, 14, 0, WS_EX_LEFT
- PUSHBUTTON "»õ·Î°íħ", IDC_BUTTON1, 7, 189, 53, 14, 0, WS_EX_LEFT
+ DEFPUSHBUTTON "OK", IDOK, 281, 189, 53, 14, 0, WS_EX_LEFT
+ PUSHBUTTON "Remove Profile", IDC_BUTTON6, 226, 189, 53, 14, 0, WS_EX_LEFT
+ CONTROL "", IDC_LIST1, WC_LISTVIEW, WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_SHOWSELALWAYS | LVS_SINGLESEL | LVS_REPORT, 7, 20, 327, 164, WS_EX_LEFT
+ LTEXT "Process", IDC_STATIC, 7, 7, 65, 13, SS_LEFT | SS_CENTERIMAGE, WS_EX_LEFT
+ PUSHBUTTON "Attach", IDC_BUTTON2, 61, 189, 53, 14, 0, WS_EX_LEFT
+ PUSHBUTTON "Detach", IDC_BUTTON3, 116, 189, 53, 14, 0, WS_EX_LEFT
+ PUSHBUTTON "Add Profile", IDC_BUTTON5, 171, 189, 53, 14, 0, WS_EX_LEFT
+ PUSHBUTTON "Refresh", IDC_BUTTON1, 7, 189, 53, 14, 0, WS_EX_LEFT
}
@@ -37,22 +37,22 @@ STYLE DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYS
CAPTION "Option"
FONT 8, "MS Shell Dlg", 400, 0, 1
{
- DEFPUSHBUTTON "È®ÀÎ", IDOK, 8, 164, 50, 14, 0, WS_EX_LEFT
- PUSHBUTTON "Ãë¼Ò", IDCANCEL, 65, 164, 50, 14, 0, WS_EX_LEFT
- EDITTEXT IDC_EDIT1, 60, 7, 55, 14, ES_AUTOHSCROLL, WS_EX_LEFT
- LTEXT "¹®´Ü³ª´©±â", IDC_STATIC, 7, 7, 47, 13, SS_LEFT | SS_CENTERIMAGE, WS_EX_LEFT
- EDITTEXT IDC_EDIT2, 60, 25, 55, 14, ES_AUTOHSCROLL, WS_EX_LEFT
- LTEXT "ÇÁ·Î¼¼½º ´ë±â", IDC_STATIC, 7, 26, 47, 13, SS_LEFT | SS_CENTERIMAGE, WS_EX_LEFT
- EDITTEXT IDC_EDIT3, 60, 45, 55, 14, ES_AUTOHSCROLL, WS_EX_LEFT
- LTEXT "ÀÎÁ§¼Ç ´ë±â", IDC_STATIC, 7, 45, 47, 13, SS_LEFT | SS_CENTERIMAGE, WS_EX_LEFT
- EDITTEXT IDC_EDIT4, 60, 65, 55, 14, ES_AUTOHSCROLL, WS_EX_LEFT
- LTEXT "»ðÀÔ ´ë±â", IDC_STATIC, 7, 65, 47, 13, SS_LEFT | SS_CENTERIMAGE, WS_EX_LEFT
- AUTOCHECKBOX "ÀÚµ¿ ºÎÂø", IDC_CHECK1, 7, 87, 54, 10, 0, WS_EX_LEFT
- AUTOCHECKBOX "ÀÚµ¿ »ðÀÔ", IDC_CHECK2, 62, 87, 50, 10, 0, WS_EX_LEFT
- AUTOCHECKBOX "Ŭ¸³º¸µå·Î ÀÚµ¿ º¹»ç", IDC_CHECK3, 7, 103, 88, 10, 0, WS_EX_LEFT
- AUTOCHECKBOX "ÀÚµ¿ ¹Ýº¹¹® Á¦°Å", IDC_CHECK4, 7, 119, 95, 10, 0, WS_EX_LEFT
- AUTOCHECKBOX "¹®ÀÚÇÊÅÍ ÃʱâÈ", IDC_CHECK6, 7, 149, 81, 8, 0, WS_EX_LEFT
- AUTOCHECKBOX "±Û·Î¹ú ÇÊÅÍ È°¼ºÈ", IDC_CHECK5, 7, 134, 75, 10, 0, WS_EX_LEFT
+ DEFPUSHBUTTON "OK", IDOK, 8, 164, 50, 14, 0, WS_EX_LEFT
+ PUSHBUTTON "Cancel", IDCANCEL, 65, 164, 50, 14, 0, WS_EX_LEFT
+ EDITTEXT IDC_EDIT1, 60, 7, 55, 14, ES_AUTOHSCROLL, WS_EX_LEFT
+ LTEXT "Split time", IDC_STATIC, 7, 7, 47, 13, SS_LEFT | SS_CENTERIMAGE, WS_EX_LEFT
+ EDITTEXT IDC_EDIT2, 60, 25, 55, 14, ES_AUTOHSCROLL, WS_EX_LEFT
+ LTEXT "Process delay", IDC_STATIC, 7, 26, 47, 13, SS_LEFT | SS_CENTERIMAGE, WS_EX_LEFT
+ EDITTEXT IDC_EDIT3, 60, 45, 55, 14, ES_AUTOHSCROLL, WS_EX_LEFT
+ LTEXT "Inject delay", IDC_STATIC, 7, 45, 47, 13, SS_LEFT | SS_CENTERIMAGE, WS_EX_LEFT
+ EDITTEXT IDC_EDIT4, 60, 65, 55, 14, ES_AUTOHSCROLL, WS_EX_LEFT
+ LTEXT "Insert delay", IDC_STATIC, 7, 65, 47, 13, SS_LEFT | SS_CENTERIMAGE, WS_EX_LEFT
+ AUTOCHECKBOX "Auto attach", IDC_CHECK1, 7, 87, 54, 10, 0, WS_EX_LEFT
+ AUTOCHECKBOX "Auto insert", IDC_CHECK2, 62, 87, 50, 10, 0, WS_EX_LEFT
+ AUTOCHECKBOX "Auto copy to clipboard", IDC_CHECK3, 7, 103, 88, 10, 0, WS_EX_LEFT
+ AUTOCHECKBOX "Auto suppress repetition", IDC_CHECK4, 7, 119, 95, 10, 0, WS_EX_LEFT
+ AUTOCHECKBOX "Reset character filter", IDC_CHECK6, 7, 149, 81, 8, 0, WS_EX_LEFT
+ AUTOCHECKBOX "Enable global filter", IDC_CHECK5, 7, 134, 75, 10, 0, WS_EX_LEFT
}
diff --git a/gui/command.cpp b/gui/command.cpp
index 79d5fb4..bfd8220 100644
--- a/gui/command.cpp
+++ b/gui/command.cpp
@@ -50,24 +50,24 @@ DWORD ProcessCommand(const std::wstring& cmd, DWORD pid)
if (Parse(m[1].str(), hp))
Host_InsertHook(pid, &hp);
}
- else if (regex_match(cmd, m, wregex(L"(?::|)(?:¤·|¿¬|l|)([[:xdigit:]]+)(?:-| )([[:xdigit:]]+)", wregex::icase)))
+ else if (regex_match(cmd, m, wregex(L":l([[:xdigit:]]+)-([[:xdigit:]]+)", wregex::icase)))
{
DWORD from = std::stoul(m[1].str(), NULL, 16);
DWORD to = std::stoul(m[2].str(), NULL, 16);
Host_AddLink(from, to);
}
- else if (regex_match(cmd, m, wregex(L"(?::|)(?:¤¾|ÇØ|ÇØÁ¦|u)([[:xdigit:]]+)", wregex::icase)))
+ else if (regex_match(cmd, m, wregex(L":u([[:xdigit:]]+)", wregex::icase)))
{
DWORD from = std::stoul(m[1].str(), NULL, 16);
Host_UnLink(from);
}
- else if (regex_match(cmd, m, wregex(L"(?::|)(?:¤§|µµ|µµ¿ò|µµ¿ò¸»|h|help)", wregex::icase)))
+ else if (regex_match(cmd, m, wregex(L":(?:h|help)", wregex::icase)))
{
ConsoleOutput(Usage);
}
else
{
- ConsoleOutput(L"¾Ë ¼ö ¾ø´Â ¸í·É¾î. µµ¿ò¸»À» º¸½Ã·Á¸é, :h ³ª :help¸¦ ÀÔ·ÂÇϼ¼¿ä.");
+ ConsoleOutput(L"Unknown command. Type :h or :help for help.");
}
return 0;
}
diff --git a/gui/language.cpp b/gui/language.cpp
index ee33716..6149eb9 100644
--- a/gui/language.cpp
+++ b/gui/language.cpp
@@ -14,44 +14,44 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
-const wchar_t* Warning = L"°æ°í!";
+const wchar_t* Warning=L"Warning!";
//command.cpp
-const wchar_t* ErrorSyntax = L"¸í·É¾î ¿À·ù";
-const wchar_t* Usage = L"¸í·É¾î:\r\n\
+const wchar_t* ErrorSyntax=L"Syntax error";
+const wchar_t* Usage = L"Syntax:\r\n\
\r\n\
-µµ¿ò¸» //µµ¿ò¸»À» Ãâ·ÂÇÕ´Ï´Ù\r\n\
-Ãâ¹ß µµÂø // 'Ãâ¹ß'½º·¹µå¿¡¼ 'µµÂø'½º·¹µå·Î ¿¬°áÇÕ´Ï´Ù\r\n\
-¤¾Ãâ¹ß // 'Ãâ¹ß'½º·¹µå¿¡ ¿¬°áµÈ ¸µÅ©¸¦ ÇØÁ¦ÇÕ´Ï´Ù\r\n\
+:H[ELP] - print help\r\n\
+:Lfrom-to - link from thread 'from' to thread 'to'\r\n\
+:Ufrom - unlink link from thread 'from'\r\n\
\r\n\
-'Ãâ¹ß'°ú 'µµÂø'¿¡´Â 16Áø¹ý(Çí»çÄÚµå) ½º·¹µå¹øÈ£¸¦ ÀÔ·ÂÇÕ´Ï´Ù. ½º·¹µå ¹øÈ£´Â ¸Ç ¾Õ¿¡ Àִ ù ¹ø° ¼ýÀÚ¿ÀÔ´Ï´Ù.\r\n\
+'from' and 'to' and hexadecimal thread numbers. The thread number is the first number in the combo box.\r\n\
\r\n\
-·Î´õ ¿É¼Ç:\r\n\
-/P[{process_id|Nprocess_name}] //ÇÁ·Î¼¼½º¿¡ ºÎÂø\r\n\
+Loader options:\r\n\
+/P[{process_id|Nprocess_name}] - attach to process\r\n\
\r\n\
-HÄÚµå ÈÄÅ· ¿É¼Ç:\r\n\
+Hook options:\r\n\
/H[X]{A|B|W|S|Q}[N][data_offset[*drdo]][:sub_offset[*drso]]@addr[:module[:{name|#ordinal}]]\r\n\
\r\n\
-(¼¼ö¸¦ Á¦¿ÜÇÑ) /HÄÚµåÀÇ ¸ðµç ¼ýÀÚ´Â ¾Æ¹«°Íµµ 󸮵ÇÁö ¾ÊÀº 16Áø¹ý(Çí»çÄÚµå)ÀÔ´Ï´Ù";
+All numbers in /H (except ordinal) are hexadecimal without any prefixes";
const wchar_t* ExtendedUsage = L"/H[X]{A|B|W|S|Q}[N][data_offset[*drdo]][:sub_offset[*drso]]@addr[:[module[:{name|#ordinal}]]]\r\n\
\r\n\
-Ãß°¡ »ç¿ëÀÚÁ¤ÀÇ ÈÄÅ·¼³Á¤\r\n\
+Set additional custom hook\r\n\
\r\n\
-ÈÄÅ· Á¾·ù :\r\n\
-A - DBCS ¹®ÀÚ\r\n\
-B - DBCS ¹®ÀÚ(big-endian)\r\n\
-W - UCS2 ¹®ÀÚ\r\n\
-S - MBCS ¹®ÀÚ¿\r\n\
-Q - UTF-16 ¹®ÀÚ¿\r\n\
+Hook types :\r\n\
+A - DBCS char\r\n\
+B - DBCS char(big-endian)\r\n\
+W - UCS2 char\r\n\
+S - MBCS string\r\n\
+Q - UTF-16 string\r\n\
\r\n\
-¸Å°³º¯¼ö:\r\n\
-X - Çϵå¿þ¾î ±¸È¹Á¡ »ç¿ë\r\n\
-N - ¹®¹ýÀ» »ç¿ëÇÏÁö ¾ÊÀ½\r\n\
+Parameters:\r\n\
+X - use hardware breakpoints\r\n\
+N - don't use contexts\r\n\
data_offset - stack offset to char / string pointer\r\n\
drdo - add a level of indirection to data_offset\r\n\
sub_offset - stack offset to subcontext\r\n\
drso - add a level of indirection to sub_offset\r\n\
-addr - ÈÄÅ·ÇÒ ÁÖ¼Ò\r\n\
+addr - address of the hook\r\n\
module - name of the module to use as base for 'addr'\r\n\
name - name of the 'module' export to use as base for 'addr'\r\n\
ordinal - number of the 'module' export ordinal to use as base for 'addr'\r\n\
@@ -64,70 +64,69 @@ Negative values of 'data_offset' and 'sub_offset' refer to registers: \r\n\
All numbers except ordinal are hexadecimal without any prefixes";
//inject.cpp
-const wchar_t* ErrorRemoteThread = L"¿ø°Ý ½º·¹µå¸¦ »ý¼ºÇÒ ¼ö ¾øÀ½.";
-const wchar_t* ErrorOpenProcess = L"ÇÁ·Î¼¼½º¸¦ ¿ ¼ö ¾øÀ½.";
-const wchar_t* ErrorNoProcess = L"ÇÁ·Î¼¼½º¸¦ ãÀ» ¼ö ¾øÀ½";
-const wchar_t* SelfAttach = L"ITH.exe¿¡ ºÎÂøÇÏÁö ¸»¾Æ ÁÖ¼¼¿ä";
-const wchar_t* AlreadyAttach = L"ÇÁ·Î¼¼½º°¡ ÀÌ¹Ì ºÎÂøµÊ.";
-const wchar_t* FormatInject = L"ÇÁ·Î¼¼½º %d¿¡ ÀÎÁ§¼Ç. ¸ðµâ ±â¹Ý %.8X";
+const wchar_t* ErrorRemoteThread=L"Can't create remote thread.";
+const wchar_t* ErrorOpenProcess=L"Can't open process.";
+const wchar_t* ErrorNoProcess=L"Process not found";
+const wchar_t* SelfAttach=L"Please do not attach to ITH.exe";
+const wchar_t* AlreadyAttach=L"Process already attached.";
+const wchar_t* FormatInject=L"Inject process %d. Module base %.8X";
//main.cpp
-const wchar_t* NotAdmin = L"SeDebugPrevilegeÀ» È°¼ºÈ ÇÒ ¼ö ¾ø½À´Ï´Ù. ITH°¡ Á¦´ë·Î ÀÛµ¿ÇÏÁö ¸øÇÕ´Ï´Ù.\r\n\
-°ü¸®ÀÚ °èÁ¤À¸·Î ½ÇÇàÇϽðųª UAC¸¦ ²ô½Ã°í ITH¸¦ ½ÇÇàÇØ ÁÖ¼¼¿ä.";
+const wchar_t* NotAdmin=L"Can't enable SeDebugPrevilege. ITH might malfunction.\r\n\
+Please run ITH as administrator or turn off UAC.";
//pipe.cpp
-const wchar_t* ErrorCreatePipe = L"ÅؽºÆ® ÆÄÀÌÇÁ¸¦ »ý¼ºÇÒ ¼ö ¾ø°Å³ª, ¿äûÀÌ ³Ê¹« ¸¹½À´Ï´Ù.";
-const wchar_t* FormatDetach = L"ÇÁ·Î¼¼½º %d°¡ Å»ÂøµÊ.";
-const wchar_t* ErrorCmdQueueFull = L"¸í·É¾î ´ë±â¿ÀÌ °¡µæÂü.";
-const wchar_t* ErrorNoAttach = L"ÇÁ·Î¼¼½º°¡ ºÎÂøµÇÁö ¾ÊÀ½.";
+const wchar_t* ErrorCreatePipe=L"Can't create text pipe or too many instance.";
+const wchar_t* FormatDetach=L"Process %d detached.";
+const wchar_t* ErrorCmdQueueFull=L"Command queue full.";
+const wchar_t* ErrorNoAttach=L"No process attached.";
//profile.cpp
-const wchar_t* ErrorMonitor = L"ÇÁ·Î¼¼½º¸¦ °¨½ÃÇÒ ¼ö ¾øÀ½.";
+const wchar_t* ErrorMonitor=L"Can't monitor process.";
//utility.cpp
-const wchar_t* InitMessage = L"Copyright (C) 2010-2012 kaosu \r\n\
+const wchar_t* InitMessage=L"Copyright (C) 2010-2012 kaosu \r\n\
Copyright (C) 2015 zorkzero \r\n\
-¼Ò½ºÄÚµå \r\n\
-ÀϹÝÅä·Ð \r\n\
-ÇѱÛÈ @mireado";
-const wchar_t* BackgroundMsg = L"µµ¿ò¸»À» º¸½Ã·Á¸é, \"help\", \"µµ¿ò¸»\"À̳ª \"µµ¿ò\"À» ÀÔ·ÂÇϼ¼¿ä.";
-const wchar_t* ErrorLinkExist = L"¿¬°áÀÌ Á¸ÀçÇÔ.";
-const wchar_t* ErrorCylicLink = L"¿¬°á½ÇÆÐ. ¼øȯ¿¬°áÀº Çã¿ëµÇÁö ¾Ê½À´Ï´Ù.";
-const wchar_t* FormatLink = L"Ãâ¹ß½º·¹µå%.4x¿¡¼ µµÂø½º·¹µå%.4x·Î ¿¬°á.";
-const wchar_t* ErrorLink = L"¿¬°á½ÇÆÐ. Ãâ¹ß/µµÂø ½º·¹µå¸¦ ãÀ» ¼ö ¾øÀ½.";
-const wchar_t* ErrorDeleteCombo = L"±Û»óÀÚ¿¡¼ Áö¿ì±â ½ÇÆÐ.";
+Source code \r\n\
+General discussion ";
+const wchar_t* BackgroundMsg=L"Type \":h\" or \":help\" for help.";
+const wchar_t* ErrorLinkExist=L"Link exist.";
+const wchar_t* ErrorCylicLink=L"Link failed. No cyclic link allowed.";
+const wchar_t* FormatLink=L"Link from thread%.4x to thread%.4x.";
+const wchar_t* ErrorLink=L"Link failed. Source or/and destination thread not found.";
+const wchar_t* ErrorDeleteCombo=L"Error delete from combo.";
//window.cpp
-const wchar_t* ClassName = L"ITH";
-const wchar_t* ClassNameAdmin = L"ITH (°ü¸®ÀÚ)";
-const wchar_t* ErrorNotSplit = L"¸ÕÀú ¹®´Ü ³ª´©±â¸¦ È°¼ºÈÇØÁÖ¼¼¿ä!";
-const wchar_t* ErrorNotModule = L"¸ÕÀú ¸ðµâÀ» È°¼ºÈÇØÁÖ¼¼¿ä!";
+const wchar_t* ClassName=L"ITH";
+const wchar_t* ClassNameAdmin=L"ITH (Administrator)";
+const wchar_t* ErrorNotSplit=L"Need to enable split first!";
+const wchar_t* ErrorNotModule=L"Need to enable module first!";
//Main window buttons
-const wchar_t* ButtonTitleProcess = L"ÇÁ·Î¼¼½º";
-const wchar_t* ButtonTitleThread = L"½º·¹µå";
-const wchar_t* ButtonTitleHook = L"ÈÄÅ·";
-const wchar_t* ButtonTitleProfile = L"ÇÁ·ÎÇÊ";
-const wchar_t* ButtonTitleOption = L"¿É¼Ç";
-const wchar_t* ButtonTitleClear = L"Áö¿ì±â";
-const wchar_t* ButtonTitleSave = L"ÀúÀå";
-const wchar_t* ButtonTitleTop = L"Ç×»óÀ§";
+const wchar_t* ButtonTitleProcess=L"Process";
+const wchar_t* ButtonTitleThread=L"Thread";
+const wchar_t* ButtonTitleHook=L"Hook";
+const wchar_t* ButtonTitleProfile=L"Profile";
+const wchar_t* ButtonTitleOption=L"Option";
+const wchar_t* ButtonTitleClear=L"Clear";
+const wchar_t* ButtonTitleSave=L"Save";
+const wchar_t* ButtonTitleTop=L"Top";
//Hook window
-const wchar_t* SpecialHook = L"HÄÚµå ÈÄÅ·, AGTH ÄÚµå´Â Áö¿øÇÏÁö ¾Ê½À´Ï´Ù.";
+const wchar_t* SpecialHook=L"Special hook, no AGTH equivalent.";
//Process window
-const wchar_t* TabTitlePID = L"PID";
-const wchar_t* TabTitleMemory = L"¸Þ¸ð¸®";
-const wchar_t* TabTitleName = L"À̸§";
-const wchar_t* TabTitleTID = L"TID";
-const wchar_t* TabTitleStart = L"½ÃÀÛ";
-const wchar_t* TabTitleModule = L"¸ðµâ";
-const wchar_t* TabTitleState = L"»óÅÂ";
-const wchar_t* SuccessAttach = L"ÇÁ·Î¼¼½º¿¡ ITH ºÎÂø¼º°ø.";
-const wchar_t* FailAttach = L"ÇÁ·Î¼¼½º¿¡ ITH ºÎÂø½ÇÆÐ.";
-const wchar_t* SuccessDetach = L"ÇÁ·Î¼¼½º¿¡¼ ITH Å»Âø¼º°ø.";
-const wchar_t* FailDetach = L"ITH Å»Âø½ÇÆÐ.";
+const wchar_t* TabTitlePID=L"PID";
+const wchar_t* TabTitleMemory=L"Memory";
+const wchar_t* TabTitleName=L"Name";
+const wchar_t* TabTitleTID=L"TID";
+const wchar_t* TabTitleStart=L"Start";
+const wchar_t* TabTitleModule=L"Module";
+const wchar_t* TabTitleState=L"State";
+const wchar_t* SuccessAttach=L"Attach ITH to process successfully.";
+const wchar_t* FailAttach=L"Failed to attach ITH to process.";
+const wchar_t* SuccessDetach=L"ITH detach from process.";
+const wchar_t* FailDetach=L"Detach failed.";
//Profile window
-const wchar_t* ProfileExist = L"ÇÁ·ÎÇÊÀÌ ÀÌ¹Ì Á¸ÀçÇÔ.";
-const wchar_t* SuccessAddProfile = L"ÇÁ·ÎÇÊ Ãß°¡µÊ.";
-const wchar_t* FailAddProfile = L"ÇÁ·ÎÇÊ Ãß°¡½ÇÆÐ";
-const wchar_t* TabTitleNumber = L"No.";
-const wchar_t* NoFile = L"ÆÄÀÏÀ» ãÀ» ¼ö ¾øÀ½.";
-const wchar_t* PathDismatch = L"ÇÁ·Î¼¼½º À̸§ÀÌ ÀÏÄ¡ÇÏÁö ¾Ê½À´Ï´Ù, °è¼ÓÇϽðڽÀ´Ï±î?";
-const wchar_t* SuccessImportProfile = L"ÇÁ·ÎÇÊ °¡Á®¿À±â ¼º°ø";
+const wchar_t* ProfileExist=L"Profile already exists.";
+const wchar_t* SuccessAddProfile=L"Profile added.";
+const wchar_t* FailAddProfile=L"Fail to add profile";
+const wchar_t* TabTitleNumber=L"No.";
+const wchar_t* NoFile=L"Can't find file.";
+const wchar_t* PathDismatch=L"Process name dismatch, continue?";
+const wchar_t* SuccessImportProfile=L"Import profile success";
//const wchar_t* SuccessAddProfile=L"Profile added.";
\ No newline at end of file
diff --git a/gui/window.cpp b/gui/window.cpp
index df24e62..0f3a862 100644
--- a/gui/window.cpp
+++ b/gui/window.cpp
@@ -280,19 +280,19 @@ LRESULT CALLBACK EditCmdProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lPar
void CreateButtons(HWND hWnd)
{
- hwndProcess = CreateWindow(L"Button", L"ÇÁ·Î¼¼½º", WS_CHILD | WS_VISIBLE,
+ hwndProcess = CreateWindow(L"Button", L"Process", WS_CHILD | WS_VISIBLE,
0, 0, 0, 0, hWnd, 0, hIns, NULL);
- hwndOption = CreateWindow(L"Button", L"¿É¼Ç", WS_CHILD | WS_VISIBLE,
+ hwndOption = CreateWindow(L"Button", L"Option", WS_CHILD | WS_VISIBLE,
0, 0, 0, 0, hWnd, 0, hIns, NULL);
- hwndClear = CreateWindow(L"Button", L"Áö¿ì±â", WS_CHILD | WS_VISIBLE,
+ hwndClear = CreateWindow(L"Button", L"Clear", WS_CHILD | WS_VISIBLE,
0, 0, 0, 0, hWnd, 0, hIns, NULL);
- hwndSave = CreateWindow(L"Button", L"ÀúÀå", WS_CHILD | WS_VISIBLE,
+ hwndSave = CreateWindow(L"Button", L"Save", WS_CHILD | WS_VISIBLE,
0, 0, 0, 0, hWnd, 0, hIns, NULL);
- hwndRemoveLink = CreateWindow(L"Button", L"¸µÅ©ÇØÁ¦", WS_CHILD | WS_VISIBLE,
+ hwndRemoveLink = CreateWindow(L"Button", L"Unlink", WS_CHILD | WS_VISIBLE,
0, 0, 0, 0, hWnd, 0, hIns, NULL);
- hwndRemoveHook = CreateWindow(L"Button", L"ÈÄÅ·ÇØÁ¦", WS_CHILD | WS_VISIBLE,
+ hwndRemoveHook = CreateWindow(L"Button", L"Unhook", WS_CHILD | WS_VISIBLE,
0, 0, 0, 0, hWnd, 0, hIns, NULL);
- hwndTop = CreateWindow(L"Button", L"Ç×»óÀ§", WS_CHILD | WS_VISIBLE | BS_PUSHLIKE | BS_CHECKBOX,
+ hwndTop = CreateWindow(L"Button", L"Top", WS_CHILD | WS_VISIBLE | BS_PUSHLIKE | BS_CHECKBOX,
0, 0, 0, 0, hWnd, 0, hIns, NULL);
hwndProcessComboBox = CreateWindow(L"ComboBox", NULL,
WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST |
diff --git a/i18n/gui_korean/CustomFilter.cpp b/i18n/gui_korean/CustomFilter.cpp
new file mode 100644
index 0000000..9fe03f0
--- /dev/null
+++ b/i18n/gui_korean/CustomFilter.cpp
@@ -0,0 +1,44 @@
+/* Copyright (C) 2010-2012 kaosu (qiupf2000@gmail.com)
+ * This file is part of the Interactive Text Hooker.
+
+ * Interactive Text Hooker is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include "CustomFilter.h"
+
+void CustomFilter::Insert(WORD number)
+{
+ set.insert(number);
+}
+
+void CustomFilter::Erase(WORD number)
+{
+ set.erase(number);
+}
+
+bool CustomFilter::Find(WORD number) const
+{
+ return set.find(number) != set.end();
+}
+
+void CustomFilter::Clear()
+{
+ set.clear();
+}
+
+void CustomFilter::Traverse(CustomFilterCallBack callback, PVOID param)
+{
+ for (auto ch = set.begin(); ch != set.end(); ++ch)
+ callback(*ch, param);
+}
diff --git a/i18n/gui_korean/CustomFilter.h b/i18n/gui_korean/CustomFilter.h
new file mode 100644
index 0000000..fb298a0
--- /dev/null
+++ b/i18n/gui_korean/CustomFilter.h
@@ -0,0 +1,34 @@
+/* Copyright (C) 2010-2012 kaosu (qiupf2000@gmail.com)
+ * This file is part of the Interactive Text Hooker.
+
+ * Interactive Text Hooker is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#pragma once
+
+#include "ITH.h"
+
+typedef void (*CustomFilterCallBack) (WORD, PVOID);
+
+class CustomFilter
+{
+public:
+ bool Find(WORD number) const;
+ void Insert(WORD number);
+ void Erase(WORD number);
+ void Clear();
+ void Traverse(CustomFilterCallBack callback, PVOID param);
+private:
+ std::set set;
+};
diff --git a/i18n/gui_korean/ITH.h b/i18n/gui_korean/ITH.h
new file mode 100644
index 0000000..0701399
--- /dev/null
+++ b/i18n/gui_korean/ITH.h
@@ -0,0 +1,37 @@
+/* Copyright (C) 2010-2012 kaosu (qiupf2000@gmail.com)
+ * This file is part of the Interactive Text Hooker.
+
+ * Interactive Text Hooker is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+#pragma once
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include