#ifndef _METERPRETER_PIVOT_TREE
#define _METERPRETER_PIVOT_TREE

typedef DWORD(*PivotWritePacket)(LPVOID state, LPBYTE rawPacket, DWORD rawPacketLength);
typedef DWORD(*PivotRemove)(LPVOID state);

typedef struct _PivotContext
{
	PivotWritePacket packet_write;
	PivotRemove remove;
	LPVOID state;
} PivotContext;

typedef struct _PivotNode PivotNode;

typedef struct _PivotTree
{
	PivotNode* head;
} PivotTree;

typedef void(*PivotTreeTraverseCallback)(LPBYTE guid, PivotContext* ctx, LPVOID state);

PivotTree* pivot_tree_create();
DWORD pivot_tree_add(PivotTree* tree, LPBYTE guid, PivotContext* ctx);
PivotContext* pivot_tree_remove(PivotTree* tree, LPBYTE guid);
PivotContext* pivot_tree_find(PivotTree* tree, LPBYTE guid);
void pivot_tree_traverse(PivotTree* tree, PivotTreeTraverseCallback callback, LPVOID state);
void pivot_tree_destroy(PivotTree* tree);


#ifdef DEBUGTRACE
void dbgprint_pivot_tree(PivotTree* tree);
#endif

#endif