All pastes #596669 Raw Edit

Mine

public text v1 · immutable
#596669 ·published 2007-06-30 03:22 UTC
rendered paste body
// + IMPLEMENTATION FOR MANAGING MEMORY
class CMemManager
{
public:
	void RevertAll( )
	{
		for( std::deque<MemBlock>::iterator i = _blocks.begin( ); i != _blocks.end( ); i++ )
		{
			DWORD dwOldProtection;
			VirtualProtect( (*i).addr, (*i).size, PAGE_EXECUTE_READWRITE, &dwOldProtection );
			memcpy( (*i).addr, (*i).olddata, (*i).size );
			VirtualProtect( (*i).addr, (*i).size, dwOldProtection, &dwOldProtection );
		}
		_blocks.clear( );
	}

	void Revert( int id )
	{
		for( std::deque<MemBlock>::iterator i = _blocks.begin( ); i != _blocks.end( ); i++ )
		{
			if( (*i).id == id )
			{
				DWORD dwOldProtection;
				VirtualProtect( (*i).addr, (*i).size, PAGE_EXECUTE_READWRITE, &dwOldProtection );
				memcpy( (*i).addr, (*i).olddata, (*i).size );
				VirtualProtect( (*i).addr, (*i).size, dwOldProtection, &dwOldProtection );
				_blocks.erase( i );
				Revert( id );
				break;
			}
		}
	}

	void WriteBlock( void* addr, int size, char* newdata, int id = -1 )
	{
		DWORD dwOldProtection;
		VirtualProtect( addr, size, PAGE_EXECUTE_READWRITE, &dwOldProtection );
		char* tmp = new char[ size ];
		memcpy( tmp, addr, size );
		MemBlock d = { addr, size, tmp, id };
		_blocks.push_back( d );
		memcpy( addr, newdata, size );
		VirtualProtect( addr, size, dwOldProtection, &dwOldProtection );
	}
	
	enum BlockType { NOCLIP };

protected:
	struct MemBlock { void* addr; int size; char* olddata; int id; };
	std::deque<MemBlock> _blocks;
};
CMemManager memmgr;