/* * @implemented */ BOOLEAN NTAPI RtlIsValidIndexHandle( IN PRTL_HANDLE_TABLE HandleTable, IN ULONG Index, OUT PRTL_HANDLE_TABLE_ENTRY *Handle) { PRTL_HANDLE_TABLE_ENTRY InternalHandle; DPRINT("RtlIsValidIndexHandle(HandleTable %p Index 0x%lx Handle %p)\n", HandleTable, Index, Handle); if (HandleTable == NULL) return FALSE; DPRINT("Handles %p HandleSize 0x%lx\n", HandleTable->CommittedHandles, HandleTable->SizeOfHandleTableEntry); InternalHandle = (PRTL_HANDLE_TABLE_ENTRY)((ULONG_PTR)HandleTable->CommittedHandles + (HandleTable->SizeOfHandleTableEntry * Index)); if (!RtlIsValidHandle(HandleTable, InternalHandle)) return FALSE; DPRINT("InternalHandle %p\n", InternalHandle); if (Handle != NULL) *Handle = InternalHandle; return TRUE; }
/* * @implemented */ BOOLEAN NTAPI RtlFreeHandle( PRTL_HANDLE_TABLE HandleTable, PRTL_HANDLE_TABLE_ENTRY Handle) { #if DBG /* check if handle is valid */ if (!RtlIsValidHandle(HandleTable, Handle)) { DPRINT1("Invalid Handle! HandleTable=0x%p, Handle=0x%p, Handle->Flags=0x%x\n", HandleTable, Handle, Handle ? Handle->Flags : 0); return FALSE; } #endif /* clear handle */ memset(Handle, 0, HandleTable->SizeOfHandleTableEntry); /* add handle to free list */ Handle->NextFree = HandleTable->FreeHandles; HandleTable->FreeHandles = Handle; return TRUE; }
/************************************************************************** * RtlIsValidIndexHandle (NTDLL.@) * * Determines whether a handle index is valid or not. * * PARAMS * HandleTable [I] The handle table. * Index [I] The index of the handle to be tested. * ValidHandle [O] The handle Index refers to. * * RETURNS * Valid: TRUE. * Invalid: FALSE. */ BOOLEAN WINAPI RtlIsValidIndexHandle(const RTL_HANDLE_TABLE * HandleTable, ULONG Index, RTL_HANDLE ** ValidHandle) { RTL_HANDLE * Handle; TRACE("(%p, %u, %p)\n", HandleTable, Index, ValidHandle); Handle = (RTL_HANDLE *) ((char *)HandleTable->FirstHandle + Index * HandleTable->HandleSize); if (RtlIsValidHandle(HandleTable, Handle)) { *ValidHandle = Handle; return TRUE; } return FALSE; }
BOOLEAN RtlIsValidIndexHandle( IN PRTL_HANDLE_TABLE HandleTable, IN ULONG HandleIndex, OUT PRTL_HANDLE_TABLE_ENTRY *Handle ) { PRTL_HANDLE_TABLE_ENTRY p; p = (PRTL_HANDLE_TABLE_ENTRY) ((PCHAR)HandleTable->CommittedHandles + (HandleIndex * HandleTable->SizeOfHandleTableEntry)); if (RtlIsValidHandle( HandleTable, p )) { *Handle = p; return TRUE; } else { return FALSE; } }
BOOLEAN RtlFreeHandle( IN PRTL_HANDLE_TABLE HandleTable, IN PRTL_HANDLE_TABLE_ENTRY Handle ) { #if DBG if (!RtlIsValidHandle( HandleTable, Handle )) { DbgPrint( "RTL: RtlFreeHandle( %lx ) - invalid handle\n", Handle ); if (NtCurrentPeb()->BeingDebugged) { DbgBreakPoint(); } return FALSE; } #endif RtlZeroMemory( Handle, HandleTable->SizeOfHandleTableEntry ); Handle->NextFree = HandleTable->FreeHandles; HandleTable->FreeHandles = Handle; return TRUE; }