MHANDLE ClaimHandle( ADDR Address ) { // Need to scan along the list of handles to find an unused one if (HandlesInUse == (ElementsInHandleTable-1)) { // we have run out of handles TRACEUSER( "Rik", wxT("ClaimHandle - No more handles available. Trying to get some more\n") ); // First off we had better try to extend our allocation of memory to the table // If it fails, return saying there are no more handles left! if (!HandlesMemory.Grow(HandleTableTotalSize, HandleTableTotalSize+HandleTableByteSize, (LPVOID*)&HandlesTable )) { TRACE( wxT("ClaimHandle - Failed to get more handles!!!! P A N I C\n") ); return BAD_MHANDLE; } // grew handle table OK, Set all the new bits of mem to defaults for (INT32 i=0; i<HandleTableSize; i++) HandlesTable[ElementsInHandleTable+i].Address = PBYTE(BAD_MHANDLE); // increase the counters HandleTableTotalSize += HandleTableByteSize; ElementsInHandleTable += HandleTableSize; } // Ok, we must have some handles by now, so lets try and find one UINT32 Handle = ElementsInHandleTable - 1; while (Handle>0) { if (HandlesTable[Handle].Address == BAD_MHANDLE ) { // Store the Addr HandlesTable[Handle].Address = Address; HandlesInUse ++; // if we are using unique IDs, do this #ifdef USE_UNIQUE_IDS // Using Unique IDS, so get the next id and store it away WORD UniqueID = CurrUniqueId++; HandlesTable[ Handle ].UniqueID = UniqueID; return MAKEINT32( Handle, UniqueID ); #else // TRACEUSER("Gerry", _T("ClaimHandle - %d"), Handle); return Handle; #endif } Handle --; } // Should never get here ENSURE( FALSE, "ClaimHandle: We Should never have reached this bit!" ); return BAD_MHANDLE; }