Changeset 1659

Show
Ignore:
Timestamp:
07/21/08 00:43:57 (2 months ago)
Author:
common
Message:

libemu

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • libemu/trunk/include/emu/environment/win32/env_w32_dll_export_kernel32_hooks.h

    r1607 r1659  
    3434int32_t env_w32_hook_ExitProcess(struct emu_env *env, struct emu_env_hook *hook); 
    3535int32_t env_w32_hook_ExitThread(struct emu_env *env, struct emu_env_hook *hook); 
    36 int32_t env_w32_hook_fclose(struct emu_env *env, struct emu_env_hook *hook); 
    37 int32_t env_w32_hook_fopen(struct emu_env *env, struct emu_env_hook *hook); 
    38 int32_t env_w32_hook_fwrite(struct emu_env *env, struct emu_env_hook *hook); 
    3936int32_t env_w32_hook_GetProcAddress(struct emu_env *env, struct emu_env_hook *hook); 
    4037int32_t env_w32_hook_GetSystemDirectoryA(struct emu_env *env, struct emu_env_hook *hook); 
  • libemu/trunk/include/emu/environment/win32/env_w32_dll_export_msvcrt_hooks.h

    r1607 r1659  
    2929 
    3030int32_t env_w32_hook__execv(struct emu_env *env, struct emu_env_hook *hook); 
     31int32_t env_w32_hook_fclose(struct emu_env *env, struct emu_env_hook *hook); 
     32int32_t env_w32_hook_fopen(struct emu_env *env, struct emu_env_hook *hook); 
     33int32_t env_w32_hook_fwrite(struct emu_env *env, struct emu_env_hook *hook); 
    3134 
     35 
  • libemu/trunk/src/environment/win32/env_w32_dll_export_kernel32_hooks.c

    r1655 r1659  
    8080        uint32_t object; 
    8181        POP_DWORD(c, &object); 
    82         emu_profile_argument_add_int(env->profile, "Handle", "hObject", object); 
     82        emu_profile_argument_add_int(env->profile, "HANDLE", "hObject", object); 
     83 
     84 
     85        uint32_t returnvalue; 
     86        if ( hook->hook.win->userhook != NULL ) 
     87        { 
     88                returnvalue = hook->hook.win->userhook(env, hook,  
     89                                                                                           object); 
     90        }else 
     91        { 
     92                returnvalue     = 0; 
     93        } 
     94 
     95        emu_cpu_reg32_set(c, eax, returnvalue); 
     96        emu_profile_function_returnvalue_int_set(env->profile, "BOOL", returnvalue); 
     97         
    8398 
    8499        emu_cpu_eip_set(c, eip_save); 
     
    111126        emu_profile_function_add(env->profile, "CreateFile"); 
    112127 
    113         uint32_t filename; 
    114         POP_DWORD(c, &filename); 
    115         emu_profile_argument_add_ptr(env->profile, "LPCTSTR", "lpFileName", filename); 
    116         emu_profile_argument_add_none(env->profile); 
    117  
     128        uint32_t p_filename; 
     129        POP_DWORD(c, &p_filename); 
     130        emu_profile_argument_add_ptr(env->profile, "LPCTSTR", "lpFileName", p_filename); 
     131    struct emu_string *filename = emu_string_new(); 
     132        emu_memory_read_string(emu_memory_get(env->emu), p_filename, filename, 256); 
     133        emu_profile_argument_add_string(env->profile,"",  "",  emu_string_char(filename)); 
    118134 
    119135        uint32_t desiredaccess; 
     
    140156        uint32_t templatefile; 
    141157        POP_DWORD(c, &templatefile); 
    142         emu_profile_argument_add_int(env->profile, "Handle", "hTemplateFile", templatefile); 
    143  
    144         emu_cpu_eip_set(c, eip_save); 
     158        emu_profile_argument_add_int(env->profile, "HANDLE", "hTemplateFile", templatefile); 
     159 
     160 
     161        uint32_t returnvalue; 
     162        if ( hook->hook.win->userhook != NULL ) 
     163        { 
     164                returnvalue = hook->hook.win->userhook(env, hook,  
     165                                                                                           emu_string_char(filename), 
     166                                                                                           desiredaccess, 
     167                                                                                           sharemode, 
     168                                                                                           securityattr, 
     169                                                                                           createdisp, 
     170                                                                                           flagsandattr, 
     171                                                                                           templatefile); 
     172        }else 
     173        { 
     174                returnvalue     = 0x8383838; 
     175        } 
     176 
     177        emu_cpu_reg32_set(c, eax, returnvalue); 
     178        emu_profile_function_returnvalue_int_set(env->profile, "HANDLE", returnvalue); 
     179 
     180 
     181 
     182        emu_cpu_eip_set(c, eip_save); 
     183 
     184        emu_string_free(filename); 
    145185        return 0; 
    146186} 
     
    177217        POP_DWORD(c, &p_imagename); 
    178218        emu_profile_argument_add_ptr(env->profile, "LPCWSTR", "pszImageName", p_imagename); 
    179         emu_profile_argument_add_none(env->profile); 
     219 
     220        struct emu_string *imagename = emu_string_new(); 
     221        emu_memory_read_string(m, p_imagename, imagename, 1024); 
     222        emu_profile_argument_add_string(env->profile, "","", emu_string_char(imagename)); 
     223 
    180224 
    181225        uint32_t p_cmdline; 
     
    412456} 
    413457 
    414 int32_t env_w32_hook_fclose(struct emu_env *env, struct emu_env_hook *hook) 
    415 { 
    416         logDebug(env->emu, "Hook me Captain Cook!\n"); 
    417         logDebug(env->emu, "%s:%i %s\n",__FILE__,__LINE__,__FUNCTION__); 
    418  
    419         struct emu_cpu *c = emu_cpu_get(env->emu); 
    420  
    421         uint32_t eip_save; 
    422  
    423         POP_DWORD(c, &eip_save); 
    424  
    425 /* 
    426 int _fcloseall( void ); 
    427 int fclose( FILE *stream ); 
    428 */ 
    429         emu_profile_function_add(env->profile, "fclose"); 
    430  
    431         uint32_t p_stream; 
    432         MEM_DWORD_READ(c, c->reg[esp], &p_stream); 
    433  
    434         emu_profile_argument_add_ptr(env->profile, "FILE *", "stream", p_stream); 
    435         emu_profile_argument_add_none(env->profile); 
    436  
    437  
    438         logDebug(env->emu, "fclose(0x%08x)\n", p_stream); 
    439          
    440         emu_cpu_reg32_set(c, eax, 0); 
    441         emu_profile_function_returnvalue_int_set(env->profile, "int", 0); 
    442  
    443     emu_cpu_eip_set(c, eip_save); 
    444         return 0; 
    445 } 
    446  
    447  
    448 int32_t env_w32_hook_fopen(struct emu_env *env, struct emu_env_hook *hook) 
    449 { 
    450         logDebug(env->emu, "Hook me Captain Cook!\n"); 
    451         logDebug(env->emu, "%s:%i %s\n",__FILE__,__LINE__,__FUNCTION__); 
    452  
    453         struct emu_cpu *c = emu_cpu_get(env->emu); 
    454  
    455         uint32_t eip_save; 
    456  
    457         POP_DWORD(c, &eip_save); 
    458  
    459 /* 
    460 FILE *fopen( const char *filename, const char *mode ); 
    461 FILE *_wfopen( const wchar_t *filename, const wchar_t *mode ); 
    462 */ 
    463         emu_profile_function_add(env->profile, "fopen"); 
    464  
    465         uint32_t p_filename; 
    466         MEM_DWORD_READ(c, c->reg[esp], &p_filename); 
    467         emu_profile_argument_add_ptr(env->profile, "const char *", "filename", p_filename); 
    468  
    469         struct emu_string *filename = emu_string_new(); 
    470         emu_memory_read_string(c->mem, p_filename, filename, 512); 
    471         emu_profile_argument_add_string(env->profile, "", "", emu_string_char(filename)); 
    472         emu_string_free(filename); 
    473          
    474         uint32_t p_mode; 
    475         MEM_DWORD_READ(c, c->reg[esp]+4, &p_mode); 
    476         emu_profile_argument_add_ptr(env->profile, "const char *", "mode", p_mode); 
    477         emu_profile_argument_add_none(env->profile); 
    478  
    479 //      struct emu_string *mode = emu_string_new(); 
    480 //      emu_memory_read_string(c->mem, p_mode, mode, 512); 
    481  
    482  
    483 //      printf("fopen(%s, %s)\n", emu_string_char(filename), (char *)mode->data); 
    484          
    485          
    486         emu_cpu_reg32_set(c, eax, 0x89898989); 
    487         emu_profile_function_returnvalue_ptr_set(env->profile, "FILE *", 0x89898989); 
    488         emu_profile_argument_add_none(env->profile); 
    489  
    490     emu_cpu_eip_set(c, eip_save); 
    491         return 0; 
    492 } 
    493  
    494 int32_t env_w32_hook_fwrite(struct emu_env *env, struct emu_env_hook *hook) 
    495 { 
    496         logDebug(env->emu, "Hook me Captain Cook!\n"); 
    497         logDebug(env->emu, "%s:%i %s\n",__FILE__,__LINE__,__FUNCTION__); 
    498  
    499         struct emu_cpu *c = emu_cpu_get(env->emu); 
    500  
    501         uint32_t eip_save; 
    502  
    503         POP_DWORD(c, &eip_save); 
    504  
    505 /* 
    506 size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream ); 
    507 */ 
    508         emu_profile_function_add(env->profile, "fwrite"); 
    509  
    510         uint32_t p_buffer; 
    511         MEM_DWORD_READ(c, c->reg[esp], &p_buffer); 
    512         emu_profile_argument_add_ptr(env->profile, "const void *", "buffer", p_buffer); 
    513         emu_profile_argument_add_none(env->profile); 
    514  
    515     uint32_t size; 
    516         MEM_DWORD_READ(c, (c->reg[esp]+4), &size); 
    517         emu_profile_argument_add_int(env->profile, "size_t", "size", size); 
    518  
    519         uint32_t count; 
    520         MEM_DWORD_READ(c, (c->reg[esp]+8), &count); 
    521         emu_profile_argument_add_int(env->profile, "count_t", "count", count); 
    522  
    523         uint32_t p_stream; 
    524         MEM_DWORD_READ(c, c->reg[esp]+12, &p_stream); 
    525         emu_profile_argument_add_ptr(env->profile, "FILE *", "stream", p_stream); 
    526         emu_profile_argument_add_none(env->profile); 
    527          
    528  
    529  
    530  
    531         logDebug(env->emu, "fwrite(0x%08x, %d, %d, 0x%08x)\n", p_buffer, size, count, p_stream); 
    532          
    533         emu_cpu_reg32_set(c, eax, size*count); 
    534         emu_profile_function_returnvalue_int_set(env->profile, "size_t", size*count); 
    535  
    536     emu_cpu_eip_set(c, eip_save); 
    537         return 0; 
    538 } 
    539458 
    540459int32_t env_w32_hook_GetProcAddress(struct emu_env *env, struct emu_env_hook *hook) 
     
    557476        uint32_t module;// = emu_cpu_reg32_get(c, esp); 
    558477        POP_DWORD(c, &module); 
    559         emu_profile_argument_add_int(env->profile, "HMODULE", "hModule", module); 
    560  
     478        emu_profile_argument_add_ptr(env->profile, "HMODULE", "hModule", module); 
     479        emu_profile_argument_add_none(env->profile); 
    561480//      printf("module ptr is %08x\n", module); 
    562481 
     
    795714                        logDebug(env->emu, "found dll %s, baseaddr is %08x \n",env->env.win->loaded_dlls[i]->dllname,env->env.win->loaded_dlls[i]->baseaddr); 
    796715                        emu_cpu_reg32_set(c, eax, env->env.win->loaded_dlls[i]->baseaddr); 
     716                        emu_profile_function_returnvalue_ptr_set(env->profile, "HMODULE", env->env.win->loaded_dlls[i]->baseaddr); 
     717                        emu_profile_argument_add_none(env->profile); 
    797718                        found_dll = 1; 
    798719                } 
     
    1030951        POP_DWORD(c, &eip_save); 
    1031952 
     953        emu_profile_function_add(env->profile, "WriteFile"); 
    1032954/* 
    1033955BOOL WriteFile( 
     
    1041963        uint32_t file; 
    1042964        POP_DWORD(c, &file); 
    1043  
    1044         uint32_t buffer; 
    1045         POP_DWORD(c,  &buffer); 
     965        emu_profile_argument_add_int(env->profile, "HANDLE", "hFile", file); 
     966 
     967        uint32_t p_buffer; 
     968        POP_DWORD(c,  &p_buffer); 
    1046969 
    1047970        uint32_t bytestowrite; 
    1048971        POP_DWORD(c,  &bytestowrite); 
    1049972 
    1050         uint32_t byteswritten; 
    1051         POP_DWORD(c,  &byteswritten); 
    1052  
    1053         uint32_t overlapped; 
    1054         POP_DWORD(c,  &overlapped); 
    1055  
    1056         emu_memory_write_dword(emu_memory_get(env->emu), byteswritten, bytestowrite); 
    1057  
    1058         emu_cpu_reg32_set(c, eax, 32); 
    1059  
    1060         emu_cpu_eip_set(c, eip_save); 
    1061         return 0; 
    1062 
    1063  
    1064  
     973        emu_profile_argument_add_ptr(env->profile, "LPCVOID", "lpBuffer", p_buffer); 
     974        unsigned char *buffer = malloc(bytestowrite); 
     975        emu_memory_read_block(emu_memory_get(env->emu), p_buffer, buffer, bytestowrite); 
     976        emu_profile_argument_add_bytea(env->profile, "", "", buffer, bytestowrite); 
     977 
     978        emu_profile_argument_add_int(env->profile, "DWORD", "nNumberOfBytesToWrite", bytestowrite); 
     979 
     980        uint32_t p_byteswritten; 
     981        POP_DWORD(c,  &p_byteswritten); 
     982        emu_profile_argument_add_ptr(env->profile, "LPDWORD", "lpNumberOfBytesWritten", p_byteswritten); 
     983        emu_profile_argument_add_none(env->profile); 
     984         
     985        uint32_t p_overlapped; 
     986        POP_DWORD(c,  &p_overlapped); 
     987        emu_profile_argument_add_ptr(env->profile, "LPOVERLAPPED", "lpOverlapped", p_overlapped); 
     988        emu_profile_argument_add_none(env->profile); 
     989 
     990 
     991        emu_memory_write_dword(emu_memory_get(env->emu), p_byteswritten, bytestowrite); 
     992 
     993 
     994        uint32_t returnvalue; 
     995        if ( hook->hook.win->userhook != NULL ) 
     996        { 
     997                returnvalue = hook->hook.win->userhook(env, hook,  
     998                                                                                           file, 
     999                                                                                           buffer, 
     1000                                                                                           bytestowrite, 
     1001                                                                                           p_byteswritten, 
     1002                                                                                           p_overlapped); 
     1003        }else 
     1004        { 
     1005                returnvalue     = 1; 
     1006        } 
     1007 
     1008        emu_profile_function_returnvalue_int_set(env->profile, "BOOL", returnvalue); 
     1009        emu_cpu_reg32_set(c, eax, returnvalue); 
     1010 
     1011 
     1012        emu_cpu_eip_set(c, eip_save); 
     1013        return 0; 
     1014
     1015 
     1016 
  • libemu/trunk/src/environment/win32/env_w32_dll_export_msvcrt_hooks.c

    r1631 r1659  
    9595} 
    9696 
     97 
     98int32_t env_w32_hook_fclose(struct emu_env *env, struct emu_env_hook *hook) 
     99{ 
     100        logDebug(env->emu, "Hook me Captain Cook!\n"); 
     101        logDebug(env->emu, "%s:%i %s\n",__FILE__,__LINE__,__FUNCTION__); 
     102 
     103        struct emu_cpu *c = emu_cpu_get(env->emu); 
     104 
     105        uint32_t eip_save; 
     106 
     107        POP_DWORD(c, &eip_save); 
     108 
     109/* 
     110int _fcloseall( void ); 
     111int fclose( FILE *stream ); 
     112*/ 
     113        emu_profile_function_add(env->profile, "fclose"); 
     114 
     115        uint32_t p_stream; 
     116        MEM_DWORD_READ(c, c->reg[esp], &p_stream); 
     117 
     118        emu_profile_argument_add_ptr(env->profile, "FILE *", "stream", p_stream); 
     119        emu_profile_argument_add_none(env->profile); 
     120 
     121 
     122        logDebug(env->emu, "fclose(0x%08x)\n", p_stream); 
     123         
     124        emu_cpu_reg32_set(c, eax, 0); 
     125        emu_profile_function_returnvalue_int_set(env->profile, "int", 0); 
     126 
     127    emu_cpu_eip_set(c, eip_save); 
     128        return 0; 
     129} 
     130 
     131 
     132int32_t env_w32_hook_fopen(struct emu_env *env, struct emu_env_hook *hook) 
     133{ 
     134        logDebug(env->emu, "Hook me Captain Cook!\n"); 
     135        logDebug(env->emu, "%s:%i %s\n",__FILE__,__LINE__,__FUNCTION__); 
     136 
     137        struct emu_cpu *c = emu_cpu_get(env->emu); 
     138 
     139        uint32_t eip_save; 
     140 
     141        POP_DWORD(c, &eip_save); 
     142 
     143/* 
     144FILE *fopen( const char *filename, const char *mode ); 
     145FILE *_wfopen( const wchar_t *filename, const wchar_t *mode ); 
     146*/ 
     147        emu_profile_function_add(env->profile, "fopen"); 
     148 
     149        uint32_t p_filename; 
     150        MEM_DWORD_READ(c, c->reg[esp], &p_filename); 
     151        emu_profile_argument_add_ptr(env->profile, "const char *", "filename", p_filename); 
     152 
     153        struct emu_string *filename = emu_string_new(); 
     154        emu_memory_read_string(c->mem, p_filename, filename, 512); 
     155        emu_profile_argument_add_string(env->profile, "", "", emu_string_char(filename)); 
     156         
     157        uint32_t p_mode; 
     158        MEM_DWORD_READ(c, c->reg[esp]+4, &p_mode); 
     159        struct emu_string *mode = emu_string_new(); 
     160        emu_memory_read_string(c->mem, p_mode, mode, 512); 
     161        emu_profile_argument_add_ptr(env->profile, "const char *", "mode", p_mode); 
     162        emu_profile_argument_add_string(env->profile,  "", "", emu_string_char(mode)); 
     163 
     164 
     165 
     166//      printf("fopen(%s, %s)\n", emu_string_char(filename), (char *)mode->data); 
     167         
     168 
     169        uint32_t returnvalue; 
     170        if ( hook->hook.win->userhook != NULL ) 
     171        { 
     172                returnvalue = hook->hook.win->userhook(env, hook,  
     173                                                                                           emu_string_char(filename), 
     174                                                                                           emu_string_char(mode)); 
     175        }else 
     176        { 
     177                returnvalue     = 0x89898989; 
     178        } 
     179 
     180        emu_cpu_reg32_set(c, eax, returnvalue); 
     181        emu_profile_function_returnvalue_ptr_set(env->profile, "FILE *", returnvalue); 
     182        emu_profile_argument_add_none(env->profile); 
     183 
     184 
     185        emu_string_free(filename); 
     186        emu_string_free(mode); 
     187 
     188    emu_cpu_eip_set(c, eip_save); 
     189        return 0; 
     190} 
     191 
     192int32_t env_w32_hook_fwrite(struct emu_env *env, struct emu_env_hook *hook) 
     193{ 
     194        logDebug(env->emu, "Hook me Captain Cook!\n"); 
     195        logDebug(env->emu, "%s:%i %s\n",__FILE__,__LINE__,__FUNCTION__); 
     196 
     197        struct emu_cpu *c = emu_cpu_get(env->emu); 
     198 
     199        uint32_t eip_save; 
     200 
     201        POP_DWORD(c, &eip_save); 
     202 
     203/* 
     204size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream ); 
     205*/ 
     206        emu_profile_function_add(env->profile, "fwrite"); 
     207 
     208        uint32_t p_buffer; 
     209        MEM_DWORD_READ(c, c->reg[esp], &p_buffer); 
     210        emu_profile_argument_add_ptr(env->profile, "const void *", "buffer", p_buffer); 
     211         
     212 
     213    uint32_t size; 
     214        MEM_DWORD_READ(c, (c->reg[esp]+4), &size); 
     215 
     216 
     217 
     218        uint32_t count; 
     219        MEM_DWORD_READ(c, (c->reg[esp]+8), &count); 
     220 
     221        unsigned char *buffer = malloc(size*count); 
     222        emu_memory_read_block(emu_memory_get(env->emu), p_buffer, buffer, size*count); 
     223        emu_profile_argument_add_bytea(env->profile, "", "", buffer, size*count); 
     224 
     225 
     226        emu_profile_argument_add_int(env->profile, "size_t", "size", size); 
     227        emu_profile_argument_add_int(env->profile, "count_t", "count", count); 
     228 
     229        uint32_t p_stream; 
     230        MEM_DWORD_READ(c, c->reg[esp]+12, &p_stream); 
     231        emu_profile_argument_add_ptr(env->profile, "FILE *", "stream", p_stream); 
     232        emu_profile_argument_add_none(env->profile); 
     233         
     234 
     235        uint32_t returnvalue; 
     236        if ( hook->hook.win->userhook != NULL ) 
     237        { 
     238                returnvalue = hook->hook.win->userhook(env, hook,  
     239                                                                                           buffer, 
     240                                                                                           size, 
     241                                                                                           count, 
     242                                                                                           p_stream); 
     243        }else 
     244        { 
     245                returnvalue     = size*count; 
     246        } 
     247 
     248 
     249        logDebug(env->emu, "fwrite(0x%08x, %d, %d, 0x%08x)\n", p_buffer, size, count, p_stream); 
     250         
     251        emu_cpu_reg32_set(c, eax, returnvalue); 
     252        emu_profile_function_returnvalue_int_set(env->profile, "size_t", returnvalue); 
     253 
     254    emu_cpu_eip_set(c, eip_save); 
     255        return 0; 
     256} 
     257