2626def hook_GetFileType (ql : Qiling , address : int , params ):
2727 hFile = params ["hFile" ]
2828
29- if hFile in (STD_INPUT_HANDLE , STD_OUTPUT_HANDLE , STD_ERROR_HANDLE ):
30- ret = FILE_TYPE_CHAR
31- else :
32- obj = ql .os .handle_manager .get (hFile )
29+ handle = ql .os .handle_manager .get (hFile )
3330
34- if obj is None :
35- raise QlErrorNotImplemented ("API not implemented" )
36- else :
37- # technically is not always a type_char but.. almost
38- ret = FILE_TYPE_CHAR
31+ if handle is None :
32+ raise QlErrorNotImplemented ("API not implemented" )
3933
40- return ret
34+ # technically is not always a type_char but.. almost
35+ return FILE_TYPE_CHAR
4136
4237# HANDLE FindFirstFileA(
4338# LPCSTR lpFileName,
@@ -156,28 +151,16 @@ def hook_ReadFile(ql: Qiling, address: int, params):
156151 nNumberOfBytesToRead = params ["nNumberOfBytesToRead" ]
157152 lpNumberOfBytesRead = params ["lpNumberOfBytesRead" ]
158153
159- if hFile == STD_INPUT_HANDLE :
160- if ql .os .automatize_input :
161- # TODO maybe insert a good random generation input
162- s = (b"A" * (nNumberOfBytesToRead - 1 )) + b"\x00 "
163- else :
164- ql .log .debug ("Insert input" )
165- s = ql .os .stdin .read (nNumberOfBytesToRead )
154+ handle = ql .os .handle_manager .get (hFile )
166155
167- slen = len (s )
168- read_len = slen
156+ if handle is None :
157+ ql .os .last_error = ERROR_INVALID_HANDLE
158+ return 0
169159
170- if slen > nNumberOfBytesToRead :
171- s = s [:nNumberOfBytesToRead ]
172- read_len = nNumberOfBytesToRead
160+ data = handle .obj .read (nNumberOfBytesToRead )
173161
174- ql .mem .write (lpBuffer , s )
175- ql .mem .write_ptr (lpNumberOfBytesRead , read_len , 4 )
176- else :
177- f = ql .os .handle_manager .get (hFile ).obj
178- data = f .read (nNumberOfBytesToRead )
179- ql .mem .write (lpBuffer , data )
180- ql .mem .write_ptr (lpNumberOfBytesRead , len (data ), 4 )
162+ ql .mem .write (lpBuffer , data )
163+ ql .mem .write_ptr (lpNumberOfBytesRead , len (data ), 4 )
181164
182165 return 1
183166
@@ -201,24 +184,20 @@ def hook_WriteFile(ql: Qiling, address: int, params):
201184 nNumberOfBytesToWrite = params ["nNumberOfBytesToWrite" ]
202185 lpNumberOfBytesWritten = params ["lpNumberOfBytesWritten" ]
203186
187+ handle = ql .os .handle_manager .get (hFile )
188+
189+ if handle is None :
190+ ql .os .last_error = ERROR_INVALID_HANDLE
191+ return 0
192+
193+ fobj = handle .obj
194+ data = ql .mem .read (lpBuffer , nNumberOfBytesToWrite )
195+
204196 if hFile == STD_OUTPUT_HANDLE :
205- s = ql .mem .read (lpBuffer , nNumberOfBytesToWrite )
206- ql .os .stdout .write (s )
207- ql .os .stats .log_string (s .decode ())
208- ql .mem .write_ptr (lpNumberOfBytesWritten , nNumberOfBytesToWrite , 4 )
209- else :
210- f = ql .os .handle_manager .get (hFile )
211-
212- if f is None :
213- # Invalid handle
214- ql .os .last_error = ERROR_INVALID_HANDLE
215- return 0
216- else :
217- f = f .obj
218-
219- buffer = ql .mem .read (lpBuffer , nNumberOfBytesToWrite )
220- nNumberOfBytesWritten = f .write (bytes (buffer ))
221- ql .mem .write_ptr (lpNumberOfBytesWritten , nNumberOfBytesWritten , 4 )
197+ ql .os .stats .log_string (data .decode ())
198+
199+ written = fobj .write (bytes (data ))
200+ ql .mem .write_ptr (lpNumberOfBytesWritten , written , 4 )
222201
223202 return 1
224203
0 commit comments