@@ -171,12 +171,12 @@ def hook_ReadFile(ql: Qiling, address: int, params):
171171 read_len = nNumberOfBytesToRead
172172
173173 ql .mem .write (lpBuffer , s )
174- ql .mem .write (lpNumberOfBytesRead , ql .pack (read_len ))
174+ ql .mem .write (lpNumberOfBytesRead , ql .pack32 (read_len ))
175175 else :
176176 f = ql .os .handle_manager .get (hFile ).obj
177177 data = f .read (nNumberOfBytesToRead )
178178 ql .mem .write (lpBuffer , data )
179- ql .mem .write (lpNumberOfBytesRead , ql .pack32 (lpNumberOfBytesRead ))
179+ ql .mem .write (lpNumberOfBytesRead , ql .pack32 (len ( data ) ))
180180
181181 return 1
182182
@@ -204,7 +204,7 @@ def hook_WriteFile(ql: Qiling, address: int, params):
204204 s = ql .mem .read (lpBuffer , nNumberOfBytesToWrite )
205205 ql .os .stdout .write (s )
206206 ql .os .utils .string_appearance (s .decode ())
207- ql .mem .write (lpNumberOfBytesWritten , ql .pack (nNumberOfBytesToWrite ))
207+ ql .mem .write (lpNumberOfBytesWritten , ql .pack32 (nNumberOfBytesToWrite ))
208208 else :
209209 f = ql .os .handle_manager .get (hFile )
210210
@@ -216,8 +216,8 @@ def hook_WriteFile(ql: Qiling, address: int, params):
216216 f = f .obj
217217
218218 buffer = ql .mem .read (lpBuffer , nNumberOfBytesToWrite )
219- f .write (bytes (buffer ))
220- ql .mem .write (lpNumberOfBytesWritten , ql .pack32 (nNumberOfBytesToWrite ))
219+ nNumberOfBytesWritten = f .write (bytes (buffer ))
220+ ql .mem .write (lpNumberOfBytesWritten , ql .pack32 (nNumberOfBytesWritten ))
221221
222222 return 1
223223
@@ -235,7 +235,7 @@ def _CreateFile(ql: Qiling, address: int, params):
235235 if dwDesiredAccess & GENERIC_WRITE :
236236 mode += "wb"
237237 else :
238- mode += "r "
238+ mode += "rb "
239239
240240 try :
241241 f = ql .os .fs_mapper .open (s_lpFileName , mode )
@@ -663,3 +663,47 @@ def hook_SetFileAttributesA(ql: Qiling, address: int, params):
663663})
664664def hook_SetFileAttributesW (ql : Qiling , address : int , params ):
665665 return 1
666+
667+ # BOOL AreFileApisANSI();
668+ @winsdkapi (cc = STDCALL , params = {})
669+ def hook_AreFileApisANSI (ql : Qiling , address : int , params ):
670+ # TODO make this coherent with SetFileApisToANSI/OEM calls
671+ return 1
672+
673+ # void SetFileApisToANSI();
674+ @winsdkapi (cc = STDCALL , params = {})
675+ def hook_SetFileApisToANSI (ql : Qiling , address : int , params ):
676+ pass
677+
678+ # void SetFileApisToOEM();
679+ @winsdkapi (cc = STDCALL , params = {})
680+ def hook_SetFileApisToOEM (ql : Qiling , address : int , params ):
681+ pass
682+
683+ # BOOL DeleteFileA(
684+ # LPCSTR lpFileName
685+ # );
686+ @winsdkapi (cc = STDCALL , params = {
687+ 'lpFileName' : LPCSTR
688+ })
689+ def hook_DeleteFileA (ql : Qiling , address : int , params ):
690+ lpFileName = ql .os .path .transform_to_real_path (params ["lpFileName" ])
691+ try :
692+ os .remove (lpFileName )
693+ return 1
694+ except :
695+ return 0
696+
697+ # BOOL DeleteFileW(
698+ # LPCWSTR lpFileName
699+ # );
700+ @winsdkapi (cc = STDCALL , params = {
701+ 'lpFileName' : LPCWSTR
702+ })
703+ def hook_DeleteFileW (ql : Qiling , address : int , params ):
704+ lpFileName = ql .os .path .transform_to_real_path (params ["lpFileName" ])
705+ try :
706+ os .remove (lpFileName )
707+ return 1
708+ except :
709+ return 0
0 commit comments