2009년 09월 17일
리버싱 5-5
5장에서 알아낸 Generic Table의 내부 데이터 구조체
struct NODE
{
NODE *ParentNode;
NODE *RightChild;
NODE *LeftChild;
LIST_ENTRY LLEntry;
ULONG Unknown;
}
struct TABLE
{
NODE *TopNode;
LIST_ENTRY LLHead;
LIST_ENTRY *LastElementFound;
ULONG LastElementIndex;
ULONG NumberOfElements;
TABLE_COMPARE_ELEMENTS CompareElements;
TABLE_ALLOCATE_ELEMENT AllocateElement;
TABLE_FREE_ELEMENT FreeElement;
ULONG unknown;
};
Generic Table 콜백 함수에 대한 프로토타입
typedef int (NTAPI*TABLE_COMPARE_ELEMENTS) (TABLE *pTable, PVOID pElement1, PVOID pElement2);
typedef NODE * (NTAPI * TABLE_ALLOCATE_ELEMENT) ( TABLE *pTable, ULONG TotalElementSize );
typedef void (NTAPI * TABLE_FREE_ELEMENT) ( TABLE *pTable, PVOID Element );
기본적인 Generic Table API의 프로토타입
void NTAPI RtlInitializeGenericTable(
TABLE *pGenericTable,
TABLE_COMPARE_ELEMENTS ComapreElements,
TABLE_ALLOCATE_ELEMENT AllocateElement,
TABLE_FREE_ELEMENT FreeElement,
ULONG Unknown
);
ULONG NTAPI RtlNumberGenericTableElements( TABLE *pGenericTable );
BOOLEAN NTAPI RtlIsGenericTableEmpty( TABLE *pGenericTable );
PVOID NTAPI RtlGetElementGenericTable(
TABLE *pGenericTable,
ULONG ElementNumber
);
PVOID NTAPI RtlInsertElementGenericTable(
TABLE *pGenericTable,
PVOID ElementData,
ULONG DataLength,
OUT BOOLEAN *IsNewElement
);
PVOID NTAPI RtlLookupElementGenericTable(
TABLE *pGenericTable,
PVOID ElementToFind
);
BOOLEAN NTAPI RtlDeleteElementGenericTable(
TABLE *pGenericTable,
PVOID ElementToFind
);
# by | 2009/09/17 14:32 | 그냥 | 트랙백 | 덧글(0)



