Помигать Caps Lock

Тема в разделе "WASM.WIN32", создана пользователем Andrei, 14 июн 2018.

  1. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    С каким портом нужно работать ?
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    7
    Регистрация:
    25 июн 2008
    Сообщения:
    2.648

    Урок 6b. Светомузыка на клавиатуре


    (глава из "Сам себе Iczelion")
    Кролики ― это не только ценный мех,
    но и три-четыре килограмма диетического мяса...
    Клавиатура это не только 102 клавиши, но и три волшебные лампочки:
    • Num Lock
    • Caps Lock
    • Scroll Lock
    Если назначение ассемблера ― прямое программирование аппаратуры компьютера, то как программно зажигать и гасить лампочки Caps Lock, Num Lock и Scroll Lock на клавиатуре?
    1. Включаем лампочки функцией keybd_event с параметрами (VK_NUMLOCK (VK_CAPITAL, VK_SCROLL), 45h, KEYEVENTF_EXTENDEDKEY, 0) и гасим keybd_event с параметрами (VK_NUMLOCK (VK_CAPITAL, VK_SCROLL), 45h, (KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP), 0)
      Функция keybd_event синтезирует нажатие клавиши. Система может использовать такое синтезируемое нажатие клавиши, чтобы создать сообщение WM_KEYUP или WM_KEYDOWN. Вызывает функцию keybd_event программа обработки прерываний драйвера клавиатуры.
      Синтаксис
      Код (C++):
      1. VOID keybd_event
      2. (
      3.     BYTE bVk,        // код виртуальной клавиши
      4.     BYTE bScan,        // аппаратный скэн-код
      5.     DWORD dwFlags,    // флажки, определяющие различные параметры функции
      6.     DWORD dwExtraInfo    // дополнительные данные, связанные с нажатием клавиши
      7. )

      Параметры


      bVk Определяет код виртуальной клавиши. Код должен быть значением в диапазоне от 1 до 254. В нашем случае это коды VK_NUMLOCK, VK_CAPITAL, VK_SCROLL
      bScan Определяет для клавиши аппаратный скэн-код.
      dwFlags Набор флаговых битов, которые определяют различные виды операций функции. Прикладная программа может использовать любую комбинацию следующих предопределенных постоянных значений, чтобы установить флажки:
      • KEYEVENTF_EXTENDEDKEY ― Если она установлена, скэн-коду предшествует префиксный байт, имеющий значение 0E0h.
      • KEYEVENTF_KEYUP ― Если установлена, клавиша была отпущена. Если не установлена, клавиша была нажата.
      dwExtraInfo Определяет дополнительное 32-разрядное значение, связанное с нажатием клавиши. В нашем случае ноль.
      Код (ASM):
      1. .686P
      2. .model flat
      3. include windows.inc
      4. includelib user32.lib
      5. includelib kernel32.lib
      6. extern _imp__MessageBoxA@16:dword
      7. extern _imp__keybd_event@16:dword
      8. extern _imp__Sleep@4:dword
      9. .code
      10. start:    xor ebx,ebx; ebx=0
      11.     push ebx ;push 0
      12.     push offset sztext
      13.     push offset szText
      14.     push ebx ;push 0
      15.     call _imp__MessageBoxA@16
      16.     mov edi,80h    ;инициируем счетчик
      17. @@:    mov esi,VK_CAPITAL;счетчик=XXX1b горит CapsLock
      18.     mov eax,VK_NUMLOCK;счетчик=XX1Xb горит NumLock
      19.     mov ecx,VK_SCROLL ;счетчик=X1XXb горит ScrollLock
      20.     test edi,1
      21.     cmovnz esi,eax
      22.     test edi,2
      23.     cmovnz esi,ecx
      24. ;включаем/выключаем индикатор
      25.     push ebx ;dwExtraInfo -- additional data associated with keystroke
      26.     push KEYEVENTF_EXTENDEDKEY;dwFlags flags specifying various function options
      27.     push 45h ;bScan -- hardware scan code
      28.     push esi ;bVk -- virtual-key code
      29.     call _imp__keybd_event@16;иммитируем нажатие на клавишу
      30.     push ebx ;push 0
      31.     push KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP
      32.     push 45h
      33.     push esi
      34.     call _imp__keybd_event@16;иммитируем отпускание клавиши
      35.     push 500
      36.     call _imp__Sleep@4;ждем полсекунды
      37.     dec edi   ;уменьшаем счетчик
      38.     jnz @b
      39.     ret
      40. sztext db "Моё первое приложение",0
      41. szText db "Цветомузыка на Num, Caps и ScrollLock",0
      42. end start
    2. Отладчиком заходим внутрь функции keybd_event и, спускаясь во внутрь вложенных в keybd_event функций, дойдем до int 2Eh или до команды sysenter. Внутри функции keybd_event вложена функция user32.SendInput, которая вызавает sysenter с eax=11F6h. Через int 2Eh программно зажигаем и гасим лампочки Caps Lock, Num Lock и Scroll Lock на клавиатуре.
      Код (ASM):
      1. .686P
      2. .model flat
      3. include windows.inc
      4. includelib user32.lib
      5. includelib kernel32.lib
      6. extern _imp__MessageBoxA@16:dword
      7. extern _imp__Sleep@4:dword
      8. .code
      9. start:    xor ebx,ebx        ;ebx=0
      10.     push ebx         ;push 0
      11.     push offset sztext
      12.     push offset szText
      13.     push ebx         ;push 0
      14.     call _imp__MessageBoxA@16
      15.     mov edi,80h        ;инициируем счетчик
      16. @@:    mov esi,VK_CAPITAL    ;счетчик=XXX1b горит CapsLock
      17.     mov eax,VK_NUMLOCK    ;счетчик=XX1Xb горит NumLock
      18.     mov ecx,VK_SCROLL     ;счетчик=X1XXb горит ScrollLock
      19.     test edi,1
      20.     cmovnz esi,eax
      21.     test edi,2
      22.     cmovnz esi,ecx
      23. ;включаем/выключаем индикатор
      24. ;иммитируем нажатие на клавишу
      25.     sub esp,1Ch
      26.     mov [esp+10h],ebx;dwExtraInfo -- additional data associated with keystroke
      27.     mov [esp+0Ch],ebx
      28.     mov dword ptr [esp+8],KEYEVENTF_EXTENDEDKEY;dwFlags flags specifying various function options
      29.     mov ecx,45FFFFh        ;bScan -- hardware scan code
      30.     mov cx,si        ;bVk -- virtual-key code
      31.     mov [esp+4],ecx
      32.     mov dword ptr [esp],1
      33.     mov ecx,esp
      34.     push 1Ch
      35.     push ecx
      36.     push 1
      37.     mov eax,11F6h        ;SendInput
      38.     mov edx,esp
      39.     int 2Eh
      40.     add esp,3Ch;выравниваю стек
      41. ;иммитируем отпускание клавиши
      42.     mov dword ptr [esp+8],KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP;dwFlags flags specifying various function options
      43.     mov ecx,45FFFFh        ;bScan -- hardware scan code
      44.     mov cx,si        ;bVk -- virtual-key code
      45.     mov [esp+4],ecx
      46.     mov dword ptr [esp],1
      47.     mov ecx,esp
      48.     push 1Ch
      49.     push ecx
      50.     push 1
      51.     mov eax,11F6h        ;SendInput
      52.     mov edx,esp
      53.     int 2Eh
      54.     sub esp,8        ;выравниваю стек
      55.     push 500
      56.     call _imp__Sleep@4    ;ждем полсекунды
      57.     dec edi           ;уменьшаем счетчик
      58.     jnz @b
      59.     ret
      60. sztext db "Моё первое приложение",0
      61. szText db "Цветомузыка на Num, Caps и ScrollLock",0
      62. end start
    3. Через драйвер ― в системе уже есть драйвер управления клавиатурой "\\.\KbdGarland". Поэтому сам драйвер писать не придется. В KmdKit от Four-F есть пример управления состоянием светодидами на клавиатуре. Это модификация этого примера.
      Код (ASM):
      1. .686P
      2. .model flat
      3. include windows.inc
      4. include w2k\ntddkbd.inc
      5. includelib user32.lib
      6. includelib kernel32.lib
      7. extern _imp__MessageBoxA@16:dword
      8. extern _imp__keybd_event@16:dword
      9. extern _imp__Sleep@4:dword
      10. extern _imp__CreateFileA@28:dword
      11. extern _imp__DefineDosDeviceA@12:dword
      12. extern _imp__DeviceIoControl@32:dword
      13. extern _imp__CloseHandle@4:dword
      14. FILE_DEVICE_KEYBOARD            equ 0000000Bh
      15. FILE_ANY_ACCESS            equ 0
      16. METHOD_BUFFERED                 equ 0
      17. .code
      18. start:    xor ebx,ebx    ; ebx=0
      19.     push ebx     ;push 0
      20.     push offset sztext
      21.     push offset szText
      22.     push ebx     ;push 0
      23.     call _imp__MessageBoxA@16
      24.     push offset szText3
      25.     push offset szText4+4
      26.     push DDD_RAW_TARGET_PATH
      27.     call _imp__DefineDosDeviceA@12
      28.     test eax,eax
      29.     jnz short @f
      30.     push MB_ICONEXCLAMATION
      31.     push ebx
      32.     push offset szText1
      33.     push ebx
      34.     call _imp__MessageBoxA@16
      35.     retn
      36. @@:     push ebx
      37.         push ebx
      38.         push OPEN_EXISTING
      39.     push ebx
      40.     push ebx
      41.     push ebx
      42.     push offset szText4
      43.     call _imp__CreateFileA@28
      44.     inc eax        ;.if eax != INVALID_HANDLE_VALUE
      45.     jnz @f
      46.     push MB_ICONEXCLAMATION
      47.     push ebx
      48.     push offset szText5
      49.     push ebx
      50.     call _imp__MessageBoxA@16
      51.     jmp short a6    ;.else
      52. @@:    dec eax
      53.     mov ebp,eax
      54.     push ebx
      55.     push offset dwBytesReturned
      56.     push sizeof kip
      57.     mov esi,offset kip
      58.     push esi
      59.     push ebx
      60.     push ebx
      61.     push IOCTL_KEYBOARD_QUERY_INDICATORS
      62.     push eax    ;hDevice
      63.     call _imp__DeviceIoControl@32
      64.     test eax,eax                            
      65.     jz a2        
      66.     cmp dwBytesReturned,ebx
      67.     jz a2
      68.     assume esi:ptr KEYBOARD_INDICATOR_PARAMETERS
      69.     movzx eax,[esi].LedFlags
      70.     push eax    ;mov LedFlags,eax    
      71.     push 5
      72.     pop edi
      73. @@:    mov [esi].LedFlags, KEYBOARD_NUM_LOCK_ON
      74.      call Do
      75.     mov [esi].LedFlags, KEYBOARD_CAPS_LOCK_ON
      76.     call Do
      77.     mov [esi].LedFlags, KEYBOARD_SCROLL_LOCK_ON
      78.     call Do
      79.     dec edi
      80.     jnz @b        ;.endw
      81.     pop eax        ;mov eax,LedFlags
      82.     mov [esi].LedFlags,ax    ;restore
      83.     push ebx
      84.     push offset dwBytesReturned
      85.     push ebx
      86.     push ebx
      87.     push sizeof kip
      88.     push esi    ;adr kip
      89.     push IOCTL_KEYBOARD_SET_INDICATORS
      90.     push ebp    ;hDevice
      91.     call _imp__DeviceIoControl@32
      92.     assume esi:nothing
      93. a2:    push ebp    ;hDevice
      94.     call _imp__CloseHandle@4
      95. a6:    push ebx
      96.     push offset szText4+4
      97.     push DDD_REMOVE_DEFINITION
      98.     call _imp__DefineDosDeviceA@12
      99.     ret
      100. Do proc
      101.     push ebx
      102.     push offset dwBytesReturned
      103.     push ebx
      104.     push ebx
      105.     push sizeof kip
      106.     push esi;adr kip
      107.     push IOCTL_KEYBOARD_SET_INDICATORS
      108.     push ebp;hDevice
      109.     call _imp__DeviceIoControl@32
      110.     push 100                
      111.     call _imp__Sleep@4
      112.     retn
      113. Do endp
      114. sztext db "Моё первое приложение",0
      115. szText db "Цветомузыка на Num, Caps и ScrollLock",0
      116. szText1 db "Couldn't define link to keyboard device",0
      117. szText3 db "\Device\KeyboardClass0",0
      118. szText4 db "\\.\KbdGarland",0
      119. szText5 db "Couldn't open keyboard device",0
      120. dwBytesReturned dd 0
      121. kip KEYBOARD_INDICATOR_PARAMETERS <>
      122. end start
    4. Еще один "низкоуровневый" способ зажигать и гасить лампочки на клавиатуре Caps Lock, Num Lock и Scroll Lock заключается в записи байта в порт 60h, младшие три бита этого байта определяют состояние светодиодов на лицевой панели клавиатуры. Но WinXP, в отличии от DOS, не "переваривает" обращение к портам ввода/вывода от user-mode программ. Поэтому придется использовать драйвер, который спрячем в ресурсах и вытащим из ресурсов на диск при запуске приложения, по завершению приложения драйвер будем удалять
    Пример использования, исходные тексты во вложении
     

    Вложения:

    • lights4.rar
      Размер файла:
      8,4 КБ
      Просмотров:
      23
    Коцит нравится это.
  3. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Вай, не ожидал такого полного и развернутого ответа, очень порадовало, что есть все таки знающие люди..
    Да и за книгу сеньк, вот нашел где почитать http://www.cyberforum.ru/assembler/thread751124.html
     
    Последнее редактирование: 15 июн 2018
  4. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    7
    Регистрация:
    25 июн 2008
    Сообщения:
    2.648
    Andrei,
    это статья от 2012 года, писалось и проверялось под 32-разрядную Windows XP. Будет ли работать стабильно сейчас, не знаю, не уверен. На ЕХЕ-файл антивирусник обязательно будет верещать, так как у него в ресурсах скрытый драйвер, который устанавливается при запуске ЕХЕ чтобы дать доступ к 60h порту в юзермоде. Как только ЕХЕ закрывается, драйвер уничтожается...
    Что касается статей на сайберфоруме, то ничего кроме оглавления и первой главы прочитать не удастся [​IMG]
     
  5. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Не могу в TASM собрать первый example, для какого компилятора код ?

    15.06.2018 6:44:09 : Assembling file - C:\Users\redd\Desktop\caps.asm
    15.06.2018 6:44:09 : Turbo Assembler Version 4.1 Copyright (c) 1988, 1996 Borland International
    15.06.2018 6:44:10 : Assembling file: caps.asm
    15.06.2018 6:44:10 : **Error** caps.asm(2) 32-bit segments not allowed without .386
    15.06.2018 6:44:10 : **Fatal** caps.asm(3) Can't locate file: windows.inc
    15.06.2018 6:44:10 : Error messages: 2
    15.06.2018 6:44:10 : Warning messages: None
    15.06.2018 6:44:10 : Passes: 1
    15.06.2018 6:44:10 : Remaining memory: 452k
     
  6. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    А где взять полный текст книги ??
    redd@samtel.ru
     
  7. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    window.inc нашел, в masm
    Но все равно

    15.06.2018 7:08:43 : Assembling file - C:\Users\redd\Desktop\caps.asm
    15.06.2018 7:08:47 : Turbo Assembler Version 4.1 Copyright (c) 1988, 1996 Borland International
    15.06.2018 7:08:47 : Assembling file: caps.asm
    15.06.2018 7:08:47 : *Warning* windows.inc(54) Pass-dependent construction encountered: _WININC_
    15.06.2018 7:08:47 : **Error** windows.inc(74) Can't use this outside macro
    15.06.2018 7:08:48 : **Error** windows.inc(75) Can't use this outside macro
    15.06.2018 7:08:48 : **Error** windows.inc(77) Illegal forward reference: PROTO
    15.06.2018 7:08:48 : **Error** windows.inc(113) Illegal forward reference: PROTO
    15.06.2018 7:08:48 : **Error** windows.inc(114) Illegal forward reference: PROTO
    15.06.2018 7:08:48 : *Warning* windows.inc(293) Reserved word used as symbol: PWORD
    15.06.2018 7:08:48 : **Error** windows.inc(326) Illegal forward reference: REAL4
    15.06.2018 7:08:48 : **Error** windows.inc(327) Illegal forward reference: REAL8
    15.06.2018 7:08:48 : Error messages: 7
    15.06.2018 7:08:49 : Warning messages: 2
    15.06.2018 7:08:49 : Passes: 1
    15.06.2018 7:08:49 : Remaining memory: 116k
    15.06.2018 7:08:49 : **Fatal** Out of hash space
     
  8. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Наверное нужно в masm пробовать ...
     
  9. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    В masm32 тоже не собирается, для какого компилятора данные exaples ?
     
  10. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    7
    Регистрация:
    25 июн 2008
    Сообщения:
    2.648
    Andrei,
    написано для masm bat-файл, которым пользовался на тот момент
    Код (Text):
    1. cls
    2. set filename=%1
    3. call :read_settings %filename%
    4. @echo %compiler% %os% %kind_of_file%
    5. if exist %filename%.exe del %filename%.exe
    6. if exist %filename%.com del %filename%.com
    7. if exist %filename%.dll del %filename%.dll
    8. set %compiler%_path=d:\Aquila
    9. goto :%compiler%%os%%kind_of_file%
    10. :wasmwindowsgui
    11. %wasm_path%\bin\wasm -6prs -mf -i%wasm_path%\include\WASM %filename%.asm || exit
    12. %wasm_path%\bin\wlink file %filename%.obj form windows nt op c LIBPath ^
    13. %wasm_path%\lib\ Library user32.lib,kernel32.lib,gdi32.lib
    14. goto :m1
    15. :fasmdoscom
    16. :fasmdosexe
    17. %fasm_path%\bin\fasm %filename%.asm
    18. exit
    19. :goasmwindowsgui
    20. %goasm_path%\bin\GoAsm %filename%
    21. if exist %1.rc (
    22. %goasm_path%\bin\GoRc /r %filename%.rc || exit
    23. %goasm_path%\bin\GoLink %filename%.obj %filename%.res user32.dll kernel32.dll ^
    24. gdi32.dll comctl32.dll shell32.dll ole32.dll comdlg32.dll || exit
    25. del %filename%.res
    26. ) else (
    27. %goasm_path%\bin\GoLink %filename%.obj user32.dll kernel32.dll gdi32.dll ^
    28. comctl32.dll shell32.dll ole32.dll comdlg32.dll
    29. )
    30. goto :m1
    31. :goasmwindowsconsole
    32. %goasm_path%\bin\GoAsm %filename%
    33. %goasm_path%\bin\GoLink /console %filename%.obj kernel32.dll user32.dll ^
    34. winmm.dll gdi32.dll
    35. goto :m1
    36. :lzasmwindowsconsole
    37. :lzasmwindowsgui
    38. %lzasm_path%\bin\lzasm %filename%.asm
    39. %lzasm_path%\bin\alink %filename%.obj -oPE -c -subsys %kind_of_file%
    40. goto :m1
    41. :lzasmdoscom
    42. %lzasm_path%\bin\lzasm %filename%.asm
    43. %lzasm_path%\bin\alink %filename%.obj -oCOM -c
    44. goto :m1
    45. :lzasmdosexe
    46. %lzasm_path%\bin\lzasm %filename%.asm
    47. %lzasm_path%\bin\alink %filename%.obj -oEXE -c
    48. goto :m1
    49. :masmwindowsgui
    50. set masm_path=d:\masm32
    51. if exist %filename%.rc (
    52. %masm_path%\bin\rc /v %1.rc
    53. %masm_path%\bin\cvtres /machine:ix86 %1.res
    54. %masm_path%\bin\ml /c /Cp /Gz /I%masm_path%\include /coff /nologo %filename%.asm  || exit
    55. %masm_path%\bin\PoLink1 /SUBSYSTEM:WINDOWS /ALIGN:4 /MERGE:.data=.text ^
    56. /LIBPATH:%masm_path%\lib /NOLOGO /STUB:%masm_path%\bin\stubby.exe %1.obj %filename%.res || exit
    57. del %filename%.res
    58. ) else (
    59. %masm_path%\bin\ml /c /Cp /Gz /I%masm_path%\include /coff /nologo %filename%.asm  || exit
    60. %masm_path%\bin\PoLink1 /SUBSYSTEM:WINDOWS /ALIGN:4 /MERGE:.data=.text ^
    61. /LIBPATH:%masm_path%\lib /NOLOGO /STUB:%masm_path%\bin\stubby.exe %filename%.obj
    62. )
    63. goto :m1
    64. :tasmwindowsgui
    65. %tasm_path%\bin\tasm32 /I%tasm_path%\include\TASM /q /z %filename%.asm  %filename%.obj /ml/m3
    66. %tasm_path%\bin\ilink32 -L%tasm_path%\lib /Tpe /aa /c /o /x %filename%.obj
    67. goto :m1
    68. :tasmwindowsconsole
    69. %tasm_path%\bin\tasm32 /I%tasm_path%\include\TASM %filename%.asm /ml /m3 /q /z %filename%.obj
    70. %tasm_path%\bin\ilink32 -L%tasm_path%\lib /Tpe /ap /c /o /x %filename%.obj
    71. goto :m1
    72. :nasmwindowsconsole
    73. :nasmwindowsgui
    74. %nasm_path%\bin\nasmw -O1 -f bin %filename%.asm -o %filename%.exe ^
    75. -I%nasm_path%\include\NASM\
    76. exit
    77. :nasmdoscom
    78. :nasmdosexe
    79. :nasmwindowsdll
    80. %nasm_path%\bin\nasmw -f bin %filename%.asm -o %filename%.%kind_of_file% ^
    81. -I%nasm_path%\include\NASM\
    82. exit
    83. :tasmdoscom
    84. %tasm_path%\bin\tasm %filename%.asm
    85. %tasm_path%\bin\tlink /t/x %filename%.obj
    86. goto :m1
    87. :tasmdosexe
    88. %tasm_path%\bin\tasm %filename%.asm
    89. %tasm_path%\bin\tlink /x %filename%.obj
    90. goto :m1
    91. :wasmdoscom
    92. %wasm_path%\bin\wasm %filename%.asm
    93. %wasm_path%\bin\wlink file %filename%.obj form dos com
    94. goto :m1
    95. :wasmdosexe
    96. %wasm_path%\bin\wasm %filename%.asm
    97. %wasm_path%\bin\wlink file %filename%.obj form dos
    98. goto :m1
    99. :poasmwindowsconsole
    100. %poasm_path%\bin\poasm /Gz /I%poasm_path%\include\PoAsm %filename%.asm
    101. %poasm_path%\bin\polink /SUBSYSTEM:CONSOLE /LIBPATH:%poasm_path%\lib /MERGE:.data=.text %filename%.obj
    102. goto :m1
    103. :masmdoscom
    104. %masm_path%\bin\ml /AT /c %filename%.asm
    105. %masm_path%\bin\link16 /T %filename%.obj,,,,,
    106. goto :m1
    107. :masmdosexe
    108. %masm_path%\bin\ml /c %filename%.asm
    109. %masm_path%\bin\link16 %filename%.obj,,,,,
    110. :m1
    111. if exist %filename%.map del %filename%.map
    112. if exist %filename%.obj del %filename%.obj
    113. if exist %filename%.ilc del %filename%.ilc
    114. if exist %filename%.ild del %filename%.ild
    115. if exist %filename%.ilf del %filename%.ilf
    116. if exist %filename%.ils del %filename%.ils
    117. if exist %filename%.tds del %filename%.tds
    118. exit
    119. :read_settings
    120. for /f "eol=# tokens=2-5" %%A in (%filename%.asm) do (
    121. set compiler=%%A
    122. set os=%%B
    123. set kind_of_file=%%C
    124. if %%D == # exit /b )
    125. exit /b
    там в первой строке каждого asm-файла стоит
    Код (ASM):
    1. ; masm windows gui #
     
  11. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Ёe маЁ батник больше программы, ....
    Я через GUI пробовал вот так выглядит ...
     

    Вложения:

    • caps.png
      caps.png
      Размер файла:
      86,5 КБ
      Просмотров:
      94
  12. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    7
    Регистрация:
    25 июн 2008
    Сообщения:
    2.648
    Andrei,
    это универсальный bat-файл, он по первой строке определяет компилятор (masm, tasm, fasm и т.д.), требуемую ось (Win, DOS) и требуемый тип файла (COM, DLL, SYS, GUI-EXE, CONSOLE-EXE и т.д.) и передает управление на ту строку, которая нужна юзеру
     
    Andrei нравится это.
  13. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Ок
     
  14. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Вот нельзя из под Win с портами работать, а ежели писать напрямую в параллельный порт, какой там у него адрес 378 или 3f8 вроде, сработает ??? Ну win позволит писать в параллельный порт ну или RS232 напрямую ?
     
  15. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    7
    Регистрация:
    25 июн 2008
    Сообщения:
    2.648
    нет, с портами работают только через драйвера
     
  16. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
  17. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    7
    Регистрация:
    25 июн 2008
    Сообщения:
    2.648
    Ещё раз о прямом доступе к аппаратуре
     
  18. Andrei

    Andrei Member

    Публикаций:
    0
    Регистрация:
    13 апр 2018
    Сообщения:
    322
    Ок, я прочитал, статью, ,.. значит читать можно
     
  19. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    2.030
    Mikl___,

    > Но WinXP, в отличии от DOS, не "переваривает" обращение к портам ввода/вывода от user-mode программ.

    Как раз таки XP позволяла открыть прямой доступ к портам и даже не одним путём. Можно было напрямую сервисным вызовом из юм изменить IOPL, из км можно было перенастроить IOPM. Вот только такое нельзя было отлаживать, ну или нужно было делать аккуратно - cli в олли вешала всю систему.

    Andrei,

    > Вот нельзя из под Win с портами работать, а ежели писать напрямую в параллельный порт, какой там у него адрес 378 или 3f8 вроде

    Это мера безопасности, порты не должно трогать приложение. Во первых для него их нет, есть слой абстракции от железа и причём не один, оно виртуальное. Обходной путь конечно же найти можно, но так не следует делать. Нужно собрать драйвер, который будет обслуживать железку. Через него вы будете с ней работать.

    Адреса старого lpt изменялись, их нужно было брать из конфигурации. Сейчас таких портов нет, всюду usb. Можно взять готовый контроллер, который реализует usb интерфейс в параллельный gpio, они стоят копейки. При этом нет рисков упалить всё, подключая не понятные девайсы к портам.
     
  20. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    7
    Регистрация:
    25 июн 2008
    Сообщения:
    2.648
    Indy_,
    WinXP сейчас почти исчез, может быть поделитесь, как в ХР в юм можно было открыть прямой доступ к аппаратуре (портам)? Просто перечислите способы (можно и через ЛС)