Определить ось 32 битка или 64

Тема в разделе "WASM.BEGINNERS", создана пользователем Flasher, 15 апр 2009.

  1. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Собственно сабж.
    Очень желательно без юзания апи, ну или на крайняк токо при юзании ZwQuerySystemInformation. Если задать с инфоклассом SystemProcessorInformation, то моно получить следующие данные.
    Код (Text):
    1. SYSTEM_PROCESSOR_INFORMATION struct
    2. ProcessorArchitecture   USHORT ?        ;PROCESSOR_ARCHITECTURE_* (PROCESSOR_ARCHITECTURE_INTEL)
    3. ProcessorLevel          USHORT ?        ;PROCESSOR_* (PROCESSOR_INTEL_PENTIUM)
    4. ProcessorRevision       USHORT ?        ;Pentium: H=model, L=stepping
    5. Unknown             USHORT ?        ;0
    6. FeatureBits         ULONG ?
    7. SYSTEM_PROCESSOR_INFORMATION ends
    Нету необходимых данный.
    В TEB'e и в PEB'e поискал, тоже ничего путного не нашел, в структуре KUSER_SHARED_DATA нашел поле ProcessorFeatures, но кажется этого тоже самое что FeatureBits.

    Подскажите пожалуйста как быстро и безболезненно получить данную инфу.
     
  2. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    а значения сег. регистров в 32 и в 64 одинаковые? (нет возможности сейчас проверить)
     
  3. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Flasher
    А настроить seh и попробовать выполнить 64 битную asm команду?
     
  4. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    PROCESSOR_ARCHITECTURE_AMD64 = 9;
    PROCESSOR_ARCHITECTURE_IA64 = 6;

    Для проверки что 32-бит программа выполяется под 64-бит ОС МicroSoft рекомендует юзать IsWow64Process
     
  5. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Спасибо всем. Думаю ProcessorArchitecture то что надо..
    Но у себя в windows.inc нашел еще и PROCESSOR_ARCHITECTURE_ALPHA64 equ 7
    Надеюсь кроме этих 3х больще нет 64-битных констант :)
     
  6. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    #define PROCESSOR_ARCHITECTURE_INTEL 0
    #define PROCESSOR_ARCHITECTURE_MIPS 1
    #define PROCESSOR_ARCHITECTURE_ALPHA 2
    #define PROCESSOR_ARCHITECTURE_PPC 3
    #define PROCESSOR_ARCHITECTURE_SHX 4
    #define PROCESSOR_ARCHITECTURE_ARM 5
    #define PROCESSOR_ARCHITECTURE_IA64 6
    #define PROCESSOR_ARCHITECTURE_ALPHA64 7
    #define PROCESSOR_ARCHITECTURE_MSIL 8
    #define PROCESSOR_ARCHITECTURE_AMD64 9
    #define PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 10

    #define PROCESSOR_ARCHITECTURE_UNKNOWN 0xFFFF
     
  7. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    А это #define PROCESSOR_ARCHITECTURE_IA32_ON_WIN64 10 как понять ? :)
     
  8. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    как wow64
     
  9. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    И еще один момент..
    ZwQuerySystemInformation вить возвращает данные о процессоре, а мне надо инфо об оси, вить на 64 битный процессор можно 32 битную ось поставить...
    Это значит что задача еще не решена..
     
  10. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    Думаю для AMD должно помочь
    http://www.rom.by/article/CPUID_sovremennyh_protsessorov_AMD
     
  11. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Не совсем так. Например, процессоры x86-64 (AMD64\EM64T) строго говоря не являются "64-битными", т.к. они могут работать как в 32- так и в 64-битном режиме. Поэтому для них под 32-битной ОС будет возвращаться PROCESSOR_ARCHITECTURE_INTEL, а под 64-битной соотв-но PROCESSOR_ARCHITECTURE_AMD64 или PROCESSOR_ARCHITECTURE_IA32_ON_WIN64

    PS: PROCESSOR_ARCHITECTURE можно также опредилить по соответсвующей переменной окружения (или через GetEnvirnomentVariable или если "без юзанья апи", то самому "пошукать" в блоке окружения
     
  12. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    nobodyzzz, опятьтаки это инфа о самом процессоре, а не инфо об установленной оси.
     
  13. dendi

    dendi New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2007
    Сообщения:
    233
    может прочитать субсистем у своего файла (imagebase брать из PEB).
     
  14. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    На ту же тему что сказал dendi - запускать мелкий тестовый exe с установленым в PE Header ofs=4 / 18h (не помню точно второе смещение) значением "64 битный файлег". Если успешна, то...
     
  15. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    censored
    Код (Text):
    1. cs ss gs fs es ds
    2. 23 2b 2b 53 2b 2b    x64, Compatibility Mode
    3. 33 2b 2b 53 2b 2b    x64, Long Mode
    4. 1b 23 00 ** 23 23    x86
     
     
    Ещё способ - прочитать стабы из ntdll.dll. В 32х-битной ntdll.dll под х64 выглядят так:
    Код (Text):
    1. ZwQuerySystemInformation:
    2.     mov eax,0x33
    3.     xor ecx,ecx     ; WOW64_TURBO_SERVICE_TYPE (0 - ServiceNoTurbo, 1f - Wow64ServiceTypesCount)
    4.     lea edx,[esp+4]
    5.     call fs:[0xC0]
    6.     retn 0x10
    7.  
    8. ZwTerminateJobObject:
    9.     mov eax,0x174
    10.     mov ecx,7        ; WOW64_TURBO_SERVICE_TYPE (0 - ServiceNoTurbo, 1f - Wow64ServiceTypesCount)
    11.     lea edx,[esp+4]
    12.     call fs:[0xC0]   ; Teb32.WOW32Reserved: pointer to wow64cpu!X86SwitchTo64BitMode
    13.     retn 8
    Кроме того, в 32х-разрядных приложениях под 64х битной виндой Teb32.GdiBatchCount — это указатель на Teb64:
    dword fs:[f70] == dword gs:[30]
    (Числа для server2008).

     
    Y_Mur
    Только сначала переключиться в длинный режим нужно... А вот и функция переключения лол:
    wow64cpu!X86SwitchTo64BitMode:
    ea373657753300 jmp 0033:75573637
     
  16. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Нет, возращается информация именно об оси.
    В данном случае PROCESSOR_ARCHITECTURE - это не архитектура физического процессора, а того, под который написана ось.