From c150bbc8f4bdcabc4609c805aaddcd17a474218d Mon Sep 17 00:00:00 2001 From: Masaru Tsuchiyama Date: Fri, 12 Jun 2026 13:58:10 +0900 Subject: [PATCH 1/3] =?UTF-8?q?uptime=20=E3=82=B3=E3=83=9E=E3=83=B3?= =?UTF-8?q?=E3=83=89=E3=81=AB=202=20=E5=BC=95=E6=95=B0=E5=BD=A2=E5=BC=8F?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E5=8A=A0=E3=81=97=E3=80=81GetTickCount64()?= =?UTF-8?q?=20=E3=81=B8=E7=A7=BB=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - uptime コマンドに 2 引数形式(第1引数: 秒、第2引数: ミリ秒)を追加 - GetTickCount()/DWORD を GetTickCount64()/ULONGLONG に置き換え(49 日オーバーフロー対策) - 英日ドキュメントを更新 - テストスクリプト追加 (uptime, wait_timeout_connected) - int 型への統一 Co-Authored-By: Claude Sonnet 4.6 --- TTProxy/ProxyWSockHook.h | 10 +- doc/en/html/macro/command/uptime.html | 165 ++++++++++++++++---------- doc/ja/html/macro/command/uptime.html | 162 +++++++++++++++---------- teraterm/common/compat_win.cpp | 2 +- teraterm/common/dlglib.c | 17 +-- teraterm/common/dlglib.h | 2 +- teraterm/common/ttlib.c | 14 +-- teraterm/common/ttlib.h | 2 +- teraterm/common/tttypes.h | 2 +- teraterm/teraterm/buffer.c | 8 +- teraterm/teraterm/commlib.c | 2 +- teraterm/teraterm/filesys.cpp | 4 +- teraterm/teraterm/filesys_log.cpp | 4 +- teraterm/teraterm/filesys_proto.cpp | 2 +- teraterm/teraterm/filesys_proto.h | 2 +- teraterm/teraterm/ftdlg.cpp | 16 +-- teraterm/teraterm/ftdlg.h | 2 +- teraterm/teraterm/ftdlg_lite.cpp | 14 +-- teraterm/teraterm/sendmem.cpp | 6 +- teraterm/teraterm/teraterm.cpp | 6 +- teraterm/teraterm/vtterm.c | 14 +-- teraterm/teraterm/vtwin.cpp | 2 +- teraterm/teraterm/vtwin.h | 2 +- teraterm/ttpfile/bplus.c | 6 +- teraterm/ttpfile/kermit.c | 8 +- teraterm/ttpfile/quickvan.c | 8 +- teraterm/ttpfile/raw.c | 10 +- teraterm/ttpfile/xmodem.c | 4 +- teraterm/ttpfile/ymodem.c | 6 +- teraterm/ttpfile/zmodem.c | 10 +- teraterm/ttpmacro/ttl.cpp | 74 ++++++------ teraterm/ttpmacro/ttmenc.c | 2 +- tests/uptime.ttl | 31 +++++ tests/uptime_test.ttl | 38 ++++++ tests/wait_timeout_connected.ttl | 43 +++++++ ttssh2/ttxssh/ssh.c | 20 ++-- ttssh2/ttxssh/ssh.h | 6 +- ttssh2/ttxssh/ttxssh.c | 2 +- 38 files changed, 456 insertions(+), 272 deletions(-) create mode 100644 tests/uptime.ttl create mode 100644 tests/uptime_test.ttl create mode 100644 tests/wait_timeout_connected.ttl diff --git a/TTProxy/ProxyWSockHook.h b/TTProxy/ProxyWSockHook.h index a571a641e..be2725d51 100644 --- a/TTProxy/ProxyWSockHook.h +++ b/TTProxy/ProxyWSockHook.h @@ -471,7 +471,7 @@ class ProxyWSockHook { in_addr addr; struct in6_addr addr6; char* buffer; - DWORD time; + ULONGLONG time; ConnectionInfo(ProxyInfo& proxy, String realhost):proxy(proxy), realhost(realhost), buffer(NULL) { } ~ConnectionInfo() { @@ -664,7 +664,7 @@ class ProxyWSockHook { ConnectionInfo* info = table.get(url); ::LeaveCriticalSection(§ion); if (info != NULL) { - info->time = ::GetTickCount(); + info->time = ::GetTickCount64(); return info; } ProxyInfo proxy; @@ -688,8 +688,8 @@ class ProxyWSockHook { } } if (i >= countof(list)) { - DWORD now = ::GetTickCount(); - DWORD max = 0; + ULONGLONG now = ::GetTickCount64(); + ULONGLONG max = 0; int index = -1; for (i = 0; i < countof(list); i++) { if (list[i] != NULL) { @@ -709,7 +709,7 @@ class ProxyWSockHook { info->addr6.s6_addr[11] = 0xff; info->addr6.s6_addr[15] = i + 1; - info->time = ::GetTickCount(); + info->time = ::GetTickCount64(); return info; } }; diff --git a/doc/en/html/macro/command/uptime.html b/doc/en/html/macro/command/uptime.html index 94df65479..0083d24dc 100644 --- a/doc/en/html/macro/command/uptime.html +++ b/doc/en/html/macro/command/uptime.html @@ -1,65 +1,100 @@ - - - - - uptime - - - - - - - -

uptime

- -

-Gets System Up Time. (version 4.81 or later) -

- -
-uptime <intvar>
-
- -

Remarks

- -

-Retrieves the number of milliseconds that have elapsed since the Windows OS was started, -and then stores the value into the <intvar> variable. -

- -

-The time wraps around to zero if the system is run continuously for 49.7 days. -

- - -

Example

- -
-; How to get the uptime in Windows
-uptime var
-day = var / 86400000
-var = var % 86400000
-hour = var / 3600000
-var = var % 3600000
-min = var / 60000
-var = var % 60000
-sec = var / 1000
-
-sprintf2 str "System Up Time: %d Days, %d Hours, %d Minutes, %d Seconds" day hour min sec
-messagebox str "uptime"
-
- -
-uptime varstart
-
-; do something...
-
-uptime varend
-diff = varend - varstart
-sprintf2 str "MACRO running time: %d msec" diff
-messagebox str "running time"
-
- - - + + + + + uptime + + + + + + + +

uptime

+ +

+Gets System Up Time. (version 4.81 or later) +

+ +

1) Format 1

+ +
+uptime <intvar>
+
+ +

2) Format 2

+ +
+uptime <secvar> <msecvar>
+
+ +

Remarks

+ +

Format 1

+ +

+Retrieves the number of milliseconds that have elapsed since the Windows OS was started, +and then stores the value into the <intvar> variable. +

+ +

+The time wraps around to zero if the system is run continuously for 49.7 days. +

+ +

Format 2

+ +

+Retrieves the number of milliseconds that have elapsed since the Windows OS was started +using GetTickCount64(), and then stores the following values: +

+ +
+
<secvar>
+
Windows OS uptime in seconds (GetTickCount64() / 1000)
+
<msecvar>
+
Sub-second portion of the uptime in milliseconds (GetTickCount64() % 1000)
+
+ +

+Both <secvar> and <msecvar> must be integer variables. +

+ + +

Example

+ +
+; Format 1: How to get the uptime in Windows
+uptime var
+day = var / 86400000
+var = var % 86400000
+hour = var / 3600000
+var = var % 3600000
+min = var / 60000
+var = var % 60000
+sec = var / 1000
+
+sprintf2 str "System Up Time: %d Days, %d Hours, %d Minutes, %d Seconds" day hour min sec
+messagebox str "uptime"
+
+ +
+uptime varstart
+
+; do something...
+
+uptime varend
+diff = varend - varstart
+sprintf2 str "MACRO running time: %d msec" diff
+messagebox str "running time"
+
+ +
+; Format 2: Get uptime as seconds and milliseconds
+uptime sec msec
+sprintf2 str "System Up Time: %d.%03d seconds" sec msec
+messagebox str "uptime"
+
+ + + diff --git a/doc/ja/html/macro/command/uptime.html b/doc/ja/html/macro/command/uptime.html index 6778ddc58..c405d6a33 100644 --- a/doc/ja/html/macro/command/uptime.html +++ b/doc/ja/html/macro/command/uptime.html @@ -1,64 +1,98 @@ - - - - - uptime - - - - - - - -

uptime

- -

-OS̉ғԂ擾B(o[W4.81ȍ~) -

- -
-uptime <intvar>
-
- -

- -

-Windows OS̉ғԁi~bj <intvar> Ɋi[B -

- -

-ғԂ49o߂ƁA0ɖ߂B -

- - -

- -
-; How to get the uptime in Windows
-uptime var
-day = var / 86400000
-var = var % 86400000
-hour = var / 3600000
-var = var % 3600000
-min = var / 60000
-var = var % 60000
-sec = var / 1000
-
-sprintf2 str "System Up Time: %d Days, %d Hours, %d Minutes, %d Seconds" day hour min sec
-messagebox str "uptime"
-
- -
-uptime varstart
-
-; do something...
-
-uptime varend
-diff = varend - varstart
-sprintf2 str "MACRO running time: %d msec" diff
-messagebox str "running time"
-
- - - + + + + + uptime + + + + + + + +

uptime

+ +

+OS̉ғԂ擾B(o[W4.81ȍ~) +

+ +

1) `1

+ +
+uptime <intvar>
+
+ +

2) `2

+ +
+uptime <secvar> <msecvar>
+
+ +

+ +

`1

+ +

+Windows OS̉ғԁi~bj <intvar> Ɋi[B +

+ +

+ғԂ49o߂ƁA0ɖ߂B +

+ +

`2

+ +

+GetTickCount64() gWindows OS̉ғԂ擾AL̒li[B +

+ +
+
<secvar>
+
Windows OS̉ғԁibPʁj(GetTickCount64() / 1000)
+
<msecvar>
+
ғԂ1b̕i~bPʁj(GetTickCount64() % 1000)
+
+ +

+<secvar> <msecvar> ͂Ƃɐ^ϐłȂ΂ȂȂB +

+ + +

+ +
+; `1: Windows̉ғԂ擾
+uptime var
+day = var / 86400000
+var = var % 86400000
+hour = var / 3600000
+var = var % 3600000
+min = var / 60000
+var = var % 60000
+sec = var / 1000
+
+sprintf2 str "System Up Time: %d Days, %d Hours, %d Minutes, %d Seconds" day hour min sec
+messagebox str "uptime"
+
+ +
+uptime varstart
+
+; do something...
+
+uptime varend
+diff = varend - varstart
+sprintf2 str "MACRO running time: %d msec" diff
+messagebox str "running time"
+
+ +
+; `2: ғԂbƃ~bŎ擾
+uptime sec msec
+sprintf2 str "System Up Time: %d.%03d seconds" sec msec
+messagebox str "uptime"
+
+ + + diff --git a/teraterm/common/compat_win.cpp b/teraterm/common/compat_win.cpp index 50697632c..5dee78c74 100644 --- a/teraterm/common/compat_win.cpp +++ b/teraterm/common/compat_win.cpp @@ -239,7 +239,7 @@ static HWND WINAPI GetConsoleWindowLocal(void) } // Format a "unique" NewWindowTitle. - wsprintfA(pszNewWindowTitle, "%d/%d", GetTickCount(), GetCurrentProcessId()); + wsprintfA(pszNewWindowTitle, "%I64u/%d", GetTickCount64(), GetCurrentProcessId()); // Change current window title. SetConsoleTitleA(pszNewWindowTitle); diff --git a/teraterm/common/dlglib.c b/teraterm/common/dlglib.c index 25e515aec..164f46e90 100644 --- a/teraterm/common/dlglib.c +++ b/teraterm/common/dlglib.c @@ -153,13 +153,14 @@ void SetDlgPercent(HWND HDlg, int id_Item, int id_Progress, LONG a, LONG b, int } } -void SetDlgTime(HWND HDlg, int id_Item, DWORD stime, int bytes) +void SetDlgTime(HWND HDlg, int id_Item, ULONGLONG stime, int bytes) { - static int prev_elapsed; - int elapsed, rate; + static ULONGLONG prev_elapsed; + ULONGLONG elapsed; + int rate; wchar_t buff[64]; - elapsed = (GetTickCount() - stime) / 1000; + elapsed = (GetTickCount64() - stime) / 1000; if (elapsed == 0) { prev_elapsed = 0; @@ -172,15 +173,15 @@ void SetDlgTime(HWND HDlg, int id_Item, DWORD stime, int bytes) } prev_elapsed = elapsed; - rate = bytes / elapsed; + rate = (int)(bytes / elapsed); if (rate < 1200) { - _snwprintf_s(buff, _countof(buff), _TRUNCATE, L"%d:%02d (%dBytes/s)", elapsed / 60, elapsed % 60, rate); + _snwprintf_s(buff, _countof(buff), _TRUNCATE, L"%llu:%02llu (%dBytes/s)", elapsed / 60, elapsed % 60, rate); } else if (rate < 1200000) { - _snwprintf_s(buff, _countof(buff), _TRUNCATE, L"%d:%02d (%d.%02dKB/s)", elapsed / 60, elapsed % 60, rate / 1000, rate / 10 % 100); + _snwprintf_s(buff, _countof(buff), _TRUNCATE, L"%llu:%02llu (%d.%02dKB/s)", elapsed / 60, elapsed % 60, rate / 1000, rate / 10 % 100); } else { - _snwprintf_s(buff, _countof(buff), _TRUNCATE, L"%d:%02d (%d.%02dMB/s)", elapsed / 60, elapsed % 60, rate / (1000 * 1000), rate / 10000 % 100); + _snwprintf_s(buff, _countof(buff), _TRUNCATE, L"%llu:%02llu (%d.%02dMB/s)", elapsed / 60, elapsed % 60, rate / (1000 * 1000), rate / 10000 % 100); } SetDlgItemTextW(HDlg, id_Item, buff); diff --git a/teraterm/common/dlglib.h b/teraterm/common/dlglib.h index ad5989da4..66c82bf60 100644 --- a/teraterm/common/dlglib.h +++ b/teraterm/common/dlglib.h @@ -44,7 +44,7 @@ void SetRB(HWND HDlg, int R, int FirstId, int LastId); void GetRB(HWND HDlg, LPWORD R, int FirstId, int LastId); void SetDlgNum(HWND HDlg, int id_Item, LONG Num); void SetDlgPercent(HWND HDlg, int id_Item, int id_Progress, LONG a, LONG b, int *prog); -void SetDlgTime(HWND HDlg, int id_Item, DWORD elapsed, int bytes); +void SetDlgTime(HWND HDlg, int id_Item, ULONGLONG elapsed, int bytes); void SetDropDownList(HWND HDlg, int Id_Item, const char *List[], int nsel); void SetDropDownListW(HWND HDlg, int Id_Item, const wchar_t *List[], int nsel); LONG GetCurSel(HWND HDlg, int Id_Item); diff --git a/teraterm/common/ttlib.c b/teraterm/common/ttlib.c index 12d865a08..dab3e45c4 100644 --- a/teraterm/common/ttlib.c +++ b/teraterm/common/ttlib.c @@ -956,24 +956,24 @@ char *mctimelocal(const char *format, BOOL utc_flag) * @return 経過時間の文字列 * 不要になったらfree()すること */ -char *strelapsed(DWORD start_time) +char *strelapsed(ULONGLONG start_time) { size_t sizeof_strtime = 20; char *strtime = malloc(sizeof_strtime); int days, hours, minutes, seconds, msecs; - DWORD delta = GetTickCount() - start_time; + ULONGLONG delta = GetTickCount64() - start_time; - msecs = delta % 1000; + msecs = (int)(delta % 1000); delta /= 1000; - seconds = delta % 60; + seconds = (int)(delta % 60); delta /= 60; - minutes = delta % 60; + minutes = (int)(delta % 60); delta /= 60; - hours = delta % 24; - days = delta / 24; + hours = (int)(delta % 24); + days = (int)(delta / 24); _snprintf_s(strtime, sizeof_strtime, _TRUNCATE, "%d %02d:%02d:%02d.%03d", diff --git a/teraterm/common/ttlib.h b/teraterm/common/ttlib.h index 498cc4823..13492cb0e 100644 --- a/teraterm/common/ttlib.h +++ b/teraterm/common/ttlib.h @@ -137,7 +137,7 @@ DllExport BOOL HasMultiMonitorSupport(); DllExport BOOL HasDnsQuery(); DllExport BOOL HasBalloonTipSupport(); DllExport char *mctimelocal(const char *format, BOOL utc_flag); -char *strelapsed(DWORD start_time); +char *strelapsed(ULONGLONG start_time); void b64encode(PCHAR dst, int dsize, PCHAR src, int len); DllExport int b64decode(PCHAR dst, int dsize, PCHAR src); diff --git a/teraterm/common/tttypes.h b/teraterm/common/tttypes.h index 530f76778..1c9394787 100644 --- a/teraterm/common/tttypes.h +++ b/teraterm/common/tttypes.h @@ -869,7 +869,7 @@ typedef struct { void *NotifyIcon; - DWORD ConnectedTime; + ULONGLONG ConnectedTime; void (*Log1Byte)(BYTE b); void (*Log1Bin)(BYTE b); diff --git a/teraterm/teraterm/buffer.c b/teraterm/teraterm/buffer.c index 4a196fc26..71ce82cca 100644 --- a/teraterm/teraterm/buffer.c +++ b/teraterm/teraterm/buffer.c @@ -115,7 +115,7 @@ static BOOL BoxSelect; // TRUE=矩形選択 / FALSE=行選択 static POINT ClickCell; // クリックした文字cell static POINT SelectStartOld; // 描画した選択領域、start static POINT SelectEndOld; // 描画した選択領域、end -static DWORD SelectStartTime; +static ULONGLONG SelectStartTime; static POINT DblClkStart; static POINT DblClkEnd; @@ -4749,7 +4749,7 @@ void BuffStartSelect(int Xw, int Yw, BOOL Box, BOOL Shift) Selected = FALSE; // 選択開始ガード - SelectStartTime = GetTickCount(); + SelectStartTime = GetTickCount64(); Selecting = FALSE; // push位置 @@ -4778,7 +4778,7 @@ void BuffChangeSelect(int Xw, int Yw, int NClick) if (!Selecting) { // 選択ガード? - if (GetTickCount() - SelectStartTime < ts.SelectStartDelay) { + if (GetTickCount64() - SelectStartTime < ts.SelectStartDelay) { // ガード中 return; } @@ -4889,7 +4889,7 @@ void BuffEndSelect(int Xw, int Yw) (void)Xw; (void)Yw; if (!Selecting) { - if (GetTickCount() - SelectStartTime < ts.SelectStartDelay) { + if (GetTickCount64() - SelectStartTime < ts.SelectStartDelay) { // ガード時間以内なら // 選択領域解除 SelectEnd = SelectStart; diff --git a/teraterm/teraterm/commlib.c b/teraterm/teraterm/commlib.c index 7a9942ddf..92c5125ff 100644 --- a/teraterm/teraterm/commlib.c +++ b/teraterm/teraterm/commlib.c @@ -805,7 +805,7 @@ void CommStart(PComVar cv, LONG lParam, PTTSet ts) break; } cv->Ready = TRUE; - cv->ConnectedTime = GetTickCount(); + cv->ConnectedTime = GetTickCount64(); } BOOL CommCanClose(PComVar cv) diff --git a/teraterm/teraterm/filesys.cpp b/teraterm/teraterm/filesys.cpp index 70472fc85..cdcfc59aa 100644 --- a/teraterm/teraterm/filesys.cpp +++ b/teraterm/teraterm/filesys.cpp @@ -66,7 +66,7 @@ typedef struct { LONG FileSize; // uint64_t FileSize; TODO LONG ByteCount; // uint64_t ByteCount; - DWORD StartTime; + ULONGLONG StartTime; BOOL FilePause; BOOL FileRetrySend, FileRetryEcho, FileCRSend, FileReadEOF, BinaryMode; @@ -118,7 +118,7 @@ static BOOL OpenFTDlg(PFileVar fv) free(DlgCaption); fv->FilePause = FALSE; - fv->StartTime = GetTickCount(); + fv->StartTime = GetTickCount64(); fv->SendDlg = FTDlg; /* File send */ return TRUE; diff --git a/teraterm/teraterm/filesys_log.cpp b/teraterm/teraterm/filesys_log.cpp index 26eb3ddf6..70e7ca54d 100644 --- a/teraterm/teraterm/filesys_log.cpp +++ b/teraterm/teraterm/filesys_log.cpp @@ -69,7 +69,7 @@ typedef struct { LONG FileSize; // ? 使っていない LONG ByteCount; // ファイルサイズ - DWORD StartTime; + ULONGLONG StartTime; enum enumLineEnd eLineEnd; @@ -406,7 +406,7 @@ static BOOL LogStart(PFileVar fv, const wchar_t *fname) } fv->IsPause = FALSE; - fv->StartTime = GetTickCount(); + fv->StartTime = GetTickCount64(); if (ts.DeferredLogWriteMode) { StartThread(fv); diff --git a/teraterm/teraterm/filesys_proto.cpp b/teraterm/teraterm/filesys_proto.cpp index ec9ce6b77..dd36acc20 100644 --- a/teraterm/teraterm/filesys_proto.cpp +++ b/teraterm/teraterm/filesys_proto.cpp @@ -92,7 +92,7 @@ static PFileVarProto FileVar = NULL; static PProtoDlg PtDlg = NULL; static BOOL cv_ProtoFlag = FALSE; -static void _SetDlgTime(TFileVarProto *fv, DWORD elapsed, int bytes) +static void _SetDlgTime(TFileVarProto *fv, ULONGLONG elapsed, int bytes) { SetDlgTime(fv->HWin, IDC_PROTOELAPSEDTIME, elapsed, bytes); } diff --git a/teraterm/teraterm/filesys_proto.h b/teraterm/teraterm/filesys_proto.h index 0936ec6ec..8933d3ff7 100644 --- a/teraterm/teraterm/filesys_proto.h +++ b/teraterm/teraterm/filesys_proto.h @@ -153,7 +153,7 @@ typedef TFileVarProto *PFileVarProto; // UIなど情報表示用関数 typedef struct InfoOp_ { void (*InitDlgProgress)(struct FileVarProto *fv, int *CurProgStat); - void (*SetDlgTime)(struct FileVarProto *fv, DWORD elapsed, int bytes); + void (*SetDlgTime)(struct FileVarProto *fv, ULONGLONG elapsed, int bytes); void (*SetDlgPacketNum)(struct FileVarProto *fv, LONG Num); void (*SetDlgByteCount)(struct FileVarProto *fv, LONG Num); void (*SetDlgPercent)(struct FileVarProto *fv, LONG a, LONG b, int *p); diff --git a/teraterm/teraterm/ftdlg.cpp b/teraterm/teraterm/ftdlg.cpp index 66009075c..214d93250 100644 --- a/teraterm/teraterm/ftdlg.cpp +++ b/teraterm/teraterm/ftdlg.cpp @@ -151,13 +151,13 @@ void CFileTransDlg::ChangeButton(BOOL PauseFlag) } } -void CFileTransDlg::RefreshNum(DWORD StartTime, LONG FileSize, LONG ByteCount) +void CFileTransDlg::RefreshNum(ULONGLONG StartTime, LONG FileSize, LONG ByteCount) { char NumStr[24]; double rate; int rate2; - static DWORD prev_elapsed; - DWORD elapsed; + static ULONGLONG prev_elapsed; + ULONGLONG elapsed; if (OpId == OpSendFile) { if (StartTime == 0) { @@ -165,17 +165,17 @@ void CFileTransDlg::RefreshNum(DWORD StartTime, LONG FileSize, LONG ByteCount) prev_elapsed = 0; } else { - elapsed = (GetTickCount() - StartTime) / 1000; + elapsed = (GetTickCount64() - StartTime) / 1000; if (elapsed != prev_elapsed && elapsed != 0) { - rate2 = ByteCount / elapsed; + rate2 = (int)(ByteCount / elapsed); if (rate2 < 1200) { - _snprintf_s(NumStr, sizeof(NumStr), _TRUNCATE, "%d:%02d (%dBytes/s)", elapsed / 60, elapsed % 60, rate2); + _snprintf_s(NumStr, sizeof(NumStr), _TRUNCATE, "%llu:%02llu (%dBytes/s)", elapsed / 60, elapsed % 60, rate2); } else if (rate2 < 1200000) { - _snprintf_s(NumStr, sizeof(NumStr), _TRUNCATE, "%d:%02d (%d.%02dKB/s)", elapsed / 60, elapsed % 60, rate2 / 1000, rate2 / 10 % 100); + _snprintf_s(NumStr, sizeof(NumStr), _TRUNCATE, "%llu:%02llu (%d.%02dKB/s)", elapsed / 60, elapsed % 60, rate2 / 1000, rate2 / 10 % 100); } else { - _snprintf_s(NumStr, sizeof(NumStr), _TRUNCATE, "%d:%02d (%d.%02dMB/s)", elapsed / 60, elapsed % 60, rate2 / (1000*1000), rate2 / 10000 % 100); + _snprintf_s(NumStr, sizeof(NumStr), _TRUNCATE, "%llu:%02llu (%d.%02dMB/s)", elapsed / 60, elapsed % 60, rate2 / (1000*1000), rate2 / 10000 % 100); } SetDlgItemText(IDC_TRANS_ETIME, NumStr); prev_elapsed = elapsed; diff --git a/teraterm/teraterm/ftdlg.h b/teraterm/teraterm/ftdlg.h index 5283598c4..6d3e83444 100644 --- a/teraterm/teraterm/ftdlg.h +++ b/teraterm/teraterm/ftdlg.h @@ -57,7 +57,7 @@ class CFileTransDlg : public TTCDialog BOOL Create(HINSTANCE hInstance, Info *info); void ChangeButton(BOOL PauseFlag); - void RefreshNum(DWORD StartTime, LONG FileSize, LONG ByteCount); + void RefreshNum(ULONGLONG StartTime, LONG FileSize, LONG ByteCount); private: virtual BOOL OnCancel(); diff --git a/teraterm/teraterm/ftdlg_lite.cpp b/teraterm/teraterm/ftdlg_lite.cpp index 44558e98e..1461ef283 100644 --- a/teraterm/teraterm/ftdlg_lite.cpp +++ b/teraterm/teraterm/ftdlg_lite.cpp @@ -174,8 +174,8 @@ class PrivateData : public TTCDialog BOOL Pause; BOOL check_2sec; BOOL show; - DWORD prev_elapsed; - DWORD StartTime; + ULONGLONG prev_elapsed; + ULONGLONG StartTime; BOOL HideDialog; CFileTransLiteDlg::Observer *observer_; @@ -215,7 +215,7 @@ BOOL CFileTransLiteDlg::Create(HINSTANCE hInstance, HWND hParent, const wchar_t } pData->SetDlgItemTextA(IDC_TRANS_ETIME, "0:00"); - pData->StartTime = GetTickCount(); + pData->StartTime = GetTickCount64(); pData->prev_elapsed = 0; return Ok; @@ -232,10 +232,10 @@ void CFileTransLiteDlg::RefreshNum(size_t ByteCount, size_t FileSize) return; } - const DWORD now = GetTickCount(); + const ULONGLONG now = GetTickCount64(); if (!pData->check_2sec) { - DWORD elapsed_ms = now - pData->StartTime; + ULONGLONG elapsed_ms = now - pData->StartTime; if (elapsed_ms > 2 * 1000) { // 2sec経過 pData->check_2sec = TRUE; @@ -247,10 +247,10 @@ void CFileTransLiteDlg::RefreshNum(size_t ByteCount, size_t FileSize) } char NumStr[24]; - DWORD elapsed = (now - pData->StartTime) / 1000; + ULONGLONG elapsed = (now - pData->StartTime) / 1000; if (elapsed != pData->prev_elapsed && elapsed != 0) { char elapsed_str[24]; - _snprintf_s(elapsed_str, sizeof(elapsed_str), _TRUNCATE, "%ld:%02ld", + _snprintf_s(elapsed_str, sizeof(elapsed_str), _TRUNCATE, "%llu:%02llu", elapsed / 60, elapsed % 60); char speed_str[24]; diff --git a/teraterm/teraterm/sendmem.cpp b/teraterm/teraterm/sendmem.cpp index 615299de2..465b609f5 100644 --- a/teraterm/teraterm/sendmem.cpp +++ b/teraterm/teraterm/sendmem.cpp @@ -82,7 +82,7 @@ typedef struct SendMemTag { size_t send_left; size_t send_index; BOOL waited; - DWORD last_send_tick; + ULONGLONG last_send_tick; // CFileTransLiteDlg *dlg; class SendMemDlgObserver *dlg_observer; @@ -377,7 +377,7 @@ void SendMemContinuously(void) } if (p->waited) { - if (GetTickCount() - p->last_send_tick < p->delay_tick) { + if (GetTickCount64() - p->last_send_tick < p->delay_tick) { // ウエイトする return; } @@ -518,7 +518,7 @@ void SendMemContinuously(void) if (p->send_left != 0 && need_delay) { // waitに入る p->waited = TRUE; - p->last_send_tick = GetTickCount(); + p->last_send_tick = GetTickCount64(); // タイマーはidleを動作させるために使用している SetTimer(p->hWnd, p->timer_id, p->delay_tick, NULL); } diff --git a/teraterm/teraterm/teraterm.cpp b/teraterm/teraterm/teraterm.cpp index 49c118b0a..902af9ff3 100644 --- a/teraterm/teraterm/teraterm.cpp +++ b/teraterm/teraterm/teraterm.cpp @@ -398,7 +398,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, MSG msg; for (;;) { // idle状態でメッセージがない場合 - DWORD idle_enter_tick = GetTickCount(); + ULONGLONG idle_enter_tick = GetTickCount64(); BOOL sleep_enable = FALSE; for (;;) { // idle処理を行う @@ -412,7 +412,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, if (!continue_idle) { // FALSEが戻ってきたらidle処理は不要 if (!sleep_enable) { - if (GetTickCount() - idle_enter_tick > 20) { + if (GetTickCount64() - idle_enter_tick > 20) { // 20ms以上idle処理不要だったらSleep()を入れる sleep_enable = TRUE; } @@ -423,7 +423,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, lCount = 0; } else { - idle_enter_tick = GetTickCount(); + idle_enter_tick = GetTickCount64(); sleep_enable = FALSE; } diff --git a/teraterm/teraterm/vtterm.c b/teraterm/teraterm/vtterm.c index bb1a8722e..dd41bd93f 100644 --- a/teraterm/teraterm/vtterm.c +++ b/teraterm/teraterm/vtterm.c @@ -196,8 +196,8 @@ static int FilterTop, FilterBottom, FilterLeft, FilterRight; static BOOL SavedIMEstatus; /* Beep over-used */ -static DWORD BeepStartTime = 0; -static DWORD BeepSuppressTime = 0; +static ULONGLONG BeepStartTime = 0; +static ULONGLONG BeepSuppressTime = 0; static DWORD BeepOverUsedCount = 0; static _locale_t CLocale = NULL; @@ -345,7 +345,7 @@ void ResetTerminal() /*reset variables but don't update screen */ LastPutCharacter = 0; // Beep over-used - BeepStartTime = GetTickCount(); + BeepStartTime = GetTickCount64(); BeepSuppressTime = BeepStartTime - ts.BeepSuppressTime * 1000; BeepStartTime -= (ts.BeepOverUsedTime * 1000); BeepOverUsedCount = ts.BeepOverUsedCount; @@ -5398,8 +5398,8 @@ int VTParse() while ((c>0) && (ChangeEmu==0)) { #if defined(DEBUG_DUMP_INPUTCODE) { - static DWORD prev_tick; - DWORD now = GetTickCount(); + static ULONGLONG prev_tick; + ULONGLONG now = GetTickCount64(); if (prev_tick == 0) prev_tick = now; if (now - prev_tick > 1*1000) { printf("\n"); @@ -5777,9 +5777,9 @@ static void VisualBell(void) static void RingBell(int type) { - DWORD now; + ULONGLONG now; - now = GetTickCount(); + now = GetTickCount64(); if (now - BeepSuppressTime < ts.BeepSuppressTime * 1000) { BeepSuppressTime = now; } diff --git a/teraterm/teraterm/vtwin.cpp b/teraterm/teraterm/vtwin.cpp index 00e7586cf..74722f60d 100644 --- a/teraterm/teraterm/vtwin.cpp +++ b/teraterm/teraterm/vtwin.cpp @@ -2207,7 +2207,7 @@ void CVTWindow::OnKeyDown(WPARAM nChar, UINT nRepCnt, UINT nFlags) #if UNICODE_DEBUG if (UnicodeDebugParam.CodePopupEnable) { - const DWORD now = GetTickCount(); + const ULONGLONG now = GetTickCount64(); switch(CtrlKeyState) { case 0: if (nChar == UnicodeDebugParam.CodePopupKey1) { diff --git a/teraterm/teraterm/vtwin.h b/teraterm/teraterm/vtwin.h index 05a5ee442..70a928df5 100644 --- a/teraterm/teraterm/vtwin.h +++ b/teraterm/teraterm/vtwin.h @@ -72,7 +72,7 @@ class CVTWindow : public TTCFrameWnd #if UNICODE_DEBUG TipWin *TipWinCodeDebug; int CtrlKeyState; // 0:開始/1:押す/2:離す/3:押す(表示状態) - DWORD CtrlKeyDownTick; // 最初に押したtick + ULONGLONG CtrlKeyDownTick; // 最初に押したtick #endif // TipWin diff --git a/teraterm/ttpfile/bplus.c b/teraterm/ttpfile/bplus.c index f85866fda..c63f1e3ef 100644 --- a/teraterm/ttpfile/bplus.c +++ b/teraterm/ttpfile/bplus.c @@ -80,7 +80,7 @@ typedef struct { int ProgStat; - DWORD StartTime; + ULONGLONG StartTime; DWORD FileMtime; @@ -162,7 +162,7 @@ static BOOL BPInit(TProto *pv, PComVar cv, PTTSet ts) fv->InfoOp->SetDlgProtoText(fv, "B-Plus"); fv->InfoOp->InitDlgProgress(fv, &bv->ProgStat); - bv->StartTime = GetTickCount(); + bv->StartTime = GetTickCount64(); /* file name, file size */ if (bv->BPMode==IdBPSend) @@ -610,7 +610,7 @@ static BOOL FTCreateFile(PBPVar bv) if (bv->ProgStat != -1) { bv->ProgStat = 0; } - bv->StartTime = GetTickCount(); + bv->StartTime = GetTickCount64(); return TRUE; } diff --git a/teraterm/ttpfile/kermit.c b/teraterm/ttpfile/kermit.c index bda13abe4..0b50977e2 100644 --- a/teraterm/ttpfile/kermit.c +++ b/teraterm/ttpfile/kermit.c @@ -79,7 +79,7 @@ typedef struct { int ProgStat; - DWORD StartTime; + ULONGLONG StartTime; DWORD FileMtime; @@ -1086,7 +1086,7 @@ static BOOL KmtSendNextFile(PKmtVar kv) kv->ByteCount = 0; kv->ProgStat = 0; - kv->StartTime = GetTickCount(); + kv->StartTime = GetTickCount64(); fv->InfoOp->SetDlgProtoFileName(fv, kv->FullName); fv->InfoOp->SetDlgByteCount(fv, kv->ByteCount); @@ -1191,7 +1191,7 @@ static BOOL KmtInit(TProto *pv, PComVar cv, PTTSet ts) if (kv->KmtMode == IdKmtSend) { fv->InfoOp->InitDlgProgress(fv, &kv->ProgStat); - kv->StartTime = GetTickCount(); + kv->StartTime = GetTickCount64(); } else { kv->ProgStat = -1; @@ -1347,7 +1347,7 @@ static BOOL FTCreateFile(PKmtVar kv) if (kv->ProgStat != -1) { kv->ProgStat = 0; } - kv->StartTime = GetTickCount(); + kv->StartTime = GetTickCount64(); return TRUE; } diff --git a/teraterm/ttpfile/quickvan.c b/teraterm/ttpfile/quickvan.c index 1b23bc9d4..df3ff364c 100644 --- a/teraterm/ttpfile/quickvan.c +++ b/teraterm/ttpfile/quickvan.c @@ -65,7 +65,7 @@ typedef struct { int ProgStat; - DWORD StartTime; + ULONGLONG StartTime; DWORD FileMtime; @@ -192,7 +192,7 @@ static BOOL QVInit(TProto *pv, PComVar cv, PTTSet ts) fv->InfoOp->SetDlgProtoText(fv, "Quick-VAN"); fv->InfoOp->InitDlgProgress(fv, &qv->ProgStat); - qv->StartTime = GetTickCount(); + qv->StartTime = GetTickCount64(); qv->SeqNum = 0; qv->FileNum = 0; @@ -470,7 +470,7 @@ static BOOL FTCreateFile(PQVVar qv) if (qv->ProgStat != -1) { qv->ProgStat = 0; } - qv->StartTime = GetTickCount(); + qv->StartTime = GetTickCount64(); return TRUE; } @@ -930,7 +930,7 @@ static void QVSendVFILE(PQVVar qv) /* file no. */ qv->FileNum++; qv->ProgStat = 0; - qv->StartTime = GetTickCount(); + qv->StartTime = GetTickCount64(); i = 3; QVPutNum2(qv,qv->FileNum,&i); /* file name */ diff --git a/teraterm/ttpfile/raw.c b/teraterm/ttpfile/raw.c index 4617703c6..e55c05a82 100644 --- a/teraterm/ttpfile/raw.c +++ b/teraterm/ttpfile/raw.c @@ -38,7 +38,7 @@ typedef struct { const char *FullName; // Windows上のファイル名 UTF-8 BOOL FileOpen; LONG ByteCount; - DWORD StartTime; + ULONGLONG StartTime; PComVar cv; enum { STATE_FLUSH, // 処理開始時に受信データを捨てる @@ -148,12 +148,12 @@ static BOOL RawReadPacket(void *arg) PComVar cv = rv->cv; BYTE Buff[InBuffSize]; int BuffCount; - static DWORD prev_elapsed; - DWORD elapsed; + static ULONGLONG prev_elapsed; + ULONGLONG elapsed; if (cv->InBuffCount > 0) { if (rv->StartTime == 0) { - rv->StartTime = GetTickCount(); + rv->StartTime = GetTickCount64(); prev_elapsed = rv->StartTime; fv->InfoOp->SetDlgPacketNum(fv, 1); } @@ -166,7 +166,7 @@ static BOOL RawReadPacket(void *arg) LeaveCriticalSection(&cv->InBuff_lock); file->WriteFile(file, Buff, BuffCount); rv->ByteCount += BuffCount; - elapsed = (GetTickCount() - prev_elapsed) / 250; + elapsed = (GetTickCount64() - prev_elapsed) / 250; if (elapsed != prev_elapsed) { prev_elapsed = elapsed; fv->InfoOp->SetDlgByteCount(fv, rv->ByteCount); diff --git a/teraterm/ttpfile/xmodem.c b/teraterm/ttpfile/xmodem.c index 3c9ebddbb..4d9d2d4f5 100644 --- a/teraterm/ttpfile/xmodem.c +++ b/teraterm/ttpfile/xmodem.c @@ -80,7 +80,7 @@ typedef struct { int ProgStat; - DWORD StartTime; + ULONGLONG StartTime; DWORD FileMtime; @@ -299,7 +299,7 @@ static BOOL XInit(TProto *pv, PComVar cv, PTTSet ts) xv->ProgStat = -1; } fv->InfoOp->SetDlgProtoFileName(fv, xv->FullName); - xv->StartTime = GetTickCount(); + xv->StartTime = GetTickCount64(); xv->PktNumOffset = 0; xv->PktNum = 0; diff --git a/teraterm/ttpfile/ymodem.c b/teraterm/ttpfile/ymodem.c index 013c53981..4cd412e8f 100644 --- a/teraterm/ttpfile/ymodem.c +++ b/teraterm/ttpfile/ymodem.c @@ -72,7 +72,7 @@ typedef struct { int ProgStat; - DWORD StartTime; + ULONGLONG StartTime; DWORD FileMtime; @@ -341,7 +341,7 @@ static void initialize_file_info(PYVar yv) } else { yv->ProgStat = -1; } - yv->StartTime = GetTickCount(); + yv->StartTime = GetTickCount64(); fv->InfoOp->SetDlgProtoFileName(fv, yv->FullName); yv->PktNumOffset = 0; @@ -501,7 +501,7 @@ static BOOL FTCreateFile(PYVar yv) if (yv->ProgStat != -1) { yv->ProgStat = 0; } - yv->StartTime = GetTickCount(); + yv->StartTime = GetTickCount64(); return TRUE; } diff --git a/teraterm/ttpfile/zmodem.c b/teraterm/ttpfile/zmodem.c index 28d802a16..fb587b778 100644 --- a/teraterm/ttpfile/zmodem.c +++ b/teraterm/ttpfile/zmodem.c @@ -116,7 +116,7 @@ typedef struct { int ProgStat; - DWORD StartTime; + ULONGLONG StartTime; DWORD FileMtime; @@ -640,7 +640,7 @@ static void ZSendFileDat(PZVar zv) zv->ByteCount = 0; zv->ProgStat = 0; - zv->StartTime = GetTickCount(); + zv->StartTime = GetTickCount64(); fv->InfoOp->SetDlgByteCount(fv, zv->ByteCount); fv->InfoOp->SetDlgPercent(fv, zv->ByteCount, zv->FileSize, &zv->ProgStat); fv->InfoOp->SetDlgTime(fv, zv->StartTime, zv->ByteCount); @@ -746,7 +746,7 @@ static BOOL ZInit(TProto *pv, PComVar cv, PTTSet ts) fv->InfoOp->SetDlgProtoText(fv, "ZMODEM"); fv->InfoOp->InitDlgProgress(fv, &zv->ProgStat); - zv->StartTime = GetTickCount(); + zv->StartTime = GetTickCount64(); zv->FileSize = 0; zv->FileMtime = 0; @@ -1107,7 +1107,7 @@ static BOOL FTCreateFile(PZVar zv) if (zv->ProgStat != -1) { zv->ProgStat = 0; } - zv->StartTime = GetTickCount(); + zv->StartTime = GetTickCount64(); return TRUE; } @@ -1169,7 +1169,7 @@ static BOOL ZParseFile(PZVar zv) if (zv->FileSize > 0) fv->InfoOp->SetDlgPercent(fv, 0, zv->FileSize, &zv->ProgStat); - fv->InfoOp->SetDlgTime(fv, GetTickCount(), zv->ByteCount); + fv->InfoOp->SetDlgTime(fv, GetTickCount64(), zv->ByteCount); /* set timeout for data */ fv->FTSetTimeOut(fv, zv->TimeOut); diff --git a/teraterm/ttpmacro/ttl.cpp b/teraterm/ttpmacro/ttl.cpp index 8c3d6d8fa..a5227d699 100644 --- a/teraterm/ttpmacro/ttl.cpp +++ b/teraterm/ttpmacro/ttl.cpp @@ -81,7 +81,7 @@ static int EndIfFlag; static HWND HMainWin; // Timeout static DWORD TimeLimit; -static DWORD TimeStart; +static ULONGLONG TimeStart; // for 'WaitEvent' command static int WakeupCondition; @@ -1577,7 +1577,7 @@ static WORD TTLFileLock(void) DWORD timeout; int result; BOOL ret; - DWORD dwStart; + ULONGLONG dwStart; Err = 0; GetIntVal(&fhi,&Err); @@ -1592,7 +1592,7 @@ static WORD TTLFileLock(void) timeout = timeoutI * 1000; result = 1; // error - dwStart = GetTickCount(); + dwStart = GetTickCount64(); do { ret = LockFile(FH, 0, 0, (DWORD)-1, (DWORD)-1); if (ret != 0) { // ロック成功 @@ -1600,7 +1600,7 @@ static WORD TTLFileLock(void) break; } Sleep(1); - } while (GetTickCount() - dwStart < (timeout*1000)); + } while (GetTickCount64() - dwStart < (timeout*1000)); SetResult(result); return Err; @@ -3446,7 +3446,7 @@ static WORD TTLPause(void) { TTLStatus = IdTTLPause; TimeLimit = (DWORD)(TimeOut*1000); - TimeStart = GetTickCount(); + TimeStart = GetTickCount64(); SetTimer(HMainWin, IdTimeOutTimer, TIMEOUT_TIMER_MS, NULL); } return Err; @@ -3548,7 +3548,7 @@ static WORD TTLRecvLn(void) if (TimeOut>0) { TimeLimit = (DWORD)TimeOut; - TimeStart = GetTickCount(); + TimeStart = GetTickCount64(); SetTimer(HMainWin, IdTimeOutTimer, TIMEOUT_TIMER_MS, NULL); } @@ -4408,7 +4408,8 @@ void TTLShowMINIMIZE(void) static WORD TTLSprintf(int getvar) { TStrVal Fmt; - int Num, NumWidth, NumPrecision; + int Num; + int NumWidth, NumPrecision; TStrVal Str; WORD Err = 0, TmpErr; TVarId VarId; @@ -5460,21 +5461,29 @@ static WORD TTLUnlink(void) static WORD TTLUptime(void) { WORD Err; - TVarId VarId; - DWORD tick; + TVarId VarId, VarId2; + BOOL twoArgs; + ULONGLONG tick; Err = 0; - GetIntVar(&VarId,&Err); - if ((Err==0) && (GetFirstChar()!=0)) - Err = ErrSyntax; - if (Err!=0) return Err; + GetIntVar(&VarId, &Err); + if (Err != 0) return Err; - // Windows OSが起動してからの経過時間(ミリ秒)を取得する。ただし、49日を経過すると、0に戻る。 - // GetTickCount64() API(Vista以降)を使うと、オーバーフローしなくなるが、そもそもTera Termでは - // 64bit変数をサポートしていないので、意味がない。 - tick = GetTickCount(); + twoArgs = CheckParameterGiven(); + if (twoArgs) { + GetIntVar(&VarId2, &Err); + } + if ((Err == 0) && (GetFirstChar() != 0)) + Err = ErrSyntax; + if (Err != 0) return Err; - SetIntVal(VarId, tick); + tick = GetTickCount64(); + if (twoArgs) { + SetIntVal(VarId, (int)(tick / 1000)); + SetIntVal(VarId2, (int)(tick % 1000)); + } else { + SetIntVal(VarId, (int)tick); + } return Err; } @@ -5487,7 +5496,8 @@ static WORD TTLWait(BOOL Ln) WORD Err; TVariableType ValType; TVarId VarId; - int i, Val; + int i; + int Val; int TimeOut; ClearWait(); @@ -5533,7 +5543,7 @@ static WORD TTLWait(BOOL Ln) if (TimeOut>0) { TimeLimit = (DWORD)TimeOut; - TimeStart = GetTickCount(); + TimeStart = GetTickCount64(); SetTimer(HMainWin, IdTimeOutTimer, TIMEOUT_TIMER_MS, NULL); } } @@ -5603,7 +5613,7 @@ static WORD TTLWaitEvent(void) if (TimeOut>0) { TimeLimit = (DWORD)TimeOut; - TimeStart = GetTickCount(); + TimeStart = GetTickCount64(); SetTimer(HMainWin, IdTimeOutTimer, TIMEOUT_TIMER_MS, NULL); } @@ -5645,7 +5655,7 @@ static WORD TTLWaitN(void) if (TimeOut>0) { TimeLimit = (DWORD)TimeOut; - TimeStart = GetTickCount(); + TimeStart = GetTickCount64(); SetTimer(HMainWin, IdTimeOutTimer, TIMEOUT_TIMER_MS, NULL); } @@ -5685,7 +5695,7 @@ static WORD TTLWaitRecv(void) if (TimeOut>0) { TimeLimit = (DWORD)TimeOut; - TimeStart = GetTickCount(); + TimeStart = GetTickCount64(); SetTimer(HMainWin, IdTimeOutTimer, TIMEOUT_TIMER_MS, NULL); } return Err; @@ -6439,8 +6449,9 @@ static int ExecCmnd(void) } if (Err) return Err; if (VarType==ValType) { - switch (ValType) { - case TypInteger: SetIntVal(VarId,Val); break; + switch (VarType) { + case TypInteger: + SetIntVal(VarId,Val); break; case TypString: if (StrConst) SetStrVal(VarId,Str); @@ -6559,17 +6570,8 @@ void SetResult(int ResultCode) BOOL CheckTimeout() { - BOOL ret; - DWORD TimeUp = (TimeStart+TimeLimit); - - if (TimeUp > TimeStart) { - ret = (GetTickCount() > TimeUp); - } - else { // for DWORD overflow (49.7 days) - DWORD TimeTmp = GetTickCount(); - ret = (TimeUp < TimeTmp && TimeTmp >= TimeStart); - } - return ret; + ULONGLONG TimeUp = TimeStart + TimeLimit; + return (GetTickCount64() > TimeUp); } BOOL TestWakeup(int Wakeup) diff --git a/teraterm/ttpmacro/ttmenc.c b/teraterm/ttpmacro/ttmenc.c index ff36bcc43..ff524f339 100644 --- a/teraterm/ttpmacro/ttmenc.c +++ b/teraterm/ttpmacro/ttmenc.c @@ -90,7 +90,7 @@ void Encrypt(const char *InStr, PCHAR OutStr) if (InStr[0]==0) { return; } - srand(LOWORD(GetTickCount())); + srand((unsigned)GetTickCount64()); r = (BYTE)(rand() & 0x3f); r2 = (~r) & 0x3f; OutStr[0] = r; diff --git a/tests/uptime.ttl b/tests/uptime.ttl new file mode 100644 index 000000000..89cbcfad0 --- /dev/null +++ b/tests/uptime.ttl @@ -0,0 +1,31 @@ +; uptime コマンドのテスト(接続不要) +; +; 使い方: Tera Term マクロとして単体で実行する(接続不要) + +uptime var +uptime sec msec + +day = var / 86400000 +var = var % 86400000 +hour = var / 3600000 +var = var % 3600000 +min = var / 60000 +var = var % 60000 +sec = var / 1000 + +sprintf2 str "System Up Time: %d Days, %d Hours, %d Minutes, %d Seconds" day hour min sec +messagebox str "uptime" + + +day = sec / 86400 +var = sec % 86400 +hour = var / 3600 +var = var % 3600 +min = var / 60 +sec = var % 60 + + +sprintf2 str "System Up Time: %d Days, %d Hours, %d Minutes, %d Seconds" day hour min sec +messagebox str "uptime" + +end diff --git a/tests/uptime_test.ttl b/tests/uptime_test.ttl new file mode 100644 index 000000000..20719a12b --- /dev/null +++ b/tests/uptime_test.ttl @@ -0,0 +1,38 @@ +; uptime コマンドのテスト(接続不要) +; +; GetTickCount64() への置き換え後、uptime コマンドが +; 正常動作することを確認する。 +; uptime は OS 起動からの経過時間(ミリ秒)の下位 32 ビットを +; int 変数に格納する。 +; +; 使い方: Tera Term マクロとして単体で実行する(接続不要) + +uptime tick_start + +; 3 秒間 pause する +pause 3 + +uptime tick_end + +; 経過時間を計算(ミリ秒) +; 注意: 32bit のため 49.7 日でオーバーフローするが、 +; 短時間の計測では影響なし +elapsed = tick_end - tick_start + +; 3000ms ±500ms 以内であることを確認 +if elapsed < 2500 then + sprintf2 msg 'NG: pause が早すぎる (%d ms)' elapsed + messagebox msg 'uptime test' + end +endif + +if elapsed > 3500 then + sprintf2 msg 'NG: pause が遅すぎる (%d ms)' elapsed + messagebox msg 'uptime test' + end +endif + +sprintf2 msg 'OK: pause が正常に完了した (%d ms)' elapsed +messagebox msg 'uptime test' + +end diff --git a/tests/wait_timeout_connected.ttl b/tests/wait_timeout_connected.ttl new file mode 100644 index 000000000..af0a57ac9 --- /dev/null +++ b/tests/wait_timeout_connected.ttl @@ -0,0 +1,43 @@ +; wait コマンドのタイムアウトテスト(接続必要) +; +; GetTickCount64() への置き換え後、wait コマンドのタイムアウトが +; 正常動作することを確認する。 +; OS 起動から 49.7 日以上経過した環境でも正しく動作することを想定。 +; +; 使い方: SSH/Telnet 等でホストに接続した状態で実行する。 + +timeout = 3 + +uptime tick_start + +; 出現しない文字列を wait で待ち、3 秒でタイムアウトさせる +wait 'XXXXXXXXXX_NEVER_APPEAR_XXXXXXXXXX' + +uptime tick_end + +; タイムアウトで抜けたことを確認 (result == 1) +if result <> 1 then + messagebox 'NG: wait がタイムアウトしなかった' 'wait timeout test' + end +endif + +; 経過時間を計算(ミリ秒) +elapsed = tick_end - tick_start + +; 3000ms ±500ms 以内であることを確認 +if elapsed < 2500 then + sprintf2 msg 'NG: タイムアウトが早すぎる (%d ms)' elapsed + messagebox msg 'wait timeout test' + end +endif + +if elapsed > 3500 then + sprintf2 msg 'NG: タイムアウトが遅すぎる (%d ms)' elapsed + messagebox msg 'wait timeout test' + end +endif + +sprintf2 msg 'OK: wait が正常にタイムアウトした (%d ms)' elapsed +messagebox msg 'wait timeout test' + +end diff --git a/ttssh2/ttxssh/ssh.c b/ttssh2/ttxssh/ssh.c index a898e8f38..c8eff7300 100644 --- a/ttssh2/ttxssh/ssh.c +++ b/ttssh2/ttxssh/ssh.c @@ -9039,24 +9039,24 @@ static INT_PTR CALLBACK ssh_scp_dlg_thread_proc(HWND hWnd, UINT msg, WPARAM wp, SendDlgItemMessage(hWnd, IDC_PROGBAR, PBM_SETPOS, (WPARAM)c->scp.ProgStat, 0); } - int elapsed = (GetTickCount() - c->scp.stime) / 1000; + ULONGLONG elapsed = (GetTickCount64() - c->scp.stime) / 1000; if (elapsed > c->scp.prev_elapsed) { if (elapsed > 2) { rate = (int)(transfered / elapsed); if (rate < 1200) { - _snprintf_s(s, sizeof(s), _TRUNCATE, "%d:%02d (%d %s)", elapsed / 60, elapsed % 60, rate, "Bytes/s"); + _snprintf_s(s, sizeof(s), _TRUNCATE, "%llu:%02llu (%d %s)", elapsed / 60, elapsed % 60, rate, "Bytes/s"); } else if (rate < 1200000) { - _snprintf_s(s, sizeof(s), _TRUNCATE, "%d:%02d (%d.%02d %s)", elapsed / 60, elapsed % 60, rate / 1000, rate / 10 % 100, "KBytes/s"); + _snprintf_s(s, sizeof(s), _TRUNCATE, "%llu:%02llu (%d.%02d %s)", elapsed / 60, elapsed % 60, rate / 1000, rate / 10 % 100, "KBytes/s"); } else { - _snprintf_s(s, sizeof(s), _TRUNCATE, "%d:%02d (%d.%02d %s)", elapsed / 60, elapsed % 60, rate / (1000 * 1000), rate / 10000 % 100, "MBytes/s"); + _snprintf_s(s, sizeof(s), _TRUNCATE, "%llu:%02llu (%d.%02d %s)", elapsed / 60, elapsed % 60, rate / (1000 * 1000), rate / 10000 % 100, "MBytes/s"); } } else { - _snprintf_s(s, sizeof(s), _TRUNCATE, "%d:%02d", elapsed / 60, elapsed % 60); + _snprintf_s(s, sizeof(s), _TRUNCATE, "%llu:%02llu", elapsed / 60, elapsed % 60); } SendDlgItemMessage(hWnd, IDC_PROGTIME, WM_SETTEXT, 0, (LPARAM)s); c->scp.prev_elapsed = elapsed; } - c->scp.ProcessedTime = GetTickCount(); + c->scp.ProcessedTime = GetTickCount64(); return FALSE; case WM_COMMAND: @@ -9137,7 +9137,7 @@ static unsigned __stdcall ssh_scp_dlg_thread(void *p) c->scp.prev_elapsed = 0; c->scp.filesndsize = 0; c->scp.canceled = FALSE; - c->scp.stime = GetTickCount(); + c->scp.stime = GetTickCount64(); c->scp.ProcessedTime = c->scp.stime; SetWindowLongPtr(hDlgWnd, GWLP_USERDATA, (LONG_PTR)c); SetTimer(hDlgWnd, c->self_id, SCPDLG_UPDATE_INTERVAL, NULL); @@ -9174,7 +9174,7 @@ static HANDLE start_ssh_scp_dlg_thread(Channel_t *c) // スレッド起動待ち WaitForSingleObject(c->scp.ScpStartThreadEvent, 5000 /*msec*/); ResetEvent(c->scp.ScpStartThreadEvent); - c->scp.stime = GetTickCount(); + c->scp.stime = GetTickCount64(); return thread; } @@ -9241,7 +9241,7 @@ static unsigned __stdcall ssh_scp_thread(void *p) c->scp.filesndsize += ret; #if 1 // 高負荷対策 // 進捗ダイアログの描画が間に合わない場合は、負荷が下がるまで待つ - while (GetTickCount() - c->scp.ProcessedTime > SCPDLG_UPDATE_INTERVAL * 3) { + while (GetTickCount64() - c->scp.ProcessedTime > SCPDLG_UPDATE_INTERVAL * 3) { Sleep(20); if (pvar == NULL || pvar->socket == INVALID_SOCKET || c->scp.state == SCP_CLOSING || c->used == 0) { goto cancel_abort; @@ -9405,7 +9405,7 @@ static unsigned __stdcall ssh_scp_receive_thread(void *p) } #if 1 // 高負荷対策 // 進捗ダイアログの描画が間に合わない場合は、負荷が下がるまで待つ - while (GetTickCount() - c->scp.ProcessedTime > SCPDLG_UPDATE_INTERVAL * 3) { + while (GetTickCount64() - c->scp.ProcessedTime > SCPDLG_UPDATE_INTERVAL * 3) { Sleep(20); if (pvar == NULL || pvar->socket == INVALID_SOCKET || c->scp.state == SCP_CLOSING || c->used == 0) { goto cancel_abort; diff --git a/ttssh2/ttxssh/ssh.h b/ttssh2/ttxssh/ssh.h index cb027b041..adfe594b8 100644 --- a/ttssh2/ttxssh/ssh.h +++ b/ttssh2/ttxssh/ssh.h @@ -552,10 +552,10 @@ typedef struct scp { PTInstVar pvar; HANDLE ScpStartThreadEvent; BOOL canceled; - DWORD stime; - int prev_elapsed; + ULONGLONG stime; + ULONGLONG prev_elapsed; int ProgStat; - DWORD ProcessedTime; + ULONGLONG ProcessedTime; // for receiving file long long filetotalsize; long long filercvsize; diff --git a/ttssh2/ttxssh/ttxssh.c b/ttssh2/ttxssh/ttxssh.c index b2f1421ee..867cfa751 100644 --- a/ttssh2/ttxssh/ttxssh.c +++ b/ttssh2/ttxssh/ttxssh.c @@ -604,7 +604,7 @@ static unsigned short find_local_port(PTInstVar pvar) if we're unlucky). They do not need to be (and are not) cryptographically strong. */ - srand((unsigned) GetTickCount()); + srand((unsigned)GetTickCount64()); for (tries = 20; tries > 0; tries--) { memset(&hints, 0, sizeof(hints)); From 66fb97a4f04fc59b18969f896ec10d1542f18198 Mon Sep 17 00:00:00 2001 From: Masaru Tsuchiyama Date: Fri, 12 Jun 2026 14:14:48 +0900 Subject: [PATCH 2/3] =?UTF-8?q?=E5=A4=89=E6=95=B0=E3=81=AE=E9=87=8D?= =?UTF-8?q?=E8=A4=87=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/uptime.ttl | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/uptime.ttl b/tests/uptime.ttl index 89cbcfad0..45eea6527 100644 --- a/tests/uptime.ttl +++ b/tests/uptime.ttl @@ -3,7 +3,7 @@ ; 使い方: Tera Term マクロとして単体で実行する(接続不要) uptime var -uptime sec msec +uptime secvar msecvar day = var / 86400000 var = var % 86400000 @@ -17,8 +17,8 @@ sprintf2 str "System Up Time: %d Days, %d Hours, %d Minutes, %d Seconds" day hou messagebox str "uptime" -day = sec / 86400 -var = sec % 86400 +day = secvar / 86400 +var = secvar % 86400 hour = var / 3600 var = var % 3600 min = var / 60 From 31fd668456d6e00b6d847462b296feed6b8c634f Mon Sep 17 00:00:00 2001 From: Masaru Tsuchiyama Date: Fri, 12 Jun 2026 14:34:05 +0900 Subject: [PATCH 3/3] =?UTF-8?q?doc:=20uptime=20=E3=82=B3=E3=83=9E=E3=83=B3?= =?UTF-8?q?=E3=83=89=E3=81=AE=202=20=E5=BC=95=E6=95=B0=E5=BD=A2=E5=BC=8F?= =?UTF-8?q?=E3=82=92=E3=83=89=E3=82=AD=E3=83=A5=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=81=AB=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 4.6 --- doc/en/html/macro/command/uptime.html | 200 +++++++++++++------------- doc/ja/html/macro/command/uptime.html | 196 ++++++++++++------------- 2 files changed, 198 insertions(+), 198 deletions(-) diff --git a/doc/en/html/macro/command/uptime.html b/doc/en/html/macro/command/uptime.html index 0083d24dc..46fe47000 100644 --- a/doc/en/html/macro/command/uptime.html +++ b/doc/en/html/macro/command/uptime.html @@ -1,100 +1,100 @@ - - - - - uptime - - - - - - - -

uptime

- -

-Gets System Up Time. (version 4.81 or later) -

- -

1) Format 1

- -
-uptime <intvar>
-
- -

2) Format 2

- -
-uptime <secvar> <msecvar>
-
- -

Remarks

- -

Format 1

- -

-Retrieves the number of milliseconds that have elapsed since the Windows OS was started, -and then stores the value into the <intvar> variable. -

- -

-The time wraps around to zero if the system is run continuously for 49.7 days. -

- -

Format 2

- -

-Retrieves the number of milliseconds that have elapsed since the Windows OS was started -using GetTickCount64(), and then stores the following values: -

- -
-
<secvar>
-
Windows OS uptime in seconds (GetTickCount64() / 1000)
-
<msecvar>
-
Sub-second portion of the uptime in milliseconds (GetTickCount64() % 1000)
-
- -

-Both <secvar> and <msecvar> must be integer variables. -

- - -

Example

- -
-; Format 1: How to get the uptime in Windows
-uptime var
-day = var / 86400000
-var = var % 86400000
-hour = var / 3600000
-var = var % 3600000
-min = var / 60000
-var = var % 60000
-sec = var / 1000
-
-sprintf2 str "System Up Time: %d Days, %d Hours, %d Minutes, %d Seconds" day hour min sec
-messagebox str "uptime"
-
- -
-uptime varstart
-
-; do something...
-
-uptime varend
-diff = varend - varstart
-sprintf2 str "MACRO running time: %d msec" diff
-messagebox str "running time"
-
- -
-; Format 2: Get uptime as seconds and milliseconds
-uptime sec msec
-sprintf2 str "System Up Time: %d.%03d seconds" sec msec
-messagebox str "uptime"
-
- - - + + + + + uptime + + + + + + + +

uptime

+ +

+Gets System Up Time. (version 4.81 or later) +

+ +

1) Format 1

+ +
+uptime <intvar>
+
+ +

2) Format 2

