@@ -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 })
245244def 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 })
257255def 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 )
281312def hook___lconv_init (ql : Qiling , address : int , params ):
282313 ret = 0
0 commit comments