source: trunk/dll/sysinfo.c@ 374

Last change on this file since 374 was 374, checked in by root, 19 years ago

Report open errors

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