sysinfo.c

来自「一本已经绝版的好书」· C语言 代码 · 共 263 行

C
263
字号
/***********************************************************
Module name: SysInfo.C
Notices: Copyright (c) 1995-1997 Jeffrey Richter
***********************************************************/


#include "..\CmnHdr.H"                 /* See Appendix C. */
#include <windows.h>
#include <windowsx.h>
#include <tchar.h>
#include <stdio.h>
#include "Resource.H"


///////////////////////////////////////////////////////////


// Set to TRUE if the app is running on Windows 95.
BOOL g_fWin95IsHost = FALSE;


///////////////////////////////////////////////////////////


// This function accepts a number and converts it to a
// string, inserting commas where appropriate.
LPTSTR BigNumToString (LONG lNum, LPTSTR szBuf) {
   WORD wNumDigits = 0, wNumChars = 0;

   do {
      // Put the last digit of the string
      // in the character buffer.
      szBuf[wNumChars++] = (TCHAR) (lNum % 10 + __TEXT('0'));

      // Increment the number of digits
      // that we put in the string.
      wNumDigits++;

      // For every three digits put in
      // the string, add a comma (,).
      if (wNumDigits % 3 == 0)
         szBuf[wNumChars++] = __TEXT(',');

      // Divide the number by 10, and repeat the process.
      lNum /= 10;

      // Continue adding digits to the
      // string until the number is zero.
   } while (lNum != 0);

   // If the last character added to
   // the string was a comma, truncate it.
   if (szBuf[wNumChars - 1] == __TEXT(','))
      szBuf[wNumChars - 1] = 0;

   // Ensure that the string is zero-terminated.
   szBuf[wNumChars] = 0;

   // We added all the characters to the string in
   // reverse order. We must reverse the contents
   // of the string.
   _tcsrev(szBuf);

   // Returns the address of the string.  This is the same
   // value that was passed to us initially.  Returning it
   // here makes it easier for the calling function to
   // use the string.
   return(szBuf);
}


///////////////////////////////////////////////////////////


void ShowCPUInfo (HWND hwnd, 
   WORD wProcessorArchitecture, WORD wProcessorLevel, 
   WORD wProcessorRevision) {

   TCHAR szCPUArch[64];
   TCHAR szCPULevel[64];
   TCHAR szCPURev[64];
   szCPULevel[0] = 0;
   szCPURev[0] = 0;

   switch (wProcessorArchitecture) {
      case PROCESSOR_ARCHITECTURE_INTEL: 
         lstrcpy(szCPUArch, __TEXT("Intel")); 
         switch (wProcessorLevel) {
         case 3: case 4:
            wsprintf(szCPULevel, __TEXT("80%c86"), 
               wProcessorLevel + '0');
            if (!g_fWin95IsHost) 
               wsprintf(szCPURev, __TEXT("%c%d"), 
                  HIBYTE(wProcessorRevision) + __TEXT('A'),
                  LOBYTE(wProcessorRevision));
            else 
               lstrcpy(szCPURev, __TEXT("(unknown)"));
            break;
         case 5:
            wsprintf(szCPULevel, __TEXT("Pentium"));
            if (!g_fWin95IsHost) 
               wsprintf(szCPURev, 
                  __TEXT("Model %d, Stepping %d"),
                  HIBYTE(wProcessorRevision), 
                  LOBYTE(wProcessorRevision));
            else 
               lstrcpy(szCPURev, __TEXT("(unknown)"));
            break;
         }
         break;

      case PROCESSOR_ARCHITECTURE_MIPS:  
         lstrcpy(szCPUArch, __TEXT("MIPS")); 
         wsprintf(szCPULevel, __TEXT("R%04d"), 
            LOBYTE(wProcessorLevel) * 1000);
         wsprintf(szCPURev, __TEXT("%d"), 
            LOBYTE(wProcessorRevision));
         break;

      case PROCESSOR_ARCHITECTURE_ALPHA: 
         lstrcpy(szCPUArch, __TEXT("Alpha"));
         wsprintf(szCPULevel, __TEXT("%d"), wProcessorLevel);
         wsprintf(szCPURev, __TEXT("Model %c, Pass %d"), 
            HIBYTE(wProcessorRevision) + __TEXT('A'), 
            LOBYTE(wProcessorRevision));
         break;

      case PROCESSOR_ARCHITECTURE_PPC:   
         lstrcpy(szCPUArch, __TEXT("PowerPC"));
         switch (wProcessorLevel) {
         case 1: case 3: case 4: case 20:
            wsprintf(szCPULevel, __TEXT("%d"), 
               600 + wProcessorLevel);
            break;
         case 6:
            wsprintf(szCPULevel, __TEXT("603+"), 
               wProcessorLevel);
            break;
         case 9:
            wsprintf(szCPULevel, __TEXT("604+"), 
               wProcessorLevel);
            break;
         }
         wsprintf(szCPURev, __TEXT("%d.%d"), 
            HIBYTE(wProcessorRevision), 
            LOBYTE(wProcessorRevision));
         break;
      
      case PROCESSOR_ARCHITECTURE_UNKNOWN:
      default:
         wsprintf(szCPUArch, __TEXT("Unknown"));
         break;
   }
   SetDlgItemText(hwnd, IDC_PROCARCH,  szCPUArch);
   SetDlgItemText(hwnd, IDC_PROCLEVEL, szCPULevel);
   SetDlgItemText(hwnd, IDC_PROCREV,   szCPURev);
}


