X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fthecheat;a=blobdiff_plain;f=Searching.m;h=d1885d9956f13cd666ae0b6f3b727dbef419f9b2;hp=2814a32a94bac1f7ecebc322f07698745023cdb2;hb=HEAD;hpb=44e9757722f3ed40d15e0a7d06c50567d9664833 diff --git a/Searching.m b/Searching.m index 2814a32..d1885d9 100644 --- a/Searching.m +++ b/Searching.m @@ -1,22 +1,13 @@ -// ********************************************************************** -// The Cheat - A universal game cheater for Mac OS X -// (C) 2003-2005 Chaz McGarvey (BrokenZipper) -// -// This program is free software; you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation; either version 1, or (at your option) -// any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -// +/* + * The Cheat - The legendary universal game trainer for Mac OS X. + * http://www.brokenzipper.com/trac/wiki/TheCheat + * + * Copyright (c) 2003-2011, Charles McGarvey et al. + * + * Distributable under the terms and conditions of the 2-clause BSD + * license; see the file COPYING for the legal text of the license. + */ #import "Searching.h" @@ -70,7 +61,7 @@ int SearchIteration( ThreadedTask *task, unsigned iteration ) SearchContext *context = [task context]; VMRegion region; unsigned hitsPerRegion = 0; - vm_size_t size; + mach_vm_size_t size; void *ptr, *top; TCAddress offset; @@ -98,7 +89,24 @@ int SearchIteration( ThreadedTask *task, unsigned iteration ) offset = VMRegionAddress( region ) - (TCAddress)context->buffer; while ( ptr < top ) { - if ( context->compareFunc(ptr,context->value->_value) ) { + char firstValue[context->value->_size]; + memcpy(firstValue, ptr, context->value->_size); + + if (context->value->_isEmulated) + { + if (context->value->_type == TCFloat) + { + CFSwappedFloat32 firstSwappedFloat = CFConvertFloat32HostToSwapped(*((float *)firstValue)); + memcpy(firstValue, &firstSwappedFloat, context->value->_size); + } + else if (context->value->_type == TCDouble) + { + CFSwappedFloat64 firstSwappedDouble = CFConvertDoubleHostToSwapped(*((double *)firstValue)); + memcpy(firstValue, &firstSwappedDouble, context->value->_size); + } + } + + if ( context->compareFunc(firstValue,context->value->_value) ) { if ( context->numberOfResults >= TCArrayElementCount(context->addresses) ) { TCArrayResize( context->addresses, TCArrayElementCount(context->addresses) + TC_BUFFER_SIZE / sizeof(TCAddress) ); context->addressPtr = (TCAddress *)TCArrayBytes(context->addresses) + context->numberOfResults; @@ -154,7 +162,7 @@ int SearchIterationAgain( ThreadedTask *task, unsigned iteration ) SearchContext *context = [task context]; VMRegion region; unsigned hitsPerRegion = 0; - vm_size_t size; + mach_vm_size_t size; void *ptr; unsigned i, top; @@ -164,7 +172,6 @@ int SearchIterationAgain( ThreadedTask *task, unsigned iteration ) context->lastRegion = VMMakeRegion( context->process, *(context->lastRegionPtr), 0 ); region = VMNextRegionWithAttributes( context->process, context->lastRegion, VMREGION_READABLE | VMREGION_WRITABLE ); if ( VMRegionIsNotNull( region ) ) { - if ( context->bufferSize < VMRegionSize( region ) ) { char *buf = realloc( context->buffer, VMRegionSize( region ) ); if ( buf ) { @@ -183,9 +190,26 @@ int SearchIterationAgain( ThreadedTask *task, unsigned iteration ) top = *context->lastPerRegionPtr; for ( i = 0; i < top; i++ ) { + ptr = (void *)((TCAddress)context->buffer + *context->lastAddressPtr - VMRegionAddress(region)); + + char firstValue[context->value->_size]; + memcpy(firstValue, ptr, context->value->_size); + + if (context->value->_isEmulated) + { + if (context->value->_type == TCFloat) + { + CFSwappedFloat32 firstSwappedFloat = CFConvertFloat32HostToSwapped(*((float *)firstValue)); + memcpy(firstValue, &firstSwappedFloat, context->value->_size); + } + else if (context->value->_type == TCDouble) + { + CFSwappedFloat64 firstSwappedDouble = CFConvertDoubleHostToSwapped(*((double *)firstValue)); + memcpy(firstValue, &firstSwappedDouble, context->value->_size); + } + } - ptr = context->buffer + *context->lastAddressPtr - VMRegionAddress(region); - if ( context->compareFunc(ptr,context->value->_value) ) { + if (ptr >= context->buffer && context->compareFunc(firstValue,context->value->_value)) { if ( context->numberOfResults >= TCArrayElementCount(context->addresses) ) { TCArrayResize( context->addresses, TCArrayElementCount(context->addresses) + TC_BUFFER_SIZE / sizeof(TCAddress) ); context->addressPtr = (TCAddress *)TCArrayBytes(context->addresses) + context->numberOfResults; @@ -245,7 +269,7 @@ int SearchIterationLastValue( ThreadedTask *task, unsigned iteration ) SearchContext *context = [task context]; VMRegion region; unsigned hitsPerRegion = 0; - vm_size_t size; + mach_vm_size_t size; void *ptr; unsigned i, top; @@ -275,8 +299,8 @@ int SearchIterationLastValue( ThreadedTask *task, unsigned iteration ) for ( i = 0; i < top; i++ ) { - ptr = context->buffer + *context->lastAddressPtr - VMRegionAddress(region); - if ( context->compareFunc(ptr,context->lastValuePtr) ) { + ptr = (void *)((TCAddress)context->buffer + *context->lastAddressPtr - VMRegionAddress(region)); + if ( ptr >= context->buffer && context->compareFunc(ptr,context->lastValuePtr) ) { if ( context->numberOfResults >= TCArrayElementCount(context->addresses) ) { TCArrayResize( context->addresses, TCArrayElementCount(context->addresses) + TC_BUFFER_SIZE / sizeof(TCAddress) ); context->addressPtr = (TCAddress *)TCArrayBytes(context->addresses) + context->numberOfResults; @@ -338,7 +362,7 @@ int SearchStringIteration( ThreadedTask *task, unsigned iteration ) SearchContext *context = [task context]; VMRegion region; unsigned hitsPerRegion = 0; - vm_size_t size; + mach_vm_size_t size; void *ptr, *top, *hit; TCAddress offset; @@ -422,7 +446,7 @@ int SearchStringIterationAgain( ThreadedTask *task, unsigned iteration ) SearchContext *context = [task context]; VMRegion region; unsigned hitsPerRegion = 0; - vm_size_t size; + mach_vm_size_t size; void *ptr; unsigned i, top; @@ -452,8 +476,9 @@ int SearchStringIterationAgain( ThreadedTask *task, unsigned iteration ) for ( i = 0; i < top; i++ ) { - ptr = context->buffer + *context->lastAddressPtr - VMRegionAddress(region); - if ( memcmp( ptr, context->value->_value, MIN(TCArrayElementSize(context->values),context->buffer+VMRegionAddress(region)-ptr) ) == 0 ) { + ptr = (void *)((TCAddress)context->buffer + *context->lastAddressPtr - VMRegionAddress(region)); + + if ( ptr >= context->buffer && memcmp( ptr, context->value->_value, MIN(TCArrayElementSize(context->values),(TCAddress)context->buffer+VMRegionAddress(region)-(TCAddress)ptr) ) == 0 ) { if ( context->numberOfResults >= TCArrayElementCount(context->addresses) ) { TCArrayResize( context->addresses, TCArrayElementCount(context->addresses) + TC_BUFFER_SIZE / sizeof(TCAddress) ); context->addressPtr = (TCAddress *)TCArrayBytes(context->addresses) + context->numberOfResults; @@ -511,7 +536,7 @@ int SearchStringIterationLastValue( ThreadedTask *task, unsigned iteration ) SearchContext *context = [task context]; VMRegion region; unsigned hitsPerRegion = 0; - vm_size_t size; + mach_vm_size_t size; void *ptr; unsigned i, top; @@ -541,8 +566,8 @@ int SearchStringIterationLastValue( ThreadedTask *task, unsigned iteration ) for ( i = 0; i < top; i++ ) { - ptr = context->buffer + *context->lastAddressPtr - VMRegionAddress(region); - if ( memcmp( ptr, context->lastValuePtr, MIN(TCArrayElementSize(context->values),context->buffer+VMRegionAddress(region)-ptr) ) == 0 ) { + ptr = (void *)((TCAddress)context->buffer + *context->lastAddressPtr - VMRegionAddress(region)); + if ( ptr >= context->buffer && memcmp( ptr, context->lastValuePtr, MIN(TCArrayElementSize(context->values),(TCAddress)context->buffer+VMRegionAddress(region)-(TCAddress)ptr) ) == 0 ) { if ( context->numberOfResults >= TCArrayElementCount(context->addresses) ) { TCArrayResize( context->addresses, TCArrayElementCount(context->addresses) + TC_BUFFER_SIZE / sizeof(TCAddress) ); context->addressPtr = (TCAddress *)TCArrayBytes(context->addresses) + context->numberOfResults;