]> Dogcows Code - chaz/thecheat/blobdiff - Searching.m
update contact information and project URL
[chaz/thecheat] / Searching.m
index 2d1ddb585146b0eb59c384668186d8ffda6defa9..d1885d9956f13cd666ae0b6f3b727dbef419f9b2 100644 (file)
@@ -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;
This page took 0.02779 seconds and 4 git commands to generate.