Что нового

Эмуляция через ps/2 порт работает, но не всегда

Gab2010

Новичок
Сообщения
5
Репутация
0
Искал информацию по эмуляции через порт пс/2 устройств, нашел в прикрепленной в разделе теме ( http://autoit-script.ru/index.php/topic,14307.0.html ) вот это:

*извините, вам запрещено оставлять внешние ссылки*

Скачал, посмотрел, запустил, запутался.

В архиве приложен скрипт "IOKeyboardExamples", текст которого вы можете увидеть под спойлером. Ничего ценного там нет, там просто вызываются функции из соседнего скрипта.

Код:
;~ #include "[Includes]\_IOFunctions.au3"
#include "[Includes]\_IOKeyboardFunctions.au3"
; ===============================================================================================================================
; <IOKeyboardExamples.au3>
;
; Example use of _IOFunctions in relation to the PS/2 keyboard & controller.
;	NOTE: Functions are specific to PS/2 Keyboards and will not affect USB keyboards!
;
; Functions:
;	_IO_KeyboardLEDFlash()		; Randomly lights/unlights the LED's on the keyboard before restoring them
;	_IO_UACThwartExample()		; Attempts to thwart the UAC prompt (doesn't seem to work all the time..)
;	_IO_KeySendCtrlAltDel()		; Sends the CTRL-ALT-DEL key sequence that is otherwise impossible to do
;	_IO_KeyboardBlockTemporarily()	; Temporarily blocks PS/2 keyboard input (for x ms)
;
; References:
;	Keyboard scancodes (and commands)
;		@ http://www.win.tue.nl/~aeb/linux/kbd/scancodes.html
;		& http://www.win.tue.nl/~aeb/linux/kbd/scancodes-1.html
;
; Author: Ascend4nt
; ===============================================================================================================================

; ===================================================================================================================
; 	MAIN CODE
; ===================================================================================================================

If Not _IO_Initialize() Then Exit _
	MsgBox(48,"DLL or IO Driver failed to load","DLL or IO Driver failed to load, possibly due to an install issue."&@CRLF& _
		"If this is the first time using the DLL/Driver, please run the driver install."&@CRLF&"(Either IOInstallx86 or IOInstallx64)")

;ConsoleWrite("0x64: "&Hex(_IO_InB(0x64))&@CRLF)
MsgBox(0,"LED Flashing","Watch the LED lights go nuts on the PS/2 keyboard")
_IO_KeyboardLEDFlash()
MsgBox(0,"UAC Thwart Example","If all goes well this will run a script requiring elevation and automatically 'press' Yes")
If Not _IO_UACThwartExample() Then MsgBox(0,"Failed","Failed to catch UAC window"&@CRLF&"This can be finicky in certain setups.")
MsgBox(48,"Disabling PS/2 Keyboard Temporarily!","PS/2 Keyboard will be disabled for 5 seconds when you hit OK")
_IO_KeyboardBlockTemporarily(5000)
MsgBox(0,"Ctrl-Alt-Delete send","Ctrl-Alt-Delete will now be sent.")
_IO_KeySendCtrlAltDel()


; ===================================================================================================================
; Func _IO_KeyboardLEDFlash()
;
; Mucks about with the LED's on a PS/2 keyboard before restoring them.
;	Note that no status-change messages are sent to the O/S (it still retains previous settings)
;	Therefore the _IO_KeyboardLEDRestore() call is important to restore the LED's to reflect the current O/S setting
;
; Author: Ascend4nt
; ===================================================================================================================

Func _IO_KeyboardLEDFlash()
	; Now just randomly flash them
	For $i=0 To 7
		_IO_KeyboardLED($i)
		Sleep(350)
	Next
	_IO_KeyboardLEDRestore()
EndFunc


; ===================================================================================================================
; Func _IO_UACThwartExample()
;
; Thwart Windows UAC.
;	NOTE: Doesn't always seem to work, as the system setup may make it work a bit fickle..
;	 - I've seen it hide under other windows in some cases??
;	 Most of the time however, it is brought front and center.
;
; Author: Ascend4nt
; ===================================================================================================================

Func _IO_UACThwartExample()
	Run(@ComSpec&' /c start IOInstallx64.au3',@ScriptDir,@SW_HIDE)
	ProcessWait("consent.exe",5000)
	; In some weird situations, the window isn't brought front-and-center, and I haven't yet figured out how
	;	to catch those situations and figure a way to bring it forward. (perhaps Alt-Tab..)
	;	Weird thing is, when I've seen it 'hide' under other windows, it pauses execution of the program!
	If Not ProcessExists("consent.exe") Then Return False
	Sleep(250)
	_IO_KeySend(0x38)	; ALT-Down
	Sleep(20)	; Putting in sleeps between key-sends decreases the chance that the O/S will miss certain keypresses
	_IO_KeySend(0x15)	; Y
	Sleep(30)
	_IO_KeySend(0xB8)	; ALT-Up (0x38+0x80)
	Return True
EndFunc


; ===================================================================================================================
; Func _IO_KeySendCtrlAltDel()
;
; Sends CTRL-ALT-DEL using I/O ports.  This would otherwise be impossible to emulate using AutoIt.
;
; Author: Ascend4nt
; ===================================================================================================================

Func _IO_KeySendCtrlAltDel()
;~ 	Send("{NUMLOCK on}")	; Not needed - NumLock state doesn't matter in this case - just the basic Numpad key
	_IO_KeySend(0x1D)		; CTRL-Down
	Sleep(20)
	_IO_KeySend(0x38)		; ALT-Down
	Sleep(20)
	_IO_KeySend(0x53)		; Keypad Delete or '.' (in NumLock-off mode)
	Sleep(20)
	_IO_KeySend(0x38+0x80)	; ALT-Up
	Sleep(20)
	_IO_KeySend(0x1D+0x80)	; CTRL-Up
EndFunc


; ===================================================================================================================
; Func _IO_KeyboardBlockTemporarily($iTime)
;
; Temporarily blocks keyboard input (for x ms)
;
; Author: Ascend4nt
; ===================================================================================================================

Func _IO_KeyboardBlockTemporarily($iTime)
	_IO_KeyboardDisable()
	Sleep($iTime)
	_IO_KeyboardReEnable()
EndFunc

Наблюдается явление: метод _IO_KeySendCtrlAltDel() иногда работает, а иногда - нет. И я не знаю, от чего это зависит, иногда не происходит вообще ничего, иногда зажимается (и не отжимается) ctrl или alt, иногда все работает как нужно и таки выкидывает в специальный экран семерки для этой комбинации клавиш.
Ради эксперимента менял задержки в методе с 20 до 100 мс, ничего не изменилось. Кто-нибудь знает, что это такое и почему оно себя так ведет?

p.s Поскольку, ссылку в тему прикрепил некто lirikmel, хотел написать ему в личку, но увидел огромный красный баннер "не используйте личку для вопросов - создайте тему", и вот, я здесь.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
А клава у тебя какая? ps/2 или usb?
Меня смутила вот эта строка в комменте: NOTE: Functions are specific to PS/2 Keyboards and will not affect USB keyboards!
 
Автор
G

Gab2010

Новичок
Сообщения
5
Репутация
0
Ps/2, конечно...
Мышь usb, но я, вроде, ничего от мыши и не требовал.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Тогда увы ничем не могу помочь. Эмуляцией клавиатуры с мышью в обход стандартных функций автоита не занимался.
 
Автор
G

Gab2010

Новичок
Сообщения
5
Репутация
0
Да я, в общем-то, надеялся на lirikmel-а, ему ссылку на тему прикрепил в личку, но человек, видимо, редко заходит
 

Prog

Продвинутый
Сообщения
593
Репутация
73
Используйте аппаратный эмулятор клавиатуры.
 

lirikmel

Продвинутый
Сообщения
226
Репутация
84
Gab2010 сказал(а):
Да я, в общем-то, надеялся на lirikmel-а, ему ссылку на тему прикрепил в личку, но человек, видимо, редко заходит
Но я все таки зашел )
1. то что действует не всегда - это залипает нужны правильные паузы и периодическая очистка порта
2. проверяйте наличие драйвера Winio.sys при инициализации (само собой у вас должна быть отключена проверка цифровых подписей на винде)
можно проверить ProcessExplorer om например.
Код:
global $key[2]
Global $sFileD=@ScriptDir&"\WinIO32.dll" ;или 64 битная версия если у вас 64 битная винда
If Not FileExists($sFileD) Then Exit ; проверка наличия dll  рядом со скриптом
DllOpen($sFileD) ; открываем
DllCall($sFileD, "bool", "InitializeWinIo") ; инициализируем
__wSend("s") отправляем 
DllCall($sFileD, "none", "ShutdownWinIo"); гасим winio (если мы продолжаем нажимать делать этого не надо)
DllClose($sFileD)


Сам процесс нажатия как раз чтобы ничего не зависало:
Код:
Func __wSend($Param1, $Param2 = 300, $Param3="no param")
    local $wkey =_GetHexKey($Param1)
    Select
        Case $Param3="down" : зажимаем клавишу
            DllCall($sFileD, "bool", "SetPortVal", "word", 0x64, "dword", 0xD2,  "byte", 1) ; сбрасываем состояние всех кнопок на клавиатуре(очищаем порт)
            sleep(30)
            DllCall($sFileD, "bool", "SetPortVal", "word", 0x60, "dword", $wkey[0] , "byte", 1) ; отправляем состояние зажатия определенной
            Sleep(Random(30,40))
            Return
        Case $Param3="up"
            DllCall($sFileD, "bool", "SetPortVal", "word", 0x64, "dword", 0xD2,  "byte", 1) ; сбрасываем состояние всех кнопок на клавиатуре(очищаем порт)
            sleep(30)
            DllCall($sFileD, "bool", "SetPortVal", "word", 0x60, "dword", $wkey[1], "byte", 1) ; отправляем состояние поднятия определенной
            Sleep(Random(30,40))
            Return
    EndSelect
    DllCall($sFileD, "bool", "SetPortVal", "word", 0x64, "dword", 0xD2,  "byte", 1) ; сбрасываем состояние всех кнопок на клавиатуре(очищаем порт)
    sleep(30)
    DllCall($sFileD, "bool", "SetPortVal", "word", 0x60, "dword", $wkey[0] , "byte", 1) ; отправляем состояние зажатия определенной
    Sleep($Param2)
    DllCall($sFileD, "bool", "SetPortVal", "word", 0x64, "dword", 0xD2,  "byte", 1) ;  сбрасываем состояние всех кнопок на клавиатуре(очищаем порт)
    sleep(30)
    DllCall($sFileD, "bool", "SetPortVal", "word", 0x60, "dword", $wkey[1], "byte", 1) ;  отправляем состояние поднятия определенной
    Sleep(Random(30,40))
EndFunc

Func _GetHexKey($sKey)
    Switch $sKey
        Case "BACKSPACE"
            $key[0] ="0x0E"
            $key[1] ="0x8E"
            Return $key
        Case "BACKSPACE"
            $key[0] ="0x0E"
            $key[1] ="0x8E"
            Return $key
        Case "TAB"
            $key[0] ="0x0F"
            $key[1] ="0x8F"
            Return $key
       Case "ENTER"
            $key[0] ="0x1C"
            $key[1] ="0x9C"
            Return $key
        Case "SHIFT"
            $key[0] ="0x2A"
            $key[1] ="0xAA"
            Return $key
        Case "CTRL"
            $key[0] ="0x1D"
            $key[1] ="0x9C"
            Return $key
        Case "ALT"
            $key[0] ="0x38"
            $key[1] ="0xB8"
            Return $key
        Case "PAUSE"
            $key[0] ="E0 1D"
            $key[1] =" "
            Return $key
        Case "CAPSLOCK"
            $key[0] ="0x3A"
            $key[1] ="0xBA"
            Return $key
        Case "ESC"
            $key[0] ="0x1"
            $key[1] ="0x81"
            Return $key
        Case "SPACE"
            $key[0] ="0x39"
            $key[1] ="0xB9"
            Return $key
        Case "PAGE UP"
            $key[0] ="0xE0 49"
            $key[1] ="0xC9"
            Return $key
        Case "PAGE DOWN"
            $key[0] ="0xE0 51"
            $key[1] ="0xD1"
            Return $key
        Case "END"
            $key[0] ="0xE0 4F"
            $key[1] ="0xCF"
            Return $key
        Case "HOME"
            $key[0] ="0xE0 47"
            $key[1] ="0xC7"
            Return $key
        Case "LEFT"
            $key[0] ="0xE0 4B"
            $key[1] ="0xCB"
            Return $key
        Case "UP"
            $key[0] ="0xE0 48"
            $key[1] ="0xC8"
            Return $key
        Case "RIGHT"
            $key[0] ="0xE0 4D"
            $key[1] ="0xCD"
            Return $key
        Case "DOWN"
            $key[0] ="0xE0 50"
            $key[1] ="0xD0"
            Return $key
        Case "PRINT SCREEN"
            $key[0] ="0x37"
            $key[1] ="0xB7"
            Return $key
        Case "INS"
            $key[0] ="0x52"
            $key[1] ="0xD2"
            Return $key
        Case "DEL"
            $key[0] ="0x53"
            $key[1] ="0xD3"
            Return $key
        Case "0"
            $key[0] ="0x0B"
            $key[1] ="0x8B"
            Return $key
        Case "1"
            $key[0] ="0x2"
            $key[1] ="0x82"
            Return $key
        Case "2"
            $key[0] ="0x3"
            $key[1] ="0x83"
            Return $key
        Case "3"
            $key[0] ="0x4"
            $key[1] ="0x84"
            Return $key
        Case "4"
            $key[0] ="0x5"
            $key[1] ="0x85"
            Return $key
        Case "5"
           $key[0] ="0x6"
            $key[1] ="0x86"
            Return $key
        Case "6"
            $key[0] ="0x7"
            $key[1] ="0x87"
            Return $key
        Case "7"
            $key[0] ="0x8"
            $key[1] ="0x88"
           Return $key
        Case "8"
            $key[0] ="0x9"
            $key[1] ="0x89"
            Return $key
        Case "9"
            $key[0] ="0x0A"
            $key[1] ="0x8A"
            Return $key
        Case "A"
            $key[0] ="0x1E"
            $key[1] ="0x9F"
            Return $key
        Case "B"
            $key[0] ="0x30"
            $key[1] ="0xB0"
            Return $key
        Case "C"
            $key[0] ="0x2C"
            $key[1] ="0xAE"
            Return $key
        Case "D"
            $key[0] ="0x20"
            $key[1] ="0xA0"
            Return $key
        Case "E"
            $key[0] ="0x12"
            $key[1] ="0x92"
            Return $key
        Case "F"
            $key[0] ="0x21"
            $key[1] ="0xA1"
            Return $key
        Case "G"
            $key[0] ="0x22"
            $key[1] ="0xA2"
            Return $key
        Case "H"
            $key[0] ="0x23"
            $key[1] ="0xA3"
            Return $key
        Case "I"
            $key[0] ="0x17"
            $key[1] ="0x97"
            Return $key
        Case "J"
            $key[0] ="0x24"
            $key[1] ="0xA4"
            Return $key
        Case "K"
            $key[0] ="0x25"
            $key[1] ="0xA5"
            Return $key
        Case "L"
            $key[0] ="0x26"
            $key[1] ="0xA6"
            Return $key
        Case "M"
            $key[0] ="0x32"
            $key[1] ="0xB2"
            Return $key
        Case "N"
            $key[0] ="0x31"
            $key[1] ="0xB1"
            Return $key
        Case "O"
            $key[0] ="0x18"
            $key[1] ="0x98"
            Return $key
        Case "P"
            $key[0] ="0x19"
            $key[1] ="0x99"
            Return $key
        Case "Q"
            $key[0] ="0x10"
            $key[1] ="0x90"
            Return $key
        Case "R"
            $key[0] ="0x13"
            $key[1] ="0x93"
            Return $key
        Case "S"
            $key[0] ="0x1F"
            $key[1] ="0x9F"
            Return $key
        Case "T"
            $key[0] ="0x14"
            $key[1] ="0x94"
            Return $key
        Case "U"
            $key[0] ="0x16"
            $key[1] ="0x96"
            Return $key
        Case "V"
            $key[0] ="0x2F"
            $key[1] ="0xAF"
            Return $key
        Case "W"
            $key[0] ="0x11"
            $key[1] ="0x91"
            Return $key
        Case "X"
            $key[0] ="0x2D"
            $key[1] ="0xAD"
            Return $key
        Case "Y"
            $key[0] ="0x15"
            $key[1] ="0x95"
            Return $key
        Case "Z"
            $key[0] ="0x2C"
            $key[1] ="0xAC"
           Return $key
        Case "F1"
            $key[0] ="0x3B"
            $key[1] ="0xBB"
            Return $key
        Case "F2"
            $key[0] ="0x3C"
            $key[1] ="0xBC"
            Return $key
        Case "F3"
            $key[0] ="0x3D"
            $key[1] ="0xBD"
            Return $key
        Case "F4"
            $key[0] ="0x3E"
            $key[1] ="0xBE"
            Return $key
        Case "F5"
            $key[0] ="0x3F"
            $key[1] ="0xBF"
            Return $key
        Case "F6"
            $key[0] ="0x40"
            $key[1] ="0xC0"
            Return $key
        Case "F7"
            $key[0] ="0x41"
            $key[1] ="0xC1"
            Return $key
        Case "F8"
            $key[0] ="0x42"
            $key[1] ="0xC2"
            Return $key
        Case "F9"
            $key[0] ="0x43"
            $key[1] ="0xC3"
            Return $key
        Case "F10"
            $key[0] ="0x44"
            $key[1] ="0xC4"
            Return $key
        Case "NUM LOCK"
            $key[0] ="0x45"
            $key[1] ="0xC5"
            Return $key
        Case "SCROLL LOCK"
            $key[0] ="0x46"
            $key[1] ="0xC6"
            Return $key
        Case "LSHIFT"
            $key[0] ="0x2A"
            $key[1] ="0xAA"
            Return $key
        Case "RSHIFT"
            $key[0] ="0x36"
            $key[1] ="0xB6"
            Return $key
        Case "/"
            $key[0] ="0x35"
            $key[1] ="0xB5"
           Return $key
    EndSwitch
    Return -1
EndFunc
 

Crusaderman

Новичок
Сообщения
50
Репутация
0
Все круто! но у меня не работает. У меня нет физической клавы. И думаю проблема в драйверах. Но скачать чистые драйвера прям реальная проблема... кругом один софт с типа с автоматом скачки нужных драйверов. и библиотеки WinIO32.dll тоже нет, простая скачка не дала результат. что может еще быть?
 

Prog

Продвинутый
Сообщения
593
Репутация
73
библиотеки WinIO32.dll тоже нет
Не обязательно эта. Подойдет другая для прямой записи в порты. Но у драйвера обязательно должна быть цифровая подпись без которой ОС заблокирует установку.
В системной плате обязательно должен быть контроллер PS/2 клавиатуры. Если его нет, WinIO32.dll не сможет эмулировать ведь железа нет - некуда записывать данные.

Проще воспользоваться эмулятором подключаемым в USB порту. В соседней теме рекламировали такой https://autoit-script.ru/threads/eh...ps-2-port-klaviatury-myshi.28060/#post-154402
Демо версию проверил - работает.
 

Crusaderman

Новичок
Сообщения
50
Репутация
0
Не обязательно эта. Подойдет другая для прямой записи в порты. Но у драйвера обязательно должна быть цифровая подпись без которой ОС заблокирует установку.
В системной плате обязательно должен быть контроллер PS/2 клавиатуры. Если его нет, WinIO32.dll не сможет эмулировать ведь железа нет - некуда записывать данные.

Проще воспользоваться эмулятором подключаемым в USB порту. В соседней теме рекламировали такой https://autoit-script.ru/threads/eh...ps-2-port-klaviatury-myshi.28060/#post-154402
Демо версию проверил - работает.
то есть физически клава должна быть вставлена ps\2? в материнке разъем у меня есть.
посмотрел эту приблуду... так то идея хорошая, если через озон заказывать будет идти больше недели. и как я понял к ней еще отладчик ST-Link нужен? и софт еще
Сообщение автоматически объединено:

так то переходник можно взять, папа ps2 мама USB и в системник вставить, что б драйвера поставили. как вариант?
 

Prog

Продвинутый
Сообщения
593
Репутация
73
отладчик ST-Link нужен
Чтобы прошить.
Но можно воспользоваться USB то UART переходником (при наличии) https://r13-project.ru/2021/01/08/как-и-чем-прошить-stm32-stm32f103c8t6/

в материнке разъем у меня есть.
Тогда попробуйте.
Лучше чтобы ОС была Windows XP x86. Больше вероятности что будет работать.
 

Crusaderman

Новичок
Сообщения
50
Репутация
0
Чтобы прошить.
Но можно воспользоваться USB то UART переходником (при наличии) https://r13-project.ru/2021/01/08/как-и-чем-прошить-stm32-stm32f103c8t6/


Тогда попробуйте.
Лучше чтобы ОС была Windows XP x86. Больше вероятности что будет работать.
на ютубе очень много роликов про программаторы. так что это 100% решение что б не получить бан) да и геморно но интересно )
на сколько я понял платная это прога с AutoIT это на С++ конвертер типа.
Сообщение автоматически объединено:

Не обязательно эта. Подойдет другая для прямой записи в порты. Но у драйвера обязательно должна быть цифровая подпись без которой ОС заблокирует установку.
В системной плате обязательно должен быть контроллер PS/2 клавиатуры. Если его нет, WinIO32.dll не сможет эмулировать ведь железа нет - некуда записывать данные.

Проще воспользоваться эмулятором подключаемым в USB порту. В соседней теме рекламировали такой https://autoit-script.ru/threads/eh...ps-2-port-klaviatury-myshi.28060/#post-154402
Демо версию проверил - работает.
Все круто работает! есть у кого не демо версия?) буду очень признателен)
 
Последнее редактирование:
Верх