Changeset 1659
- Timestamp:
- 07/21/08 00:43:57 (2 months ago)
- Files:
-
- libemu/trunk/include/emu/environment/win32/env_w32_dll_export_kernel32_hooks.h (modified) (1 diff)
- libemu/trunk/include/emu/environment/win32/env_w32_dll_export_msvcrt_hooks.h (modified) (1 diff)
- libemu/trunk/src/environment/win32/env_w32_dll_export_kernel32_hooks.c (modified) (9 diffs)
- libemu/trunk/src/environment/win32/env_w32_dll_export_msvcrt_hooks.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
libemu/trunk/include/emu/environment/win32/env_w32_dll_export_kernel32_hooks.h
r1607 r1659 34 34 int32_t env_w32_hook_ExitProcess(struct emu_env *env, struct emu_env_hook *hook); 35 35 int32_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);39 36 int32_t env_w32_hook_GetProcAddress(struct emu_env *env, struct emu_env_hook *hook); 40 37 int32_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 29 29 30 30 int32_t env_w32_hook__execv(struct emu_env *env, struct emu_env_hook *hook); 31 int32_t env_w32_hook_fclose(struct emu_env *env, struct emu_env_hook *hook); 32 int32_t env_w32_hook_fopen(struct emu_env *env, struct emu_env_hook *hook); 33 int32_t env_w32_hook_fwrite(struct emu_env *env, struct emu_env_hook *hook); 31 34 35 libemu/trunk/src/environment/win32/env_w32_dll_export_kernel32_hooks.c
r1655 r1659 80 80 uint32_t object; 81 81 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 83 98 84 99 emu_cpu_eip_set(c, eip_save); … … 111 126 emu_profile_function_add(env->profile, "CreateFile"); 112 127 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)); 118 134 119 135 uint32_t desiredaccess; … … 140 156 uint32_t templatefile; 141 157 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); 145 185 return 0; 146 186 } … … 177 217 POP_DWORD(c, &p_imagename); 178 218 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 180 224 181 225 uint32_t p_cmdline; … … 412 456 } 413 457 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 }539 458 540 459 int32_t env_w32_hook_GetProcAddress(struct emu_env *env, struct emu_env_hook *hook) … … 557 476 uint32_t module;// = emu_cpu_reg32_get(c, esp); 558 477 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); 561 480 // printf("module ptr is %08x\n", module); 562 481 … … 795 714 logDebug(env->emu, "found dll %s, baseaddr is %08x \n",env->env.win->loaded_dlls[i]->dllname,env->env.win->loaded_dlls[i]->baseaddr); 796 715 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); 797 718 found_dll = 1; 798 719 } … … 1030 951 POP_DWORD(c, &eip_save); 1031 952 953 emu_profile_function_add(env->profile, "WriteFile"); 1032 954 /* 1033 955 BOOL WriteFile( … … 1041 963 uint32_t file; 1042 964 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); 1046 969 1047 970 uint32_t bytestowrite; 1048 971 POP_DWORD(c, &bytestowrite); 1049 972 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 95 95 } 96 96 97 98 int32_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 /* 110 int _fcloseall( void ); 111 int 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 132 int32_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 /* 144 FILE *fopen( const char *filename, const char *mode ); 145 FILE *_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 192 int32_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 /* 204 size_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
