Skip to content

Commit 5546c7c

Browse files
committed
Simplify files handling as std streams can be accessed by handles now
1 parent 6bf4673 commit 5546c7c

File tree

1 file changed

+25
-46
lines changed

1 file changed

+25
-46
lines changed

qiling/os/windows/dlls/kernel32/fileapi.py

Lines changed: 25 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -26,18 +26,13 @@
2626
def 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

Comments
 (0)