Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /branches/ttcomtester/teraterm/teraterm/teraterm.cpp

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2659 - (hide annotations) (download) (as text)
Sun Feb 15 14:29:09 2009 UTC (15 years, 1 month ago) by yutakapon
Original Path: teraterm/trunk/teraterm/teraterm.cpp
File MIME type: text/x-c++src
File size: 5151 byte(s)
Windows95で起動できなかったようなので、以下のサイトのコードをそのまま流用した。

「かなり強引な方法で DLL のインポートを横取りする (未参照を防ぐ)」
http://jet2.u-abel.net/program/tips/forceimp.htm
http://jet2.u-abel.net/board.cgi?num=165

1 maya 2476 /* Tera Term
2     Copyright(C) 1994-1998 T. Teranishi
3     All rights reserved. */
4    
5     /* TERATERM.EXE, main */
6    
7     #include "stdafx.h"
8     #include "teraterm.h"
9     #include "tttypes.h"
10     #include "commlib.h"
11     #include "ttwinman.h"
12     #include "buffer.h"
13     #include "vtterm.h"
14     #include "vtwin.h"
15     #include "clipboar.h"
16     #include "ttftypes.h"
17     #include "filesys.h"
18     #include "telnet.h"
19     #include "tektypes.h"
20     #include "tekwin.h"
21     #include "ttdde.h"
22    
23     #include "teraapp.h"
24    
25     #ifdef _DEBUG
26     #define new DEBUG_NEW
27     #undef THIS_FILE
28     static char THIS_FILE[] = __FILE__;
29     #endif
30    
31     BEGIN_MESSAGE_MAP(CTeraApp, CWinApp)
32     //{{AFX_MSG_MAP(CTeraApp)
33     //}}AFX_MSG_MAP
34     END_MESSAGE_MAP()
35    
36     CTeraApp::CTeraApp()
37     {
38     }
39    
40     // CTeraApp instance
41     CTeraApp theApp;
42    
43 yutakapon 2658 // VS2005でビルドされたバイナリが Windows95 でも起動できるようにするために、
44     // IsDebuggerPresent()のシンボル定義を追加する。
45     // さらにWindows Sockets2.0のインストールも必要。
46 yutakapon 2659 //
47     // cf.http://jet2.u-abel.net/program/tips/forceimp.htm
48     // 装飾された名前のアドレスを作るための仮定義
49     // (これだけでインポートを横取りしている)
50     EXTERN_C int WINAPI _imp__IsDebuggerPresent()
51     { return PtrToInt((void*) &_imp__IsDebuggerPresent); }
52     // 実際に横取り処理を行う関数
53     EXTERN_C BOOL WINAPI Cover_IsDebuggerPresent()
54     { return FALSE; }
55     // 関数が実際に呼び出されたときに備えて
56     // 横取り処理関数を呼び出させるための下準備
57     EXTERN_C void __stdcall DoCover_IsDebuggerPresent()
58 yutakapon 2658 {
59 yutakapon 2659 DWORD dw;
60     DWORD_PTR FAR* lpdw;
61     // 横取り関数を設定するアドレスを取得
62     lpdw = (DWORD_PTR FAR*) &_imp__IsDebuggerPresent;
63     // このアドレスを書き込めるように設定
64     // (同じプログラム内なので障害なく行える)
65     VirtualProtect(lpdw, sizeof(DWORD_PTR), PAGE_READWRITE, &dw);
66     // 横取り関数を設定
67     *lpdw = (DWORD_PTR)(FARPROC) Cover_IsDebuggerPresent;
68     // 読み書きの状態を元に戻す
69     VirtualProtect(lpdw, sizeof(DWORD_PTR), dw, NULL);
70 yutakapon 2658 }
71 yutakapon 2659 // アプリケーションが初期化される前に下準備を呼び出す
72     // ※ かなり早くに初期化したいときは、このコードを
73     // ファイルの末尾に書いて「#pragma init_seg(lib)」を、
74     // この変数宣言の手前に書きます。
75     // 初期化を急ぐ必要が無い場合は WinMain 内から
76     // DoCover_IsDebuggerPresent を呼び出して構いません。
77     EXTERN_C int s_DoCover_IsDebuggerPresent
78     = (int) (DoCover_IsDebuggerPresent(), 0);
79 yutakapon 2658
80 yutakapon 2659
81    
82 maya 2476 // CTeraApp initialization
83     BOOL CTeraApp::InitInstance()
84     {
85     // インストーラで実行を検出するために mutex を作成する (2006.8.12 maya)
86     // 2重起動防止のためではないので、特に返り値は見ない
87     HANDLE hMutex;
88     hMutex = CreateMutex(NULL, TRUE, "TeraTermProAppMutex");
89    
90     hInst = m_hInstance;
91     m_pMainWnd = new CVTWindow();
92     pVTWin = m_pMainWnd;
93     return TRUE;
94     }
95    
96     int CTeraApp::ExitInstance()
97     {
98     return CWinApp::ExitInstance();
99     }
100    
101     // Tera Term main engine
102     BOOL CTeraApp::OnIdle(LONG lCount)
103     {
104     static int Busy = 2;
105     int Change, nx, ny;
106     BOOL Size;
107    
108     if (lCount==0) Busy = 2;
109    
110     if (cv.Ready)
111     {
112     /* Sender */
113     CommSend(&cv);
114    
115     /* Parser */
116     if ((cv.HLogBuf!=NULL) && (cv.LogBuf==NULL))
117     cv.LogBuf = (PCHAR)GlobalLock(cv.HLogBuf);
118    
119     if ((cv.HBinBuf!=NULL) && (cv.BinBuf==NULL))
120     cv.BinBuf = (PCHAR)GlobalLock(cv.HBinBuf);
121    
122     if ((TelStatus==TelIdle) && cv.TelMode)
123     TelStatus = TelIAC;
124    
125     if (TelStatus != TelIdle)
126     {
127     ParseTel(&Size,&nx,&ny);
128     if (Size) {
129     LockBuffer();
130     ChangeTerminalSize(nx,ny);
131     UnlockBuffer();
132     }
133     }
134     else {
135     if (cv.ProtoFlag) Change = ProtoDlgParse();
136     else {
137     switch (ActiveWin) {
138     case IdVT:
139     Change = ((CVTWindow*)pVTWin)->Parse();
140     // TEK windowのアクティブ中に pause を使うと、CPU使用率100%となる
141     // 現象への暫定対処。(2006.2.6 yutaka)
142     // 待ち時間をなくし、コンテキストスイッチだけにする。(2006.3.20 yutaka)
143     Sleep(0);
144     break;
145    
146     case IdTEK:
147     if (pTEKWin != NULL) {
148     Change = ((CTEKWindow*)pTEKWin)->Parse();
149     // TEK windowのアクティブ中に pause を使うと、CPU使用率100%となる
150     // 現象への暫定対処。(2006.2.6 yutaka)
151     Sleep(1);
152     }
153     else
154     Change = IdVT;
155     break;
156    
157     default:
158     Change = 0;
159     }
160    
161     switch (Change) {
162     case IdVT: VTActivate(); break;
163     case IdTEK: ((CVTWindow*)pVTWin)->OpenTEK(); break;
164     }
165     }
166     }
167    
168     if (cv.LogBuf!=NULL)
169     {
170     if (FileLog) LogToFile();
171     if (DDELog && AdvFlag) DDEAdv();
172     GlobalUnlock(cv.HLogBuf);
173     cv.LogBuf = NULL;
174     }
175    
176     if (cv.BinBuf!=NULL)
177     {
178     if (BinLog) LogToFile();
179     GlobalUnlock(cv.HBinBuf);
180     cv.BinBuf = NULL;
181     }
182    
183     /* Talker */
184     switch (TalkStatus) {
185     case IdTalkCB: CBSend(); break; /* clip board */
186     case IdTalkFile: FileSend(); break; /* file */
187     }
188    
189     /* Receiver */
190     if (DDELog && cv.DCount >0) {
191     // ログバッファがまだDDEクライアントへ送られていない場合は、
192     // TCPパケットの受信を行わない。
193     // 連続して受信を行うと、ログバッファがラウンドロビンにより未送信のデータを
194     // 上書きしてしまう可能性がある。(2007.6.14 yutaka)
195    
196     } else {
197     CommReceive(&cv);
198     }
199    
200     }
201    
202     if (cv.Ready &&
203     (cv.RRQ || (cv.OutBuffCount>0) || (cv.InBuffCount>0) ||
204     (cv.LCount>0) || (cv.BCount>0) || (cv.DCount>0)) )
205     Busy = 2;
206     else
207     Busy--;
208    
209     return (Busy>0);
210     }
211    
212     BOOL CTeraApp::PreTranslateMessage(MSG* pMsg)
213     {
214     if (ts.MetaKey>0)
215     return FALSE; /* ignore accelerator keys */
216     else
217     return CWinApp::PreTranslateMessage(pMsg);
218     }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26