///////////////////////////////////////////////////////////


BOOL Dlg_OnInitDialog (HWND hwnd, HWND hwndFocus,
   LPARAM lParam) {

   TCHAR szBuf[50];
   SYSTEM_INFO sinf;

   // Associate an icon with the dialog box.
   chSETDLGICONS(hwnd, IDI_SYSINFO, IDI_SYSINFO);

   GetSystemInfo(&sinf);

   if (g_fWin95IsHost) {
      sinf.wProcessorLevel = (WORD) 
         (sinf.dwProcessorType / 100);
   }

   ShowCPUInfo(hwnd, sinf.wProcessorArchitecture,
      sinf.wProcessorLevel, sinf.wProcessorRevision);

   SetDlgItemText(hwnd, IDC_PAGESIZE,
      BigNumToString(sinf.dwPageSize, szBuf));

   SetDlgItemText(hwnd, IDC_MINAPPADDR,
      BigNumToString((LONG) sinf.lpMinimumApplicationAddress,
      szBuf));

   SetDlgItemText(hwnd, IDC_MAXAPPADDR,
      BigNumToString((LONG) sinf.lpMaximumApplicationAddress,
      szBuf));

   _stprintf(szBuf, __TEXT("0x%08X"),
      sinf.dwActiveProcessorMask);
   SetDlgItemText(hwnd, IDC_ACTIVEPROCMASK, szBuf);

   SetDlgItemText(hwnd, IDC_NUMOFPROCS,
      BigNumToString(sinf.dwNumberOfProcessors, szBuf));

   SetDlgItemText(hwnd, IDC_ALLOCGRAN,
      BigNumToString(sinf.dwAllocationGranularity, szBuf));

   return(TRUE);
}


///////////////////////////////////////////////////////////


void Dlg_OnCommand (HWND hwnd, int id, HWND hwndCtl,
   UINT codeNotify) {

   switch (id) {
      case IDCANCEL:
         EndDialog(hwnd, id);
         break;
   }
}


///////////////////////////////////////////////////////////


BOOL CALLBACK Dlg_Proc (HWND hDlg, UINT uMsg,
   WPARAM wParam, LPARAM lParam) {

   BOOL fProcessed = TRUE;

   switch (uMsg) {
      chHANDLE_DLGMSG(hDlg, WM_INITDIALOG, Dlg_OnInitDialog);
      chHANDLE_DLGMSG(hDlg, WM_COMMAND, Dlg_OnCommand);

      default:
         fProcessed = FALSE;
         break;
   }
   return(fProcessed);
}


///////////////////////////////////////////////////////////


int WINAPI _tWinMain (HINSTANCE hinstExe,
   HINSTANCE hinstPrev, LPTSTR pszCmdLine, int nCmdShow) {

   OSVERSIONINFO osvi;

   chWARNIFUNICODEUNDERWIN95();

   osvi.dwOSVersionInfoSize = sizeof(osvi);
   GetVersionEx(&osvi);
   g_fWin95IsHost = 
      (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS);

   DialogBox(hinstExe, MAKEINTRESOURCE(IDD_SYSINFO),
      NULL, Dlg_Proc);

   return(0);
}


/////////////////////// End Of File ///////////////////////

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?