+ +
+uptime <secvar> <msecvar>
+
+ +

Remarks

+ +

Format 1

+ +

+Retrieves the number of milliseconds that have elapsed since the Windows OS was started, +and then stores the value into the <intvar> variable. +

+ +

+The time wraps around to zero if the system is run continuously for 49.7 days. +

+ +

Format 2

+ +

+Retrieves the number of milliseconds that have elapsed since the Windows OS was started +using GetTickCount64(), and then stores the following values: +

+ +
+
<secvar>
+
Windows OS uptime in seconds (GetTickCount64() / 1000)
+
<msecvar>
+
Sub-second portion of the uptime in milliseconds (GetTickCount64() % 1000)
+
+ +

+Both <secvar> and <msecvar> must be integer variables. +

+ + +

Example

+ +
+; Format 1: How to get the uptime in Windows
+uptime var
+day = var / 86400000
+var = var % 86400000
+hour = var / 3600000
+var = var % 3600000
+min = var / 60000
+var = var % 60000
+sec = var / 1000
+
+sprintf2 str "System Up Time: %d Days, %d Hours, %d Minutes, %d Seconds" day hour min sec
+messagebox str "uptime"
+
+ +
+uptime varstart
+
+; do something...
+
+uptime varend
+diff = varend - varstart
+sprintf2 str "MACRO running time: %d msec" diff
+messagebox str "running time"
+
+ +
+; Format 2: Get uptime as seconds and milliseconds
+uptime sec msec
+sprintf2 str "System Up Time: %d.%03d seconds" sec msec
+messagebox str "uptime"
+
+ + + diff --git a/doc/ja/html/macro/command/uptime.html b/doc/ja/html/macro/command/uptime.html index c405d6a33..6b0ca3279 100644 --- a/doc/ja/html/macro/command/uptime.html +++ b/doc/ja/html/macro/command/uptime.html @@ -1,98 +1,98 @@ - - - - - uptime - - - - - - - -

