知/Delphi

IP, OS, CPU 정보 알아오기

채수욱 2012. 11. 9. 15:09

// 로컬 아이피 주소 얻는넘
procedure GetLocalIpList(aList : TStrings);
type
  TaPInAddr = array [0..255] of PInAddr;
  PaPInAddr = ^TaPInAddr;
var
buff : array [0..63] of char;
pHEnt : PHostEnt;
pptr : PaPInAddr;
WSData : TWSAData;
i : integer;
begin
aList.Clear;
if WSAStartup($101,WSData) <> 0 then begin
  showmessagefmt('%d',[getlasterror]);
  exit;
end;
try
  if GetHostName (buff,sizeof(buff)) <> 0 then begin
    showmessagefmt('%d',[getlasterror]);
    exit;
  end;
  pHEnt := gethostbyname(buff);
  if pHEnt <> nil then begin
    pptr := PaPInAddr(pHEnt^.h_addr_list);
    I := 0;
    while pptr^[I] <> nil do begin
        aList.Add(StrPas(inet_ntoa(pptr^[I]^)));
        Inc(I);
    end;
  end;
finally
  WSACleanup;
end;
end;


//OSVersion Chech하는 넘
procedure __OSVERSIONCHECK__;
var
osvi : TOSVersionInfo;
begin
osvi.dwOSVersionInfoSize := SIZEOF(TOSVersionInfo);
GetVersionEx (osvi);
case (osvi.dwMajorVersion) of
  3 : // NT3.51
      begin
        WITH __OSVERSIONINFO DO BEGIN
          OSTYPE := __WinNT;
          MGVERSION := 3;
          MNVERSION := 51;
          BUILDNO := osvi.dwBuildNumber;
          SVCPACK := osvi.szCSDVersion;
        END;
      end;
  4 : // win95,98,ME, NT4.0
      BEGIN
        if (osvi.dwMinorVersion = 0)  THEN BEGIN // win95 or nt4.0
          if (osvi.dwPlatformId = VER_PLATFORM_WIN32_NT) THEN BEGIN// NT4.0
            WITH __OSVERSIONINFO DO BEGIN
              OSTYPE := __WinNT;
              MGVERSION := 4;
              MNVERSION := 0;
              BUILDNO := osvi.dwBuildNumber;
              SVCPACK := osvi.szCSDVersion;
            END;
          END
          else
            WITH __OSVERSIONINFO DO BEGIN
              OSTYPE := __Win95;
              MGVERSION := 4;
              MNVERSION := 0;
              BUILDNO := osvi.dwBuildNumber AND $0000FFFF;  //LOWORD
              IF StrLen(osvi.szCSDVersion) > 1 THEN
                SVCPACK := 'OSR2'
              ELSE
                SVCPACK := '';
            END;
        END
        else if (osvi.dwMinorVersion = 10) THEN // win98
          WITH __OSVERSIONINFO DO BEGIN
            OSTYPE := __Win98;
            MGVERSION := 4;
            MNVERSION := 10;
            BUILDNO := osvi.dwBuildNumber AND $0000FFFF;  //LOWORD
            IF StrLen(osvi.szCSDVersion) > 1 THEN
              SVCPACK := 'SE'
            ELSE
              SVCPACK := '';
          END
        else  // winMe
          WITH __OSVERSIONINFO DO BEGIN
            OSTYPE := __WinME;
            MGVERSION := 4;
            MNVERSION := osvi.dwMinorVersion;
            BUILDNO := osvi.dwBuildNumber;
            SVCPACK := '';
          END;
      END;
  5 : // Win2000,XP,.net Server
      BEGIN
        if ( osvi.dwMinorVersion = 0 ) THEN // 2000
          WITH __OSVERSIONINFO DO BEGIN
            OSTYPE := __Win2000;
            MGVERSION := 5;
            MNVERSION := osvi.dwMinorVersion;
            BUILDNO := osvi.dwBuildNumber;
            SVCPACK := osvi.szCSDVersion;
          END
        else        // XP or .net Server
          WITH __OSVERSIONINFO DO BEGIN
            OSTYPE := __WinXP;
            MGVERSION := 5;
            MNVERSION := osvi.dwMinorVersion;
            BUILDNO := osvi.dwBuildNumber;
            SVCPACK := osvi.szCSDVersion;
          END;
      END;
END;
end;


// Cpu Vendor Check하는 넘..

const
ID_BIT   =  $200000;       // EFLAGS ID bit
type
TCPUID   = array[1..4] of Longint;
TVendor  = array [0..11] of char;

function IsCPUID_Available: Boolean; register;
asm
PUSHFD             {direct access to flags no possible, only via stack}
POP     EAX        {flags to EAX}
MOV     EDX,EAX    {save current flags}
XOR     EAX,ID_BIT {not ID bit}
PUSH    EAX        {onto stack}
POPFD              {from stack to flags, with not ID bit}
PUSHFD             {back to stack}
POP     EAX        {get back to EAX}
XOR     EAX,EDX    {check if ID bit affected}
JZ      @exit      {no, CPUID not availavle}
MOV     AL,True    {Result=True}
@exit:
end;

function GetCPUVendor: TVendor; assembler; register;
asm
PUSH    EBX        {Save affected register}
PUSH    EDI
MOV     EDI,EAX    {@Result (TVendor)}
MOV     EAX,0
DW      $A20F      {CPUID Command}
MOV     EAX,EBX
XCHG    EBX,ECX    {save ECX result}
MOV     ECX,4
@1:
STOSB
SHR     EAX,8
LOOP    @1
MOV     EAX,EDX
MOV     ECX,4
@2:
STOSB
SHR     EAX,8
LOOP    @2
MOV     EAX,EBX
MOV     ECX,4
@3:
STOSB
SHR     EAX,8
LOOP    @3
POP     EDI        {Restore registers}
POP     EBX
end;

 

출처 : http://csbuilder.tistory.com/100