- Timestamp:
- Sep 23, 2010, 12:06:46 AM (11 years ago)
- Location:
- zzuf/trunk
- Files:
-
- 1 added
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
zzuf/trunk/configure.ac
r4372 r4656 55 55 AC_CHECK_FUNCS(__open64 __lseek64 __fopen64 __freopen64 __ftello64 __fseeko64 __fsetpos64) 56 56 AC_CHECK_FUNCS(__fgets_chk __fgets_unlocked_chk __fread_chk __fread_unlocked_chk __read_chk __recv_chk __recvfrom_chk) 57 AC_CHECK_FUNCS(CreateFile) 57 58 58 59 AC_CHECK_TYPES(sighandler_t, [], [], -
zzuf/trunk/msvc/config.h
r4653 r4656 26 26 #define HAVE_BIND 1 27 27 #define HAVE_CONNECT 1 28 #define HAVE_CREATEFILE 1 28 29 /* #undef HAVE_DLFCN_H */ 29 30 #define HAVE_DUP 1 -
zzuf/trunk/msvc/libzzuf.vcxproj
r4137 r4656 127 127 <ClCompile Include="..\src\libzzuf\lib-signal.c" /> 128 128 <ClCompile Include="..\src\libzzuf\lib-stream.c" /> 129 <ClCompile Include="..\src\libzzuf\lib-win32.c" /> 129 130 <ClCompile Include="..\src\libzzuf\libzzuf.c" /> 130 131 <ClCompile Include="..\src\libzzuf\network.c" /> -
zzuf/trunk/src/libzzuf/lib-load.h
r4655 r4656 54 54 # define DIVERT_END { NULL, NULL, NULL, NULL } 55 55 56 extern zzuf_table_t table_stream[]; 56 extern zzuf_table_t table_stream[], 57 table_win32[]; 57 58 58 59 #endif 59 -
zzuf/trunk/src/libzzuf/sys.c
r4655 r4656 94 94 static zzuf_table_t *list[] = 95 95 { 96 table_stream 96 table_stream, 97 table_win32, 97 98 }; 98 99 99 100 zzuf_table_t *diversion; 101 void *lib; 100 102 unsigned long dummy; 101 103 import_t import; … … 109 111 return; 110 112 111 for (k = 0 ; k < sizeof(list) / sizeof(*list); k++)113 for (k = 0, diversion = NULL; k < sizeof(list) / sizeof(*list); ) 112 114 { 113 for (diversion = list[k]; diversion->lib; diversion++) 115 if (!diversion) 116 diversion = list[k]; 117 118 if (!diversion->lib) 114 119 { 115 void *lib = GetModuleHandleA(diversion->lib); 116 *diversion->old = (void *)GetProcAddress(lib, diversion->name); 120 k++; 121 diversion = NULL; 122 continue; 123 } 117 124 118 for(j = 0; import[j].Name; j++) 125 lib = GetModuleHandleA(diversion->lib); 126 *diversion->old = (void *)GetProcAddress(lib, diversion->name); 127 128 for(j = 0; import[j].Name; j++) 129 { 130 char *name = (char *)module + import[j].Name; 131 if(lstrcmpiA(name, diversion->lib) != 0) 132 continue; 133 134 thunk = (thunk_t)((char *)module + import->FirstThunk); 135 for(i = 0; thunk[i].u1.Function; i++) 119 136 { 120 char *name = (char *)module + import[j].Name;121 if( lstrcmpiA(name, diversion->lib) != 0)137 void **func = (void **)&thunk[i].u1.Function; 138 if(*func != *diversion->old) 122 139 continue; 123 140 124 thunk = (thunk_t)((char *)module + import->FirstThunk); 125 for(i = 0; thunk[i].u1.Function; i++) 126 { 127 void **func = (void **)&thunk[i].u1.Function; 128 if(*func != *diversion->old) 129 continue; 130 131 /* FIXME: The StarCraft 2 hack uses two methods for function 132 * diversion. See HookSsdt() and HookHotPatch(). */ 133 VirtualProtect(func, sizeof(func), PAGE_EXECUTE_READWRITE, &dummy); 134 WriteProcessMemory(GetCurrentProcess(), func, &diversion->new, 135 sizeof(diversion->new), NULL); 136 } 141 /* FIXME: The StarCraft 2 hack uses two methods for function 142 * diversion. See HookSsdt() and HookHotPatch(). */ 143 VirtualProtect(func, sizeof(func), PAGE_EXECUTE_READWRITE, &dummy); 144 WriteProcessMemory(GetCurrentProcess(), func, &diversion->new, 145 sizeof(diversion->new), NULL); 137 146 } 138 147 } 148 149 diversion++; 139 150 } 140 151 }
Note: See TracChangeset
for help on using the changeset viewer.