Консольная INPUT_RECORD на fasm

Тема в разделе "WASM.ASSEMBLER", создана пользователем t00x, 29 окт 2007.

  1. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    Код (Text):
    1. typedef struct _INPUT_RECORD {  
    2.      WORD EventType;  
    3.      union {    
    4.           KEY_EVENT_RECORD KeyEvent;    
    5.           MOUSE_EVENT_RECORD MouseEvent;
    6.           WINDOW_BUFFER_SIZE_RECORD WindowBufferSizeEvent;
    7.           MENU_EVENT_RECORD MenuEvent;
    8.           FOCUS_EVENT_RECORD FocusEvent;
    9.      } Event;
    10. } INPUT_RECORD;
    подскажите, как переписать для fasm'а данную структуру.
     
  2. Mi256

    Mi256 New Member

    Публикаций:
    0
    Регистрация:
    24 сен 2007
    Сообщения:
    116
    А что в ней не так? Набор переменных word и dword...
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    t00x
    Код (Text):
    1. struct INPUT_RECORD
    2.   EventType dw ?
    3.   union
    4.     KeyEvent KEY_EVENT_RECORD
    5.     MouseEvent MOUSE_EVENT_RECORD
    6.     ...
    7.   ends
    8. ends
     
  4. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    IceStudent
    надо ещё к union Event обращаться.

    P.S. Спасибо, разобрался
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    IceStudent
    Imho
    Код (Text):
    1. struct INPUT_RECORD
    2.   EventType dw ?
    3.   __alignmentDummy dw ?
    4.   union
    5.     KeyEvent KEY_EVENT_RECORD
    6. ...
     
  6. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    q_q
    subj в #1 из WinCon.h и работает ;)
     
  7. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    t00x
    Попробуй:
    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3. int main(void)
    4. {
    5.   printf("%d\n", FIELD_OFFSET(INPUT_RECORD, Event));
    6.   return 0;
    7. }
     
  8. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    q_q
    Да, ты прав. Надо бы ввести поддержку выравнивания в структуры.
     
  9. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    q_q
    довесок к INPUT_RECORD:
    Код (Text):
    1. struct KEY_EVENT_RECORD
    2.   bKeyDown dw ?
    3.   wRepeatCount dw ?
    4.   wVirtualKeyCode dw ?
    5.   wVirtualScanCode dw ?
    6.   union
    7.     UnicodeChar dw ?
    8.     AsciiChar db ?
    9.   ends
    10.   dwControlKeyState dw ?
    11. ends
    прочитал из памяти Olly и поменял high-low bytes:
    0001 0000 0001 0000 0001 0020 0039 0020 0000
    Код (Text):
    1. EventType = 0001
    00402018 - адрес INPUT_RECORD.EventType
    0040201A - адрес INPUT_RECORD.KEY_EVENT_RECORD.bKeyDown
    если так, как вы пишите, то и
    INPUT_RECORD.EventType и INPUT_RECORD.KEY_EVENT_RECORD.bKeyDown имеют размерность dd.

    P.S. нажимал пробел
     
  10. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    t00x
    если так, как вы пишите, то и INPUT_RECORD.EventType ... имеют размерность dd.
    Не правда.
    Я утверждал, что после INPUT_RECORD.EventType, который занимает два байта, следуют два байта для выравнивания.

    INPUT_RECORD.KEY_EVENT_RECORD.bKeyDown имеют размерность dd.
    В этом можешь убедиться сам
    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3. int main(void)
    4. {
    5. // проверка "по рабоче-крестьянски"
    6.   KEY_EVENT_RECORD ker;
    7.   printf("%d\n", sizeof(ker.bKeyDown));
    8.  
    9. // проверка "по-научному"
    10.   printf("%d\n", RTL_FIELD_SIZE(KEY_EVENT_RECORD, bKeyDown));
    11.   return 0;
    12. }
    dwControlKeyState dw ?
    Ошибка. dwControlKeyState имеет размер четыре байта. Проверь
    Код (Text):
    1. printf("%d\n", RTL_FIELD_SIZE(KEY_EVENT_RECORD, dwControlKeyState));
     
  11. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    q_q
    Спасибо за разъяснения.
    P.S. INPUT_RECORD.KEY_EVENT_RECORD.bKeyDown описан как тип BOOL, == int.