헬마입니다.

오랜만에 글을 쓰는군요.

이번에는 NSIS에서 플러그인을 사용해 CPU 정보를 얻어내 볼까 합니다.

코덱팩에서 유용하게 쓰인 플러그인입니다.

주로 CPU 종류별로 프로그램을 설치하거나 할 때 쓰입니다.

준비물 : NSIS, Cpudesc 플러그인

이 플러그인은 호출하면 변수에 특정형식으로 된 긴 문자열을 반환합니다. 그러면 사용자는 이 문자열에서 지정된 위치를 문자를 읽어보고 정보를 얻어내는 형태입니다.

이 플러그인을 호출하고 $0 값을 스택에서 꺼내어 보면 아래와 같은 형식으로 정보가 저장되어 있습니다.

<도움말에서...>

INTELP=d AMD=add PPRO=b MMX=d SSE=b SSE2=b 3DNOW=d ARCH=dd LEVEL=dd NCPU=dd MHZ=ddddd RAM=dddd

d -> 숫자를 나타냅니다. d가 2개면 두자리 숫자라는 뜻이지요.
a -> 문자를 나타냅니다. 알파벳 A-Z 까지입니다.
b -> 논리값을 나타내기 위한 숫자값입니다. 0 또는 1입니다.

INTELP: 값 범위 [0..4].
  0:    인텔 CPU가 아니거나 매우 매우 오래된 인텔 CPU
  1:    Pentium 또는 Pentium MMX. 즉, MMX 지원여부는 MMX 를 다시한번 확인해봐야합니다.
  2:    Pentium Pro, II 또는 Celeron.
       펜티엄 프로는 MMX가 없기때문에 역시 MMX 지원여부는 따로 확인해야합니다.
  3:    Pentium III 또는 P3 (구형) Xeon.   MMX 와 SSE 를 지원합니다.
  4:    Pentium IV 또는 (신형) Xeon.   MMX, SSE, SSE2 를 지원합니다.
AMD:    좀 복잡합니다....
  000:  AMD CPU가 아니거나 매우 매우 오래된 AMD CPU
  Kdd:  구형 K 시리즈..   "dd" 값은 K5의 05 또는 K6의 06
       펜티엄 호환. K5는 MMX나 3dnow 지원안함. k6 는 표준 MMX 를 지원하며 후기 모델은 표준 3d now 지원
  Add:  애슬론 또는 듀론.   "dd" 는 모델넘버로 01 부터 10까지. 모든 모델은 확장 MMX와 확장 3D NOW 지원.
       SSE는 지원하지 않음. 펜티엄 2 호환.
  Odd:  옵테론.   "dd" 는 모델 넘버
       펜티엄 4 호환.
PPRO:   값 범위 [0..1]
  0:    인텔 펜티엄 프로와 호환성 없음
  1:    인텔 펜티엄 프로와 호환
MMX:    Values range [0..2].
  0:    MMX 지원 안 함
  1:    표준 인텔 MMX
  2:    표준 MMX 와 AMD MMX
SSE:    Values range [0..1].
  0:    SSE 지원 안 함
  1:    SSE 지원 함
SSE2:   Values range [0..1].
  0:    SSE2 지원 안 함
  1:    SSE2 지원
3DNOW:  Values range [0..2].
  0:    3D NOW 지원 안 함
  1:    표준 3D NOW
  2:    표준, 확장 3D NOW
ARCH:   Values range [00..10].
  00:   32-bit 인텔 또는 그 호환
  01:   MIPS (NT 3.5용)
  02:   DEC Alpha.  
  03:   PowerPC
  04:   SHX (?)
  05:   ARM (Acorn Risc Machine, 윈도가 돌아가던가??)
  06:   64-bit Intel.
  07:   64-bit Alpha
  08:   MSIL (?)
  09:   64-bit AMD
  10:   32-bit Intel doing Win64 (?)
LEVEL:  "Processor level", like what you see in the main processor environment
       variable.   Sort-of useless for Intel architecture.
NCPU:   프로세서 숫자(아마도 하이퍼 스레딩이 영향을 미치리라 예상함)
MHZ:    The CPU's internal clock speed in MHz (Approx).
RAM:    반올림한 물리 메모리 용량 (메가바이트 단위)


INTELP=d AMD=add PPRO=b MMX=d SSE=b SSE2=b 3DNOW=d ARCH=dd LEVEL=dd NCPU=dd MHZ=ddddd RAM=dddd

간단한 예제
  cpudesc::tell  ; cpudesc 플러그인을 호출합니다.
  Pop $0                     ; 스택에 저장된 $0 를 꺼냅니다
  StrCpy $1 $0 1, 22         ; $0 문자열의 22번째 위치에서 한 글자를 읽어 $1에 저장. 'PPRO=' 다음 글자
  IntFmt $2 "%u" $1          ; 읽어온 글자인 $1를 숫자형식으로 변환하여 $2에 저장
  IntCmpU $2 1 +1 +3 +3      ; $2와 1을 비교하여 같으면(펜티엄 프로이면) 바로 진행하고 같지 않으면(펜티엄 프로가 아니면) 3번째 명령 위치로 이동하여 그 명령을 실행
  File /oname=blog.exe "blog_source_directory\blog_pro.exe"  ; 프로용 파일 설치
  Goto +2 ; 일반 적인 파일 설치 부분을 건너뛰기 위해 실행 위치를 +2 만큼 이동
  File /oname=blog.exe "blog_source_directory\blog_gen.exe" ; 일반적인 파일 설치
... 나머지 명령...


댓글을 달아 주세요