void input_send_fastpath_focus_in_event(rdpInput* input, UINT16 toggleStates, UINT16 x, UINT16 y) { wStream* s; rdpRdp* rdp = input->context->rdp; BYTE eventFlags = 0; s = fastpath_input_pdu_init_header(rdp->fastpath); /* send a tab up like mstsc.exe */ eventFlags = FASTPATH_INPUT_KBDFLAGS_RELEASE | FASTPATH_INPUT_EVENT_SCANCODE << 5; Stream_Write_UINT8(s, eventFlags); /* Key Release event (1 byte) */ Stream_Write_UINT8(s, 0x0f); /* keyCode (1 byte) */ /* send the toggle key states */ eventFlags = (toggleStates & 0x1F) | FASTPATH_INPUT_EVENT_SYNC << 5; Stream_Write_UINT8(s, eventFlags); /* toggle state (1 byte) */ /* send another tab up like mstsc.exe */ eventFlags = FASTPATH_INPUT_KBDFLAGS_RELEASE | FASTPATH_INPUT_EVENT_SCANCODE << 5; Stream_Write_UINT8(s, eventFlags); /* Key Release event (1 byte) */ Stream_Write_UINT8(s, 0x0f); /* keyCode (1 byte) */ /* finish with a mouse pointer position like mstsc.exe */ eventFlags = 0 | FASTPATH_INPUT_EVENT_MOUSE << 5; Stream_Write_UINT8(s, eventFlags); /* Mouse Pointer event (1 byte) */ input_write_extended_mouse_event(s, PTR_FLAGS_MOVE, x, y); fastpath_send_multiple_input_pdu(rdp->fastpath, s, 4); }
static void input_send_fastpath_keyboard_pause_event(rdpInput* input) { /* In ancient days, pause-down without control sent E1 1D 45 E1 9D C5, * and pause-up sent nothing. However, reverse engineering mstsc shows * it sending the following sequence: */ wStream* s; rdpRdp* rdp = input->context->rdp; const BYTE keyDownEvent = FASTPATH_INPUT_EVENT_SCANCODE << 5; const BYTE keyUpEvent = (FASTPATH_INPUT_EVENT_SCANCODE << 5) | FASTPATH_INPUT_KBDFLAGS_RELEASE; s = fastpath_input_pdu_init_header(rdp->fastpath); /* Control down (0x1D) */ Stream_Write_UINT8(s, keyDownEvent | FASTPATH_INPUT_KBDFLAGS_PREFIX_E1); Stream_Write_UINT8(s, RDP_SCANCODE_CODE(RDP_SCANCODE_LCONTROL)); /* Numlock down (0x45) */ Stream_Write_UINT8(s, keyDownEvent); Stream_Write_UINT8(s, RDP_SCANCODE_CODE(RDP_SCANCODE_NUMLOCK)); /* Control up (0x1D) */ Stream_Write_UINT8(s, keyUpEvent | FASTPATH_INPUT_KBDFLAGS_PREFIX_E1); Stream_Write_UINT8(s, RDP_SCANCODE_CODE(RDP_SCANCODE_LCONTROL)); /* Numlock down (0x45) */ Stream_Write_UINT8(s, keyUpEvent); Stream_Write_UINT8(s, RDP_SCANCODE_CODE(RDP_SCANCODE_NUMLOCK)); fastpath_send_multiple_input_pdu(rdp->fastpath, s, 4); }
BOOL input_send_fastpath_focus_in_event(rdpInput* input, UINT16 toggleStates) { wStream* s; rdpRdp* rdp = input->context->rdp; BYTE eventFlags = 0; s = fastpath_input_pdu_init_header(rdp->fastpath); if (!s) return FALSE; /* send a tab up like mstsc.exe */ eventFlags = FASTPATH_INPUT_KBDFLAGS_RELEASE | FASTPATH_INPUT_EVENT_SCANCODE << 5; Stream_Write_UINT8(s, eventFlags); /* Key Release event (1 byte) */ Stream_Write_UINT8(s, 0x0f); /* keyCode (1 byte) */ /* send the toggle key states */ eventFlags = (toggleStates & 0x1F) | FASTPATH_INPUT_EVENT_SYNC << 5; Stream_Write_UINT8(s, eventFlags); /* toggle state (1 byte) */ /* send another tab up like mstsc.exe */ eventFlags = FASTPATH_INPUT_KBDFLAGS_RELEASE | FASTPATH_INPUT_EVENT_SCANCODE << 5; Stream_Write_UINT8(s, eventFlags); /* Key Release event (1 byte) */ Stream_Write_UINT8(s, 0x0f); /* keyCode (1 byte) */ return fastpath_send_multiple_input_pdu(rdp->fastpath, s, 3); }