1010#include <win32k.h>
1111DBG_DEFAULT_CHANNEL (UserInput );
1212
13+ extern BOOLEAN RawInputEnabled ;
14+ extern HANDLE ghMouseDevice ;
15+
1316MOUSEMOVEPOINT gMouseHistoryOfMoves [64 ];
1417INT gcMouseHistoryOfMoves = 0 ;
1518
@@ -31,6 +34,74 @@ UserGetMouseButtonsState(VOID)
3134 return wRet ;
3235}
3336
37+ VOID NTAPI
38+ UserRawInputMouseProcess (PMOUSE_INPUT_DATA mid )
39+ {
40+ PUSER_MESSAGE_QUEUE pFocusQueue ;
41+ PTHREADINFO pti ;
42+ POINT ptCursor ;
43+
44+ RAWMOUSE rm = {0 };
45+
46+ /* Find the target thread whose locale is in effect */
47+ pFocusQueue = IntGetFocusMessageQueue ();
48+ if ( pFocusQueue )
49+ {
50+ ptCursor = gpsi -> ptCursor ;
51+ MSG Msg ;
52+ PWND pWnd = pFocusQueue -> spwndFocus ;
53+ if (pWnd )
54+ {
55+ pti = pWnd -> head .pti ;
56+ if (mid -> LastX != 0 || mid -> LastY != 0 )
57+ {
58+ rm .usFlags |= MOUSE_MOVE_RELATIVE ;
59+ }
60+
61+ /* Flags for absolute move */
62+ if (mid -> Flags & MOUSE_MOVE_ABSOLUTE )
63+ rm .usFlags |= MOUSE_MOVE_ABSOLUTE ;
64+ if (mid -> Flags & MOUSE_VIRTUAL_DESKTOP )
65+ rm .usFlags |= MOUSE_VIRTUAL_DESKTOP ;
66+
67+ /* Left button */
68+ if (mid -> ButtonFlags & MOUSE_LEFT_BUTTON_DOWN )
69+ rm .usButtonFlags |= RI_MOUSE_LEFT_BUTTON_DOWN ;
70+ if (mid -> ButtonFlags & MOUSE_LEFT_BUTTON_UP )
71+ rm .usButtonFlags |= RI_MOUSE_LEFT_BUTTON_UP ;
72+
73+ /* Middle button */
74+ if (mid -> ButtonFlags & MOUSE_MIDDLE_BUTTON_DOWN )
75+ rm .usButtonFlags |= MOUSEEVENTF_MIDDLEDOWN ;
76+ if (mid -> ButtonFlags & MOUSE_MIDDLE_BUTTON_UP )
77+ rm .usButtonFlags |= MOUSEEVENTF_MIDDLEUP ;
78+
79+ /* Right button */
80+ if (mid -> ButtonFlags & MOUSE_RIGHT_BUTTON_DOWN )
81+ rm .usButtonFlags |= RI_MOUSE_RIGHT_BUTTON_DOWN ;
82+ if (mid -> ButtonFlags & MOUSE_RIGHT_BUTTON_UP )
83+ rm .usButtonFlags |= RI_MOUSE_RIGHT_BUTTON_UP ;
84+ rm .lLastX = mid -> LastX ;
85+ rm .lLastY = mid -> LastY ;
86+
87+ PRAWINPUT rmInput = EngAllocMem (0 , sizeof (RAWINPUT ), 'iwar' );
88+ rmInput -> header .dwType = RIM_TYPEMOUSE ;
89+ rmInput -> header .hDevice = ghMouseDevice ;
90+ rmInput -> header .wParam = mid -> ExtraInformation ;
91+ rmInput -> header .dwSize = sizeof (RAWINPUTHEADER ) + sizeof (RAWMOUSE );
92+ rmInput -> data .mouse = rm ;
93+ Msg .wParam = RIM_INPUT ;
94+ Msg .lParam = (LPARAM )(rmInput );
95+ Msg .pt = ptCursor ;
96+ //Msg.time = mid->time;
97+ Msg .message = WM_INPUT ;
98+ //MessageQueue = pti->MessageQueue;
99+
100+ MsqPostMessage (pti , & Msg , TRUE, QS_RAWINPUT , 0 , 0 );
101+ }
102+ }
103+
104+ }
34105/*
35106 * UserProcessMouseInput
36107 *
@@ -48,7 +119,8 @@ UserProcessMouseInput(PMOUSE_INPUT_DATA mid)
48119 mi .dwFlags = 0 ;
49120 mi .time = 0 ;
50121 mi .dwExtraInfo = mid -> ExtraInformation ;
51-
122+ if (RawInputEnabled == TRUE)
123+ UserRawInputMouseProcess (mid );
52124 /* Mouse position */
53125 if (mi .dx != 0 || mi .dy != 0 )
54126 mi .dwFlags |= MOUSEEVENTF_MOVE ;
0 commit comments