Browse Subversion Repository
Contents of /trunk/teraterm/ttpset/ttset_keyboard.c
Parent Directory
| Revision Log
Revision 10129 -
( show annotations)
( download)
( as text)
Tue Aug 9 01:08:26 2022 UTC
(21 months, 3 weeks ago)
by zmatsuo
File MIME type: text/x-csrc
File size: 7757 byte(s)
ttpset.dll を ttermpro.exe へマージした
- EXE(ttermpro.exe)とDLL(ttpset.dll)の各々にヒープが存在する
- モジュール(各ファイル)をまたいでお互いのヒープを操作すると問題が起きる
- dll側で確保してexe側で開放するなどの操作
- ヒープを操作するとアサートが出るなど問題
- どんな問題が出るのかについてのドキュメントは見当たらない
- _CrtIsValidHeapPointer()の説明のヒープ部分から…
- Visual Studio 2010 以降のCRTはヒープは単一になっているのかもしれない
- でも、DLLにstatic CRTがリンクされているときは、DLL個別のヒープが存在する
- Tera Term は static CRT を使用している → DLLに個別のヒープが存在する
- Tera Term 5 では、iniファイルから読み込んだファイル,パス文字列をヒープに置くようにした
- ttpset.dllがiniファイルの読み書きを担っていた
- Unicode対応と合わせて、ファイル名長の上限を撤廃しようとしている
- 従来の上限→MAX_PATH文字
- パスの変更などでモジュールをまたいだヒープ操作が行われることになり、問題が起こる可能性がある
- ログ保存先フォルダを変更するときなどに、malloc(),free()が行われる
- ttpset.dllをなくして、その機能をttermpro.exeに取り込むことでヒープに関する問題が出る可能性を減らす
- ttssh2-dev 409
ticket #45330
| 1 |
/* |
| 2 |
* Copyright (C) 1994-1998 T. Teranishi |
| 3 |
* (C) 2004- TeraTerm Project |
| 4 |
* All rights reserved. |
| 5 |
* |
| 6 |
* Redistribution and use in source and binary forms, with or without |
| 7 |
* modification, are permitted provided that the following conditions |
| 8 |
* are met: |
| 9 |
* |
| 10 |
* 1. Redistributions of source code must retain the above copyright |
| 11 |
* notice, this list of conditions and the following disclaimer. |
| 12 |
* 2. Redistributions in binary form must reproduce the above copyright |
| 13 |
* notice, this list of conditions and the following disclaimer in the |
| 14 |
* documentation and/or other materials provided with the distribution. |
| 15 |
* 3. The name of the author may not be used to endorse or promote products |
| 16 |
* derived from this software without specific prior written permission. |
| 17 |
* |
| 18 |
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR |
| 19 |
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
| 20 |
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
| 21 |
* IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
| 22 |
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
| 23 |
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| 24 |
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 25 |
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 26 |
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
| 27 |
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 28 |
*/ |
| 29 |
|
| 30 |
#include "teraterm.h" |
| 31 |
#include "tttypes_key.h" |
| 32 |
#define _CRTDBG_MAP_ALLOC |
| 33 |
#include <stdio.h> |
| 34 |
#include <stdlib.h> |
| 35 |
#include <string.h> |
| 36 |
#include <crtdbg.h> |
| 37 |
#include "ttlib.h" |
| 38 |
#include "codeconv.h" |
| 39 |
#include "../teraterm/keyboard_i.h" |
| 40 |
#include "ttset.h" |
| 41 |
|
| 42 |
typedef struct { |
| 43 |
int key_id; |
| 44 |
const wchar_t *key_str; |
| 45 |
} keymap_list_t; |
| 46 |
|
| 47 |
static void ReadList(PKeyMap KeyMap, const wchar_t *section, const keymap_list_t *list, size_t count, const wchar_t *FName) |
| 48 |
{ |
| 49 |
size_t i; |
| 50 |
const keymap_list_t *p = list; |
| 51 |
for (i = 0; i < count; p++,i++) { |
| 52 |
wchar_t Temp[11]; |
| 53 |
WORD Num; |
| 54 |
GetPrivateProfileStringW(section, p->key_str, L"", Temp, _countof(Temp), FName); |
| 55 |
if (Temp[0] == 0) |
| 56 |
Num = 0xFFFF; |
| 57 |
else if (_wcsicmp(Temp, L"off") == 0) |
| 58 |
Num = 0xFFFF; |
| 59 |
else if (swscanf(Temp, L"%hd", &Num) != 1) |
| 60 |
Num = 0xFFFF; |
| 61 |
|
| 62 |
KeyMap->Map[p->key_id - 1] = Num; |
| 63 |
} |
| 64 |
} |
| 65 |
|
| 66 |
static void ReadKeyboardMap(PKeyMap KeyMap, const wchar_t* FName) |
| 67 |
{ |
| 68 |
static const keymap_list_t vteditor_list[] = { |
| 69 |
// VT editor keypad |
| 70 |
{ IdUp, L"Up" }, |
| 71 |
{ IdDown, L"Down" }, |
| 72 |
{ IdRight, L"Right" }, |
| 73 |
{ IdLeft, L"Left" }, |
| 74 |
{ IdFind, L"Find" }, |
| 75 |
{ IdInsert, L"Insert" }, |
| 76 |
{ IdRemove, L"Remove" }, |
| 77 |
{ IdSelect, L"Select" }, |
| 78 |
{ IdPrev, L"Prev" }, |
| 79 |
{ IdNext, L"Next" }, |
| 80 |
}; |
| 81 |
|
| 82 |
static const keymap_list_t vtnumeric_list[] = { |
| 83 |
// VT numeric keypad |
| 84 |
{ Id0, L"Num0" }, |
| 85 |
{ Id1, L"Num1" }, |
| 86 |
{ Id2, L"Num2" }, |
| 87 |
{ Id3, L"Num3" }, |
| 88 |
{ Id4, L"Num4" }, |
| 89 |
{ Id5, L"Num5" }, |
| 90 |
{ Id6, L"Num6" }, |
| 91 |
{ Id7, L"Num7" }, |
| 92 |
{ Id8, L"Num8" }, |
| 93 |
{ Id9, L"Num9" }, |
| 94 |
{ IdMinus, L"NumMinus" }, |
| 95 |
{ IdComma, L"NumComma" }, |
| 96 |
{ IdPeriod, L"NumPeriod" }, |
| 97 |
{ IdEnter, L"NumEnter" }, |
| 98 |
{ IdSlash, L"NumSlash" }, |
| 99 |
{ IdAsterisk, L"NumAsterisk" }, |
| 100 |
{ IdPlus, L"NumPlus" }, |
| 101 |
{ IdPF1, L"PF1" }, |
| 102 |
{ IdPF2, L"PF2" }, |
| 103 |
{ IdPF3, L"PF3" }, |
| 104 |
{ IdPF4, L"PF4" }, |
| 105 |
}; |
| 106 |
|
| 107 |
static const keymap_list_t vtfunction_list[] = { |
| 108 |
// VT function keys |
| 109 |
{ IdHold, L"Hold" }, |
| 110 |
{ IdPrint, L"Print" }, |
| 111 |
{ IdBreak, L"Break" }, |
| 112 |
{ IdF6, L"F6" }, |
| 113 |
{ IdF7, L"F7" }, |
| 114 |
{ IdF8, L"F8" }, |
| 115 |
{ IdF9, L"F9" }, |
| 116 |
{ IdF10, L"F10" }, |
| 117 |
{ IdF11, L"F11" }, |
| 118 |
{ IdF12, L"F12" }, |
| 119 |
{ IdF13, L"F13" }, |
| 120 |
{ IdF14, L"F14" }, |
| 121 |
{ IdHelp, L"Help" }, |
| 122 |
{ IdDo, L"Do" }, |
| 123 |
{ IdF17, L"F17" }, |
| 124 |
{ IdF18, L"F18" }, |
| 125 |
{ IdF19, L"F19" }, |
| 126 |
{ IdF20, L"F20" }, |
| 127 |
|
| 128 |
// UDK |
| 129 |
{ IdUDK6, L"UDK6" }, |
| 130 |
{ IdUDK7, L"UDK7" }, |
| 131 |
{ IdUDK8, L"UDK8" }, |
| 132 |
{ IdUDK9, L"UDK9" }, |
| 133 |
{ IdUDK10, L"UDK10" }, |
| 134 |
{ IdUDK11, L"UDK11" }, |
| 135 |
{ IdUDK12, L"UDK12" }, |
| 136 |
{ IdUDK13, L"UDK13" }, |
| 137 |
{ IdUDK14, L"UDK14" }, |
| 138 |
{ IdUDK15, L"UDK15" }, |
| 139 |
{ IdUDK16, L"UDK16" }, |
| 140 |
{ IdUDK17, L"UDK17" }, |
| 141 |
{ IdUDK18, L"UDK18" }, |
| 142 |
{ IdUDK19, L"UDK19" }, |
| 143 |
}; |
| 144 |
|
| 145 |
static const keymap_list_t xterm_list[] = { |
| 146 |
// XTERM function / extended keys |
| 147 |
{ IdXF1, L"XF1" }, |
| 148 |
{ IdXF2, L"XF2" }, |
| 149 |
{ IdXF3, L"XF3" }, |
| 150 |
{ IdXF4, L"XF4" }, |
| 151 |
{ IdXF5, L"XF5" }, |
| 152 |
{ IdXBackTab, L"XBackTab" }, |
| 153 |
}; |
| 154 |
|
| 155 |
static const keymap_list_t shortcut_list[] = { |
| 156 |
// accelerator keys |
| 157 |
{ IdCmdEditCopy, L"EditCopy" }, |
| 158 |
{ IdCmdEditPaste, L"EditPaste" }, |
| 159 |
{ IdCmdEditPasteCR, L"EditPasteCR" }, |
| 160 |
{ IdCmdEditCLS, L"EditCLS" }, |
| 161 |
{ IdCmdEditCLB, L"EditCLB" }, |
| 162 |
{ IdCmdCtrlOpenTEK, L"ControlOpenTEK" }, |
| 163 |
{ IdCmdCtrlCloseTEK, L"ControlCloseTEK" }, |
| 164 |
{ IdCmdLineUp, L"LineUp" }, |
| 165 |
{ IdCmdLineDown, L"LineDown" }, |
| 166 |
{ IdCmdPageUp, L"PageUp" }, |
| 167 |
{ IdCmdPageDown, L"PageDown" }, |
| 168 |
{ IdCmdBuffTop, L"BuffTop" }, |
| 169 |
{ IdCmdBuffBottom, L"BuffBottom" }, |
| 170 |
{ IdCmdNextWin, L"NextWin" }, |
| 171 |
{ IdCmdPrevWin, L"PrevWin" }, |
| 172 |
{ IdCmdNextSWin, L"NextShownWin" }, |
| 173 |
{ IdCmdPrevSWin, L"PrevShownWin" }, |
| 174 |
{ IdCmdLocalEcho, L"LocalEcho" }, |
| 175 |
{ IdCmdScrollLock, L"ScrollLock" }, |
| 176 |
}; |
| 177 |
|
| 178 |
ReadList(KeyMap, L"VT editor keypad", vteditor_list, _countof(vteditor_list), FName); |
| 179 |
ReadList(KeyMap, L"VT numeric keypad", vtnumeric_list, _countof(vtnumeric_list), FName); |
| 180 |
ReadList(KeyMap, L"VT function keys", vtfunction_list, _countof(vtfunction_list), FName); |
| 181 |
ReadList(KeyMap, L"X function keys", xterm_list, _countof(xterm_list), FName); |
| 182 |
ReadList(KeyMap, L"Shortcut keys", shortcut_list, _countof(shortcut_list), FName); |
| 183 |
} |
| 184 |
|
| 185 |
static void ReadUserkeysSection(const wchar_t *FName, PKeyMap KeyMap) |
| 186 |
{ |
| 187 |
int i; |
| 188 |
|
| 189 |
for (i = 0; i < NumOfUserKey; i++) { |
| 190 |
const int ttkeycode = IdUser1 + i; // tera term key code |
| 191 |
wchar_t EntName[7]; |
| 192 |
wchar_t TempStr[256]; |
| 193 |
_snwprintf_s(EntName, _countof(EntName), _TRUNCATE, L"User%d", i + 1); |
| 194 |
GetPrivateProfileStringW(L"User keys", EntName, L"", |
| 195 |
TempStr, _countof(TempStr), FName); |
| 196 |
if (TempStr[0] == 0) { |
| 197 |
continue; |
| 198 |
} |
| 199 |
|
| 200 |
if(_wcsnicmp(TempStr, L"off", 3) == 0) { |
| 201 |
KeyMap->Map[ttkeycode - 1] = 0xFFFF; |
| 202 |
continue; |
| 203 |
} |
| 204 |
|
| 205 |
{ |
| 206 |
int keycode; |
| 207 |
int type; |
| 208 |
wchar_t str[256]; |
| 209 |
int r; |
| 210 |
r = swscanf_s(TempStr, L"%d,%d,%[^\n]", &keycode, &type, &str, (unsigned)_countof(str)); |
| 211 |
if (r != 3) { |
| 212 |
continue; |
| 213 |
} |
| 214 |
|
| 215 |
{ |
| 216 |
UserKey_t *UserKeyData; |
| 217 |
const int UserKeyCount = KeyMap->UserKeyCount; |
| 218 |
UserKey_t *p; |
| 219 |
|
| 220 |
UserKeyData = (UserKey_t *)realloc(KeyMap->UserKeyData, sizeof(UserKey_t) * (UserKeyCount + 1)); |
| 221 |
p = UserKeyData + UserKeyCount; |
| 222 |
p->ptr = _wcsdup(str); |
| 223 |
p->len = wcslen(p->ptr); |
| 224 |
p->type = type; |
| 225 |
p->keycode = keycode; |
| 226 |
p->ttkeycode = ttkeycode; |
| 227 |
|
| 228 |
KeyMap->UserKeyData = UserKeyData; |
| 229 |
KeyMap->UserKeyCount++; |
| 230 |
|
| 231 |
KeyMap->Map[ttkeycode - 1] = (WORD)keycode; |
| 232 |
} |
| 233 |
} |
| 234 |
} |
| 235 |
} |
| 236 |
|
| 237 |
/** |
| 238 |
* keyboard.cnf ���������� |
| 239 |
* KeyMap ������������ |
| 240 |
*/ |
| 241 |
void PASCAL _ReadKeyboardCnf(const wchar_t *FName, PKeyMap KeyMap, BOOL ShowWarning) |
| 242 |
{ |
| 243 |
int i, j; |
| 244 |
|
| 245 |
ReadKeyboardMap(KeyMap, FName); |
| 246 |
ReadUserkeysSection(FName, KeyMap); |
| 247 |
|
| 248 |
// �d���`�F�b�N |
| 249 |
for (j = 1; j <= IdKeyMax - 1; j++) |
| 250 |
if (KeyMap->Map[j] != 0xFFFF) |
| 251 |
for (i = 0; i <= j - 1; i++) |
| 252 |
if (KeyMap->Map[i] == KeyMap->Map[j]) { |
| 253 |
if (ShowWarning) { |
| 254 |
char TempStr[128]; |
| 255 |
_snprintf_s(TempStr, sizeof(TempStr), _TRUNCATE, |
| 256 |
"Keycode %d is used more than once", |
| 257 |
KeyMap->Map[j]); |
| 258 |
MessageBoxA(NULL, TempStr, |
| 259 |
"Tera Term: Error in keyboard setup file", |
| 260 |
MB_ICONEXCLAMATION); |
| 261 |
} |
| 262 |
KeyMap->Map[i] = 0xFFFF; |
| 263 |
} |
| 264 |
} |
| |