uptime

- -

-OS̉ғԂ擾B(o[W4.81ȍ~) -

- -

1) `1

- -
-uptime <intvar>
-
- -

2) `2

- -
-uptime <secvar> <msecvar>
-
- -

- -

`1

- -

-Windows OS̉ғԁi~bj <intvar> Ɋi[B -

- -

-ғԂ49o߂ƁA0ɖ߂B -

- -

`2

- -

-GetTickCount64() gWindows OS̉ғԂ擾AL̒li[B -

- -
-
<secvar>
-
Windows OS̉ғԁibPʁj(GetTickCount64() / 1000)
-
<msecvar>
-
ғԂ1b̕i~bPʁj(GetTickCount64() % 1000)
-
- -

-<secvar> <msecvar> ͂Ƃɐ^ϐłȂ΂ȂȂB -

- - -

- -
-; `1: Windows̉ғԂ擾
-uptime var
-day = var / 86400000
-var = var % 86400000
-hour = var / 3600000
-var = var % 3600000
-min = var / 60000
-var = var % 60000
-sec = var / 1000
-
-sprintf2 str "System Up Time: %d Days, %d Hours, %d Minutes, %d Seconds" day hour min sec
-messagebox str "uptime"
-
- -
-uptime varstart
-
-; do something...
-
-uptime varend
-diff = varend - varstart
-sprintf2 str "MACRO running time: %d msec" diff
-messagebox str "running time"
-
- -
-; `2: ғԂbƃ~bŎ擾
-uptime sec msec
-sprintf2 str "System Up Time: %d.%03d seconds" sec msec
-messagebox str "uptime"
-
- - - + + + + + uptime + + + + + + + +

uptime

+ +

+OS̉ғԂ擾B(o[W4.81ȍ~) +

+ +

1) `1

+ +
+uptime <intvar>
+
+ +

2) `2

+ +
+uptime <secvar> <msecvar>
+
+ +

+ +

`1

+ +

+Windows OS̉ғԁi~bj <intvar> Ɋi[B +

+ +

+ғԂ49o߂ƁA0ɖ߂B +

+ +

`2

+ +

+GetTickCount64() gWindows OS̉ғԂ擾AL̒li[B +

+ +
+
<secvar>
+
Windows OS̉ғԁibPʁj(GetTickCount64() / 1000)
+
<msecvar>
+
ғԂ1b̕i~bPʁj(GetTickCount64() % 1000)
+
+ +

+<secvar> <msecvar> ͂Ƃɐ^ϐłȂ΂ȂȂB +

+ + +

+ +
+; `1: Windows̉ғԂ擾
+uptime var
+day = var / 86400000
+var = var % 86400000
+hour = var / 3600000
+var = var % 3600000
+min = var / 60000
+var = var % 60000
+sec = var / 1000
+
+sprintf2 str "System Up Time: %d Days, %d Hours, %d Minutes, %d Seconds" day hour min sec
+messagebox str "uptime"
+
+ +
+uptime varstart
+
+; do something...
+
+uptime varend
+diff = varend - varstart
+sprintf2 str "MACRO running time: %d msec" diff
+messagebox str "running time"
+
+ +
+; `2: ғԂbƃ~bŎ擾
+uptime sec msec
+sprintf2 str "System Up Time: %d.%03d seconds" sec msec
+messagebox str "uptime"
+
+ + +