X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fthecheat;a=blobdiff_plain;f=Searching.m;h=d1885d9956f13cd666ae0b6f3b727dbef419f9b2;hp=2d1ddb585146b0eb59c384668186d8ffda6defa9;hb=HEAD;hpb=d27548f80fe411fda2ee69c74a24eab4292267e9 diff --git a/Searching.m b/Searching.m index 2d1ddb5..d1885d9 100644 --- a/Searching.m +++ b/Searching.m @@ -1,10 +1,14 @@ -// -// Searching.m -// The Cheat -// -// Created by Chaz McGarvey on 12/28/04. -// Copyright 2004 Chaz McGarvey. All rights reserved. -// + +/* + * 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" @@ -57,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; @@ -85,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; @@ -141,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; @@ -151,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 ) { @@ -170,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)); - ptr = context->buffer + *context->lastAddressPtr - VMRegionAddress(region); - 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 (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; @@ -232,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; @@ -262,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; @@ -325,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; @@ -409,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; @@ -439,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; @@ -498,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; @@ -528,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;