source: trunk/dll/sysinfo.c@ 114

Last change on this file since 114 was 114, checked in by root, 21 years ago

RunRmview: avoid buffer overflow

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 17.6 KB
Line 
1
2/***********************************************************************
3
4 $Id: sysinfo.c 114 2004-12-05 00:03:16Z root $
5
6 System Info Display
7
8 Copyright (c) 1993-98 M. Kimes
9 Copyright (c) 2002, 2004 Steven H.Levine
10
11 Revisions 16 Oct 02 SHL - Baseline
12 08 Feb 03 SHL - Enable display
13 01 Aug 04 SHL - RunRmview: avoid buffer overflow
14
15***********************************************************************/
16
17#define INCL_DOS
18#define INCL_WIN
19
20#include <os2.h>
21#include <stdlib.h>
22#include <stdio.h>
23#include <string.h>
24#include "fm3dll.h"
25#include "fm3dlg.h"
26
27#pragma data_seg(DATA1)
28#pragma alloc_text(SYSINFO,SysInfoDlgProc,RunRmview)
29
30
31VOID RunRmview (VOID *arg) {
32
33 HWND hwnd = (HWND)arg;
34 CHAR s[2048],*p;
35 HAB thab;
36 HMQ thmq;
37 FILE *fp;
38 HFILE oldstdout,newstdout;
39
40 DosError(FERR_DISABLEHARDERR);
41
42 thab = WinInitialize(0);
43 thmq = WinCreateMsgQueue(thab,0);
44 WinCancelShutdown(thmq,TRUE);
45 if(thab && thmq) {
46 if(!WinIsWindow(thab,hwnd))
47 goto Abort;
48 unlinkf("%s","$RMVIEW.#$#");
49 fp = fopen("$RMVIEW.#$#","w");
50 if(fp) {
51 newstdout = -1;
52 if(DosDupHandle(fileno(stdout),&newstdout)) {
53 fclose(fp);
54 goto Abort;
55 }
56 oldstdout = fileno(stdout);
57 DosDupHandle(fileno(fp),&oldstdout);
58 runemf2(SEPARATE | INVISIBLE | FULLSCREEN | BACKGROUND | WAIT,
59 hwnd,NULL,NULL,"%s","RMVIEW.EXE");
60 oldstdout = fileno(stdout);
61 DosDupHandle(newstdout,&oldstdout);
62 DosClose(newstdout);
63 fclose(fp);
64 }
65 else
66 goto Abort;
67 if(!WinIsWindow(thab,hwnd))
68 goto Abort;
69 fp = fopen("$RMVIEW.#$#","r");
70 if(fp) {
71 fgets(s,2048,fp);
72 fgets(s,2048,fp);
73 if(!feof(fp) && WinIsWindow(thab,hwnd))
74 WinSendDlgItemMsg(hwnd,SYS_LISTBOX,LM_INSERTITEM,
75 MPFROM2SHORT(LIT_END,0),
76 MPFROMP(" -= RMView Physical Info =-"));
77 while(!feof(fp)) {
78 strset(s,0);
79 if(!fgets(s,2048,fp))
80 break;
81 s[2047] = 0;
82 stripcr(s);
83 rstrip(s);
84 p = s;
85 while(*p == '\r' || *p == '\n')
86 p++;
87 if(!WinIsWindow(thab,hwnd))
88 break;
89 WinSendDlgItemMsg(hwnd,SYS_LISTBOX,LM_INSERTITEM,
90 MPFROM2SHORT(LIT_END,0),
91 MPFROMP(p));
92 }
93 fclose(fp);
94 }
95Abort:
96 WinDestroyMsgQueue(thmq);
97 WinTerminate(thab);
98 }
99 DosForceDelete("$RMVIEW.#$#");
100}
101
102MRESULT EXPENTRY SysInfoDlgProc (HWND hwnd,ULONG msg,MPARAM mp1,MPARAM mp2)
103{
104
105 static HWND me = (HWND)0;
106 static LONG ypos = 0;
107 static HPOINTER hptrIcon = (HPOINTER)0;
108
109 switch(msg) {
110 case WM_INITDLG:
111 if(me) {
112 WinSetWindowPos(me,HWND_TOP,0,0,0,0,SWP_ACTIVATE |
113 SWP_SHOW | SWP_RESTORE | SWP_ZORDER);
114 WinDismissDlg(hwnd,0);
115 break;
116 }
117 hptrIcon = WinLoadPointer(HWND_DESKTOP,FM3ModHandle,SYS_FRAME);
118 WinDefDlgProc(hwnd,WM_SETICON,MPFROMLONG(hptrIcon),MPVOID);
119 {
120 static CHAR *names[] = {"Max. Path Length", /* 1 */
121 "Max. Text Sessions", /* 2 */
122 "Max. PM Sessions", /* 3 */
123 "Max. VDM Sessions", /* 4 */
124 "Boot Drive", /* 5 */
125 "Dynamic Priority", /* 6 */
126 "Max. Wait", /* 7 */
127 "Min. Timeslice", /* 8 */
128 "Max. Timeslice", /* 9 */
129 "Page Size", /* 10 */
130 "Version Major", /* 11 */
131 "Version Minor", /* 12 */
132 "Version Revision", /* 13 */
133 "Millisecs Up", /* 14 */
134 "Unixtime Low", /* 15 */
135 "Unixtime High", /* 16 */
136 "Physical Memory", /* 17 */
137 "Resident Memory", /* 18 */
138 "Total Available Memory", /* 19 */
139 "Max. Private Memory", /* 20 */
140 "Max. Shared Memory", /* 21 */
141 "Timer Interval", /* 22 */
142 "Max. Path Comp. Length", /* 23 */
143 "Foreground FS Session ID", /* 24 */
144 "Foreground Process PID", /* 25 */
145 NULL};
146 static CHAR *pnames[] = {"Swap button",
147 "Dblclk time",
148 "CX dblclk",
149 "CY dblclk",
150 "CX sizeborder",
151 "CY sizeborder",
152 "Alarm",
153 "",
154 "",
155 "Cursor rate",
156 "First scroll rate",
157 "Scroll rate",
158 "Numbered lists",
159 "Warning freq",
160 "Note freq",
161 "Error freq",
162 "Warning duration",
163 "Note duration",
164 "Error duration",
165 "",
166 "CX screen",
167 "CY screen",
168 "CX vscroll",
169 "CY hscroll",
170 "CY vscroll arrow",
171 "CX hscroll arrow",
172 "CX border",
173 "CY border",
174 "CX dlgframe",
175 "CY dlgframe",
176 "CY titlebar",
177 "CY vslider",
178 "CX hslider",
179 "CX minmaxbutton",
180 "CY minmaxbutton",
181 "CY menu",
182 "CX fullscreen",
183 "CY fullscreen",
184 "CX icon",
185 "CY icon",
186 "CX pointer",
187 "CY pointer",
188 "Debug",
189 "# Mouse buttons",
190 "Pointer level",
191 "Cursor level",
192 "Track rect level",
193 "# timers",
194 "Mouse present",
195 "CX bytealign",
196 "CY bytealign",
197 "",
198 "",
199 "",
200 "",
201 "",
202 "Not reserved",
203 "Extra key beep",
204 "Set lights",
205 "Insert mode",
206 "",
207 "",
208 "",
209 "",
210 "Menu rolldown delay",
211 "Menu rollup delay",
212 "Alt mnemonic",
213 "Tasklist mouse access",
214 "CX icon text width",
215 "# Icon text lines",
216 "Chord time",
217 "CX chord",
218 "CY chord",
219 "CX motion",
220 "CY motion",
221 "Begin drag",
222 "End drag",
223 "Single select",
224 "Open",
225 "Context menu",
226 "Context help",
227 "Text edit",
228 "Begin select",
229 "End select",
230 "Begin drag kb",
231 "End drag kb",
232 "Select kb",
233 "Open kb",
234 "Context menu kb",
235 "Context help kb",
236 "Text edit kb",
237 "Begin select kb",
238 "End select kb",
239 "Animation",
240 "Animation speed",
241 "Mono icons",
242 "Kbd id",
243 "Print screen",
244 NULL};
245 static CHAR *dnames[] = {"# printers",
246 "# RS232 ports",
247 "# diskette drives",
248 "Coprocessor present",
249 "PC submodel",
250 "PC model",
251 "Display",
252 NULL};
253 ULONG vals[26],val,x;
254 CHAR s[134],dev;
255
256 if(DosQuerySysInfo(QSV_MAX_PATH_LENGTH,QSV_MAX_COMP_LENGTH + 2L,
257 (PVOID)vals,(ULONG)sizeof(vals))) {
258 WinDismissDlg(hwnd,0);
259 break;
260 }
261 me = hwnd;
262 WinSendDlgItemMsg(hwnd,SYS_LISTBOX,LM_INSERTITEM,
263 MPFROMLONG(LIT_END),
264 MPFROMP(" -= Base OS Info =-"));
265 for(x = 0;names[x];x++) {
266 switch(x) {
267 case 0:
268 case 9:
269 case 22:
270 sprintf(s,"%-28.28s%lu bytes",names[x],vals[x]);
271 break;
272 case 16:
273 case 17:
274 case 18:
275 case 19:
276 case 20:
277 sprintf(s,"%-28.28s%lu bytes (%lu mb)",names[x],vals[x],
278 vals[x] / (1024 * 1024));
279 break;
280 case 4:
281 sprintf(s,"%-28.28s%c:",names[x],(CHAR)vals[x] + '@');
282 break;
283 case 5:
284 sprintf(s,"%-28.28s%s",names[x],(vals[x]) ? "On" : "Off");
285 break;
286 case 6:
287 sprintf(s,"%-28.28s%lu seconds",names[x],vals[x]);
288 break;
289 case 7:
290 case 8:
291 sprintf(s,"%-28.28s%lu milliseconds",names[x],vals[x]);
292 break;
293 case 13:
294 {
295 ULONG numdays,nummins;
296
297 sprintf(s,"%-28.28s%lu (",names[x],vals[x]);
298 vals[x] /= 60000L;
299 numdays = vals[x] / (60L * 24L);
300 if(numdays)
301 sprintf(s + strlen(s),"%lu day%s, ",numdays,&"s"[numdays == 1L]);
302 nummins = vals[x] % (60L * 24L);
303 sprintf(s + strlen(s),"%luh:%02lum)",nummins / 60,nummins % 60);
304 }
305 break;
306 case 21:
307 sprintf(s,"%-28.28s%lu.%01lu milliseconds",names[x],
308 vals[x] / 10,vals[x] % 10);
309 break;
310 default:
311 sprintf(s,"%-28.28s%lu",names[x],vals[x]);
312 break;
313 }
314 if(*s)
315 WinSendDlgItemMsg(hwnd,SYS_LISTBOX,LM_INSERTITEM,
316 MPFROMLONG(LIT_END),MPFROMP(s));
317 }
318 WinSendDlgItemMsg(hwnd,SYS_LISTBOX,LM_INSERTITEM,
319 MPFROMLONG(LIT_END),
320 MPFROMP(" -= PM Info =-"));
321 for(x = 0;pnames[x];x++) {
322 if(*pnames[x]) {
323 val = WinQuerySysValue(HWND_DESKTOP,x);
324 switch(x) {
325 case SV_CXBYTEALIGN:
326 case SV_CYBYTEALIGN:
327 case SV_CYMOTIONSTART:
328 case SV_CXMOTIONSTART:
329 case SV_CYDBLCLK:
330 case SV_CXDBLCLK:
331 case SV_CYPOINTER:
332 case SV_CXPOINTER:
333 case SV_CYICON:
334 case SV_CXICON:
335 case SV_CXFULLSCREEN:
336 case SV_CYFULLSCREEN:
337 case SV_CYMENU:
338 case SV_CYMINMAXBUTTON:
339 case SV_CXMINMAXBUTTON:
340 case SV_CXHSLIDER:
341 case SV_CYVSLIDER:
342 case SV_CXDLGFRAME:
343 case SV_CYDLGFRAME:
344 case SV_CXSIZEBORDER:
345 case SV_CYSIZEBORDER:
346 case SV_CXBORDER:
347 case SV_CYBORDER:
348 case SV_CYTITLEBAR:
349 case SV_CXHSCROLLARROW:
350 case SV_CYVSCROLLARROW:
351 case SV_CXVSCROLL:
352 case SV_CYHSCROLL:
353 case SV_CYSCREEN:
354 case SV_CXSCREEN:
355 case SV_CXICONTEXTWIDTH:
356 case SV_CXCHORD:
357 case SV_CYCHORD:
358 sprintf(s,"%-28.28s%lu pels",pnames[x],val);
359 break;
360 case SV_CONTEXTMENU:
361 case SV_OPEN:
362 case SV_TEXTEDIT:
363 case SV_BEGINSELECT:
364 case SV_ENDSELECT:
365 case SV_BEGINDRAG:
366 case SV_ENDDRAG:
367 case SV_CONTEXTHELP:
368 case SV_SINGLESELECT:
369 sprintf(s,"%-28.28sWM: %04xh KC: %04xh",pnames[x],
370 LOUSHORT(val),HIUSHORT(val));
371 break;
372 case SV_TASKLISTMOUSEACCESS:
373 sprintf(s,"%-28.28sWM: %04xh",pnames[x],LOUSHORT(val));
374 break;
375 case SV_CONTEXTMENUKB:
376 case SV_TEXTEDITKB:
377 case SV_BEGINDRAGKB:
378 case SV_ENDDRAGKB:
379 case SV_SELECTKB:
380 case SV_OPENKB:
381 case SV_CONTEXTHELPKB:
382 case SV_BEGINSELECTKB:
383 case SV_ENDSELECTKB:
384 sprintf(s,"%-28.28sVK: %04xh KC: %04xh",pnames[x],
385 LOUSHORT(val),HIUSHORT(val));
386 break;
387 case SV_CHORDTIME:
388 case SV_DBLCLKTIME:
389 case SV_CURSORRATE:
390 case SV_FIRSTSCROLLRATE:
391 case SV_SCROLLRATE:
392 case SV_MENUROLLDOWNDELAY:
393 case SV_MENUROLLUPDELAY:
394 case SV_ANIMATIONSPEED:
395 case SV_WARNINGDURATION:
396 case SV_NOTEDURATION:
397 case SV_ERRORDURATION:
398 sprintf(s,"%-28.28s%lu milliseconds",pnames[x],val);
399 break;
400 case SV_MOUSEPRESENT:
401 sprintf(s,"%-28.28s%s",pnames[x],(val) ? "True" : "False");
402 break;
403 case SV_ALARM:
404 case SV_ANIMATION:
405 case SV_MONOICONS:
406 case SV_PRINTSCREEN:
407 case SV_SETLIGHTS:
408 case SV_INSERTMODE:
409 case SV_SWAPBUTTON:
410 case SV_DEBUG:
411 sprintf(s,"%-28.28s%s",pnames[x],(val) ? "On" : "Off");
412 break;
413 default:
414 sprintf(s,"%-28.28s%lu",pnames[x],val);
415 break;
416 }
417 WinSendDlgItemMsg(hwnd,SYS_LISTBOX,LM_INSERTITEM,
418 MPFROMLONG(LIT_END),MPFROMP(s));
419 }
420 }
421 WinSendDlgItemMsg(hwnd,SYS_LISTBOX,LM_INSERTITEM,
422 MPFROMLONG(LIT_END),
423 MPFROMP(" -= Hardware info =-"));
424 for(x = 0;dnames[x];x++) {
425 if(*dnames[x]) {
426 if(!DosDevConfig(&dev,x)) {
427 switch(x) {
428 case DEVINFO_COPROCESSOR:
429 sprintf(s,"%-28.28s%s",dnames[x],(dev) ? "True" : "False");
430 break;
431 case DEVINFO_ADAPTER:
432 sprintf(s,"%-28.28s%sMonochrome or printer",dnames[x],
433 (dev) ? "Not " : NullStr);
434 break;
435 default:
436 sprintf(s,"%-28.28s%lu",dnames[x],dev);
437 break;
438 }
439 }
440 WinSendDlgItemMsg(hwnd,SYS_LISTBOX,LM_INSERTITEM,
441 MPFROMLONG(LIT_END),MPFROMP(s));
442 }
443 }
444 }
445# ifdef NEVER // fixme
446 _beginthread(RunRmview,NULL,65536,(PVOID)hwnd);
447# endif
448 break;
449
450 case WM_ADJUSTWINDOWPOS:
451 PostMsg(hwnd,UM_STRETCH,MPVOID,MPVOID);
452 break;
453
454 case UM_STRETCH:
455 {
456 SWP swpC,swp;
457
458 WinQueryWindowPos(hwnd,&swp);
459 if(!(swp.fl & (SWP_HIDE | SWP_MINIMIZE))) {
460 WinQueryWindowPos(WinWindowFromID(hwnd,SYS_LISTBOX),&swpC);
461 if(!ypos)
462 ypos = swpC.y;
463 WinSetWindowPos(WinWindowFromID(hwnd,SYS_LISTBOX),HWND_TOP,
464 SysVal(SV_CXSIZEBORDER),
465 ypos,
466 swp.cx - (SysVal(SV_CXSIZEBORDER) * 2),
467 (swp.cy - ypos) - (SysVal(SV_CYTITLEBAR) +
468 SysVal(SV_CYSIZEBORDER)),
469 SWP_MOVE | SWP_SIZE);
470 }
471 }
472 return 0;
473
474 case WM_COMMAND:
475 WinDismissDlg(hwnd,0);
476 return 0;
477
478 case WM_DESTROY:
479 if(me == hwnd) {
480 me = (HWND)0;
481 if(hptrIcon)
482 WinDestroyPointer(hptrIcon);
483 hptrIcon = (HPOINTER)0;
484 }
485 break;
486 }
487
488 return WinDefDlgProc(hwnd,msg,mp1,mp2);
489}
490
Note: See TracBrowser for help on using the repository browser.