Skip to content

Commit bbe5112

Browse files
committed
Add a few more __stdio_common functions
1 parent 5316aa4 commit bbe5112

File tree

1 file changed

+45
-14
lines changed

1 file changed

+45
-14
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

0 commit comments

Comments
 (0)