Skip to content

Commit 4d10056

Browse files
authored
Merge pull request #818 from elicn/dev-stdio_common
Add missing __stdio_common functions
2 parents 5316aa4 + 02d2caf commit 4d10056

File tree

2 files changed

+52
-21
lines changed

2 files changed

+52
-21
lines changed

qiling/os/windows/dlls/msvcrt.py

Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -240,43 +240,74 @@ def hook___acrt_iob_func(ql: Qiling, address: int, params):
240240
ret = 0
241241
return ret
242242

243-
# __stdio_common_vfprintf(_OptionsStorage, FILE* _Stream, char const* _Format, _locale_t _Locale, va_list _ArgList)
244-
@winsdkapi(cc=CDECL, replace_params={'optstorage': PARAM_INT64, 'stream': POINTER, 'format': STRING, 'locale': DWORD, 'arglist': POINTER})
243+
@winsdkapi(cc=CDECL, replace_params={'_Options': PARAM_INT64, '_Stream': POINTER, '_Format': STRING, '_Locale': DWORD, '_ArgList': POINTER})
245244
def hook___stdio_common_vfprintf(ql: Qiling, address: int, params):
246-
format = params['format']
247-
arglist = params['arglist']
245+
format = params['_Format']
246+
arglist = params['_ArgList']
248247

249248
args = ql.os.utils.va_list(format, arglist)
250249
count = ql.os.utils.printf(format, args, wstring=False)
251250
ql.os.utils.update_ellipsis(params, args)
252251

253252
return count
254253

255-
256-
@winsdkapi(cc=CDECL, replace_params={'optstorage': PARAM_INT64, 'stream': POINTER, 'format': WSTRING, 'locale': DWORD, 'arglist': POINTER})
254+
@winsdkapi(cc=CDECL, replace_params={'_Options': PARAM_INT64, '_Stream': POINTER, '_Format': WSTRING, '_Locale': DWORD, '_ArgList': POINTER})
257255
def hook___stdio_common_vfwprintf(ql: Qiling, address: int, params):
258-
format = params['format']
259-
arglist = params['arglist']
256+
format = params['_Format']
257+
arglist = params['_ArgList']
260258

261259
args = ql.os.utils.va_list(format, arglist)
262260
count = ql.os.utils.printf(format, args, wstring=True)
263261
ql.os.utils.update_ellipsis(params, args)
264262

265263
return count
266264

267-
# int __cdecl __stdio_common_vswprintf_s(unsigned __int64,wchar_t*,size_t,const wchar_t*,_locale_t,__ms_va_list)
268-
@winsdkapi(cc=CDECL, replace_params={'optstorage': PARAM_INT64, 'buff': POINTER, 'size': SIZE_T, 'format': WSTRING, 'locale': DWORD, 'arglist': POINTER})
269-
def hook___stdio_common_vswprintf_s(ql: Qiling, address: int, params):
270-
buff = params['buff']
271-
format = params['format']
272-
arglist = params['arglist']
265+
@winsdkapi(cc=CDECL, replace_params={'_Options': PARAM_INT64, '_Buffer': POINTER, '_BufferCount': SIZE_T, '_Format': STRING, '_Locale': DWORD, '_ArgList': POINTER})
266+
def hook___stdio_common_vsprintf(ql: Qiling, address: int, params):
267+
buff = params['_Buffer']
268+
format = params['_Format']
269+
arglist = params['_ArgList']
270+
271+
# TODO: take _BufferCount into account
272+
273+
args = ql.os.utils.va_list(format, arglist)
274+
count = ql.os.utils.sprintf(buff, format, args, wstring=False)
275+
ql.os.utils.update_ellipsis(params, args)
276+
277+
return count
278+
279+
@winsdkapi(cc=CDECL, replace_params={'_Options': PARAM_INT64, '_Buffer': POINTER, '_BufferCount': SIZE_T, '_Format': WSTRING, '_Locale': DWORD, '_ArgList': POINTER})
280+
def hook___stdio_common_vswprintf(ql: Qiling, address: int, params):
281+
buff = params['_Buffer']
282+
format = params['_Format']
283+
arglist = params['_ArgList']
284+
285+
# TODO: take _BufferCount into account
273286

274287
args = ql.os.utils.va_list(format, arglist)
275288
count = ql.os.utils.sprintf(buff, format, args, wstring=True)
276289
ql.os.utils.update_ellipsis(params, args)
277290

278291
return count
279292

293+
# all the "_s" versions are aliases to their non-"_s" counterparts
294+
295+
@winsdkapi(cc=CDECL, replace_params={'_Options': PARAM_INT64, '_Stream': POINTER, '_Format': STRING, '_Locale': DWORD, '_ArgList': POINTER})
296+
def hook___stdio_common_vfprintf_s(ql: Qiling, address: int, params):
297+
return hook___stdio_common_vfprintf.__wrapped__(ql, address, params)
298+
299+
@winsdkapi(cc=CDECL, replace_params={'_Options': PARAM_INT64, '_Stream': POINTER, '_Format': WSTRING, '_Locale': DWORD, '_ArgList': POINTER})
300+
def hook___stdio_common_vfwprintf_s(ql: Qiling, address: int, params):
301+
return hook___stdio_common_vfwprintf.__wrapped__(ql, address, params)
302+
303+
@winsdkapi(cc=CDECL, replace_params={'_Options': PARAM_INT64, '_Buffer': POINTER, '_BufferCount': SIZE_T, '_Format': STRING, '_Locale': DWORD, '_ArgList': POINTER})
304+
def hook___stdio_common_vsprintf_s(ql: Qiling, address: int, params):
305+
return hook___stdio_common_vsprintf.__wrapped__(ql, address, params)
306+
307+
@winsdkapi(cc=CDECL, replace_params={'_Options': PARAM_INT64, '_Buffer': POINTER, '_BufferCount': SIZE_T, '_Format': WSTRING, '_Locale': DWORD, '_ArgList': POINTER})
308+
def hook___stdio_common_vswprintf_s(ql: Qiling, address: int, params):
309+
return hook___stdio_common_vswprintf.__wrapped__(ql, address, params)
310+
280311
@winsdkapi(cc=CDECL)
281312
def hook___lconv_init(ql: Qiling, address: int, params):
282313
ret = 0

tests/test_pe.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -315,15 +315,15 @@ def check_print(ql: Qiling, address: int, params):
315315
ql.os.fcall = ql.os.fcall_select(CDECL)
316316

317317
params = ql.os.resolve_fcall_params({
318-
'optstorage': PARAM_INT64,
319-
'stream' : POINTER,
320-
'format' : STRING,
321-
'locale' : DWORD,
322-
'arglist' : POINTER
318+
'_Options' : PARAM_INT64,
319+
'_Stream' : POINTER,
320+
'_Format' : STRING,
321+
'_Locale' : DWORD,
322+
'_ArgList' : POINTER
323323
})
324324

325-
format = params['format']
326-
arglist = params['arglist']
325+
format = params['_Format']
326+
arglist = params['_ArgList']
327327

328328
count = format.count("%")
329329
fargs = [ql.unpack(ql.mem.read(arglist + i * ql.pointersize, ql.pointersize)) for i in range(count)]

0 commit comments

Comments
 (0)