X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fthecheat;a=blobdiff_plain;f=Searching.m;h=d1885d9956f13cd666ae0b6f3b727dbef419f9b2;hp=80ad0d620c8308ded91cbd5cb2669c8af6e87a5d;hb=HEAD;hpb=ad02580588e2ca41f15ba8f9bd084561d8d485c2 diff --git a/Searching.m b/Searching.m index 80ad0d6..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; @@ -182,9 +190,26 @@ int SearchIterationAgain( ThreadedTask *task, unsigned iteration ) top = *context->lastPerRegionPtr; for ( i = 0; i < top; i++ ) { - ptr = context->buffer + *context->lastAddressPtr - VMRegionAddress(region); + 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); + } + } - if (ptr >= context->buffer && 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; @@ -244,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; @@ -274,7 +299,7 @@ int SearchIterationLastValue( ThreadedTask *task, unsigned iteration ) for ( i = 0; i < top; i++ ) { - ptr = context->buffer + *context->lastAddressPtr - VMRegionAddress(region); + 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) ); @@ -337,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; @@ -421,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; @@ -451,9 +476,9 @@ int SearchStringIterationAgain( ThreadedTask *task, unsigned iteration ) for ( i = 0; i < top; i++ ) { - ptr = context->buffer + *context->lastAddressPtr - VMRegionAddress(region); + ptr = (void *)((TCAddress)context->buffer + *context->lastAddressPtr - VMRegionAddress(region)); - if ( ptr >= context->buffer && memcmp( ptr, context->value->_value, MIN(TCArrayElementSize(context->values),context->buffer+VMRegionAddress(region)-ptr) ) == 0 ) { + 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 ( ptr >= context->buffer && 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;