Таблицы API для разных версий Windows

Тема в разделе "WASM.NT.KERNEL", создана пользователем katrus, 17 май 2009.

  1. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Flasher
    Может проще cpuid или типо того заюзать, чтото не надёжно эту переменную читать, в XPSP3 любое GUI-приложение её читает, а ядро туда пишет и тоже читает при вызове GUI-калбэка.
     
  2. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    CPUID не кроспроцессорный :)
    А TEB.GdiBatchCount можно один рас прочитать в начале загрузки, поставить флаг, и го го го :P Туточки еще поднимал это вопрос.
     
  3. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Flasher
    GdiBatchCount никак с разрядностью не связан, плохое решение, сделаное на основе не полноценного опыта. Почемуже cpuid не кросплатформенный ?
     
  4. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Из Википедия.
    Я писал кроспроцессорный.
    Да и если и юзать CPUID, инструкция разве не возвращает разрядность процессора ? А нам нужно оси, ибо на 64 битный проц моно ставить 32х битную винду.

    Clerk, и чем тебе GdiBatchCount не понравился, вить данный метод чекания работает и на ХР 32\64, и на Висте 32\64, надо еще на Семрке тестить, думаю и там проблем не будет.
     
  5. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Flasher
    Ну так ведь на 64-разрядную ось x32 камень не поставить.
    GdiBatchCount мне не понравился тем, что я не вижу связи этой переменной с разрядностью.
     
  6. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    А у меня такой вот вопросс:

    Можно ли написать алгоритм получения адреса ф-ции (если она есть в SDT) под разными системами не вишвая ее индексы? Т.е. не хранить таблицы индексов функций, а хранить какие-нидь настройки для поиска, ну скажем имена функций.

    Занимался ли кто этим? В каком направлении копать?
     
  7. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Довольно все просто: делаешь поиск ntdll -> поиск таблицы экспорта -> поиск адрес функции в памяти по имени функции (ZwOpenFile для примера) -> и берешь число по смешению (FuncAddr+1)

    Это будет номер сервиса в данной ОС
     
  8. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Есть одно "но": много функций не экспортируются. В теневой таблице почти все функции не экспортирутся.
     
  9. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    это поиск только для ssdt таблице, чтобы искать для шадова - нужно дебажить код, а это не очень то легко
     
  10. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    вернее написать что это поиск для ntoskrnl сервисов.
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Можно из ядерного стуба взять номер, если он экспортируется:
    Код (Text):
    1. SYSTEM_STUB_ENTRY struct
    2. OpLoadService   BYTE ?  ;0xB8       mov eax,ServiceNumber
    3. ServiceNumber   ULONG ?
    4. OpLoadEdx   DWORD ? ;0x0424548D lea edx,[esp + 4]
    5. OpSaveFlags BYTE ?  ;0x9C       pushfd
    6. OpSaveCs    WORD ?  ;0x086A     push KGDT_R0_CODE   ;CS = 8
    7. OpCallService   BYTE ?  ;0xE8       call KiSystemService
    8. Displacement    ULONG ? ;
    9. OpReturn    BYTE ?  ;0xC2 / 0xC3    ;ret
    10. SizeOfStack BYTE ?  ;Present if OpReturn = 0xC2
    11. SYSTEM_STUB_ENTRY ends
    12. PSYSTEM_STUB_ENTRY typedef ptr SYSTEM_STUB_ENTRY
     
  12. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    AntiB
    не все сисколы не имеют преамбулы, иногда достаточно непростой. (такого мало, но оно есть)

    и до висты сп1 (32) номера не зависят от сервиспака а только от версии ос

    кроме того, одинаковые сервисы в разных версиях выни могут иметь разные имена/синонимы

    это не только для нтдлл
     
  13. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    но вот с анонимными сервисами не все понятно.. с их отловом
     
  14. SashaTalakin

    SashaTalakin New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2008
    Сообщения:
    261
    у меня по в соседней комнате амд64 с 32битной ос
     
  15. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    SashaTalakin
    у тебя 32-битная ОС на 64-битном процессоре.

    а здесь
    наоборот.
     
  16. SashaTalakin

    SashaTalakin New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2008
    Сообщения:
    261
    Microedition
    так беседа о том что cpuid нельзя использовать для определения разрядности ос
     
  17. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    а WIN7_RC -- это Windows Server 2008 R2 ?
     
  18. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Windows 7 RC, очевидно.
     
  19. sasha_s

    sasha_s New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2005
    Сообщения:
    165
    Адрес:
    Belarus
    И как ее отличить от WIN7 BETA? (http://msdn.microsoft.com/en-us/library/ms724833(VS.85).aspx)

    Потому как индексы у них отличаются (как минимум в SHADOW SDT).
     
  20. Flasher

    Flasher Member

    Публикаций:
    0
    Регистрация:
    31 янв 2004
    Сообщения:
    640
    Как минимум по NtBuildNumber, смотры выше.