1 import os
2 import _winreg
3 import msvcrt
4 import winKernel
5
6 from ctypes import *
7 from comtypes import BSTR
8 import winUser
9 import speech
10 import eventHandler
11 import queueHandler
12 import api
13 import globalVars
14 from logHandler import log
15 import time
16 import globalVars
17
18 _remoteLib=None
19 _remoteLoader64=None
20 localLib=None
21 generateBeep=None
22 VBuf_getTextInRange=None
23 lastInputLangChangeTime=0
27 cast(getattr(dll,name),POINTER(c_void_p)).contents.value=cast(cfunc,c_void_p).value
28
29
30 @WINFUNCTYPE(c_long,c_wchar_p)
31 -def nvdaController_speakText(text):
36
43
50
52 try:
53 key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\Keyboard Layouts\\"+ layoutString)
54 except WindowsError:
55 log.debugWarning("Could not find reg key %s"%layoutString)
56 return None
57 try:
58 s = _winreg.QueryValueEx(key, "Layout Display Name")[0]
59 except:
60 log.debugWarning("Could not find reg value 'Layout Display Name' for reg key %s"%layoutString)
61 s=None
62 if s:
63 buf=create_unicode_buffer(256)
64 windll.shlwapi.SHLoadIndirectString(s,buf,256,None)
65 return buf.value
66 try:
67 return _winreg.QueryValueEx(key, "Layout Text")[0]
68 except:
69 log.debugWarning("Could not find reg value 'Layout Text' for reg key %s"%layoutString)
70 return None
71
72 @WINFUNCTYPE(c_long,c_long,c_long,c_long,c_long,c_long)
73 -def nvdaControllerInternal_displayModelTextChangeNotify(hwnd, left, top, right, bottom):
74 import displayModel
75 displayModel.textChangeNotify(hwnd, left, top, right, bottom)
76 return 0
77
86
116
123
125
127
128 pipeReadOrig, self._pipeWrite = winKernel.CreatePipe(None, 0)
129
130 pipeRead = self._duplicateAsInheritable(pipeReadOrig)
131 winKernel.closeHandle(pipeReadOrig)
132
133 with file("nul", "w") as nul:
134 nulHandle = self._duplicateAsInheritable(msvcrt.get_osfhandle(nul.fileno()))
135
136 si = winKernel.STARTUPINFO(dwFlags=winKernel.STARTF_USESTDHANDLES, hSTDInput=pipeRead, hSTDOutput=nulHandle, hSTDError=nulHandle)
137 pi = winKernel.PROCESS_INFORMATION()
138
139
140 token = winKernel.OpenProcessToken(winKernel.GetCurrentProcess(), winKernel.MAXIMUM_ALLOWED)
141 try:
142 winKernel.CreateProcessAsUser(token, None, u"lib64/nvdaHelperRemoteLoader.exe", None, None, True, None, None, None, si, pi)
143
144 winKernel.closeHandle(pi.hThread)
145 self._process = pi.hProcess
146 except:
147 winKernel.closeHandle(self._pipeWrite)
148 raise
149 finally:
150 winKernel.closeHandle(pipeRead)
151 winKernel.closeHandle(token)
152
156
163
165 global _remoteLib, _remoteLoader64, localLib, generateBeep,VBuf_getTextInRange
166 localLib=cdll.LoadLibrary('lib/nvdaHelperLocal.dll')
167 for name,func in [
168 ("nvdaController_speakText",nvdaController_speakText),
169 ("nvdaController_cancelSpeech",nvdaController_cancelSpeech),
170 ("nvdaController_brailleMessage",nvdaController_brailleMessage),
171 ("nvdaControllerInternal_inputLangChangeNotify",nvdaControllerInternal_inputLangChangeNotify),
172 ("nvdaControllerInternal_typedCharacterNotify",nvdaControllerInternal_typedCharacterNotify),
173 ("nvdaControllerInternal_displayModelTextChangeNotify",nvdaControllerInternal_displayModelTextChangeNotify),
174 ("nvdaControllerInternal_logMessage",nvdaControllerInternal_logMessage),
175 ]:
176 try:
177 _setDllFuncPointer(localLib,"_%s"%name,func)
178 except AttributeError:
179 log.error("nvdaHelperLocal function pointer for %s could not be found, possibly old nvdaHelperLocal dll"%name)
180 localLib.nvdaHelperLocal_initialize()
181 generateBeep=localLib.generateBeep
182 generateBeep.argtypes=[c_char_p,c_float,c_uint,c_ubyte,c_ubyte]
183 generateBeep.restype=c_uint
184
185 VBuf_getTextInRange = CFUNCTYPE(c_int, c_int, c_int, c_int, POINTER(BSTR), c_int)(
186 ("VBuf_getTextInRange", localLib),
187 ((1,), (1,), (1,), (2,), (1,)))
188
189 h=windll.kernel32.LoadLibraryExW(os.path.abspath(ur"lib\nvdaHelperRemote.dll"),0,0x8)
190 if not h:
191 log.critical("Error loading nvdaHelperRemote.dll: %s" % WinError())
192 return
193 _remoteLib=CDLL("nvdaHelperRemote",handle=h)
194 if _remoteLib.injection_initialize(globalVars.appArgs.secure) == 0:
195 raise RuntimeError("Error initializing NVDAHelperRemote")
196 if not _remoteLib.installIA2Support():
197 log.error("Error installing IA2 support")
198
199 _remoteLib.initInprocManagerThreadIfNeeded()
200 if os.environ.get('PROCESSOR_ARCHITEW6432')=='AMD64':
201 _remoteLoader64=RemoteLoader64()
202
217