Современные решения

для защиты Windows приложений

и восстановления исходного кода
Автор: xen. Дата публикации: 10.08.2004

Определяем тип процессора


Следующая процедура WhatCPU определяет тип процессора, установленного в системе. Результат возвращается в регистре AX. Процедура может быть откомпилирована и 16-битным компилятором, несмотря на то, что в ней используются 32-битные инструкции для определения различия между 386, 486 и Pentium.

WhatCPU proc ;POW38 ;Результат в AX ;0: i88,i86, 1: i186, 2: i286, 3: i386, 4: i486, 5: Pentium pushf ;сохраняем флаги mov DX,0F000h sub AX,AX push AX ;записываем 0 в верхушку стека popf ;восстанавливаем регистр флагов из стека pushf ;записываем флаги в стек pop AX popf ;восстанавливаем флаги and AX,DX ;выделяем четыре старших байта cmp AX,DX ;они равны 1 ? jne CPU_ei8088 mov AX,0 ;результат 0 (8088 или 8086) ret CPU_ei8088: push SP pop BX cmp BX,SP ;изменяется ли указатель стека перед записыванием в него? je CPU_ei186 mov AX,1 ;результат 1 (80186) ret CPU_ei186: pushf ;сохраняем флаги mov AX,DX ;0F000h push AX popf pushf pop AX popf ;оригинальные флаги and AX,DX jne CPU_ei286 mov AX,2 ;результат 2 (80286) ret CPU_ei286: db 66h pushf ;pushfd db 66h pushf ;pushfd db 66h pop AX ;pop EAX db 66h or AX,0000h db 04h,00h ;или EAX,00040000h db 66h push AX ;push EAX db 66h popf ;popfd db 66h pushf ;pushfd db 66h pop AX ;pop EAX db 66h popf ;popfd db 66h test AX,0000h db 04h,00h ;test EAX,00040000h jnz CPU_ei386 db 66h mov AX,3 ;результат AX=00000003h (80386) db 0h,0h ret CPU_ei386: db 66h pushf ;pushfd db 66h pushf ;pushfd db 66h pop AX ;pop EAX db 66h mov BX,AX ;mov EBX,EAX db 66h xor AX,0000h db 20h,00h ;xor EAX,00200000h db 66h push AX ;push EAX db 66h popf ;popfd db 66h pushf ;pushfd db 66h pop AX ;pop EAX db 66h popf ;popfd db 66h and AX,0000h db 20h,00h ;and EAX,00200000h db 66h and BX,0000h db 20h,00h ;and EBX,00200000h db 66h cmp AX,BX ;cmp EAX,EBX jne CPU_ei486 db 66h mov AX,4 ;результат EAX=00000004h (80486) db 0h,0h db 66h ;обнуление 32 битных регистров xor BX,BX ;xor EBX,EBX ret CPU_ei486: ;Pentium db 66h mov AX,5 ;результат EAX=00000005h (Pentium) db 0h,0h db 66h xor BX,BX ;xor EBX,EBX ret WhatCPU endp


Комментарии

отсутствуют

Добавление комментария


Ваше имя (на форуме):

Ваш пароль (на форуме):

Комментарии могут добавлять только пользователи,
зарегистрированные на форуме данного сайта. Если Вы не
зарегистрированы, то сначала зарегистрируйтесь тут

Комментарий: