PVOID kuhl_m_sekurlsa_utils_pFromAVLByLuidRec(PKULL_M_MEMORY_ADDRESS pTable, ULONG LUIDoffset, PLUID luidToFind) { PVOID resultat = NULL; RTL_AVL_TABLE maTable; KULL_M_MEMORY_ADDRESS data = {&maTable, &KULL_M_MEMORY_GLOBAL_OWN_HANDLE}; if(kull_m_memory_copy(&data, pTable, sizeof(RTL_AVL_TABLE))) { if(pTable->address = maTable.OrderedPointer) { if(data.address = LocalAlloc(LPTR, LUIDoffset + sizeof(LUID))) { if(kull_m_memory_copy(&data, pTable, LUIDoffset + sizeof(LUID))) { if(SecEqualLuid(luidToFind, (PLUID) ((PBYTE) (data.address) + LUIDoffset))) resultat = maTable.OrderedPointer; } LocalFree(data.address); } } if(!resultat && (pTable->address = maTable.BalancedRoot.LeftChild)) resultat = kuhl_m_sekurlsa_utils_pFromAVLByLuidRec(pTable, LUIDoffset, luidToFind); if(!resultat && (pTable->address = maTable.BalancedRoot.RightChild)) resultat = kuhl_m_sekurlsa_utils_pFromAVLByLuidRec(pTable, LUIDoffset, luidToFind); } return resultat; }
ULONG_PTR kuhl_m_sekurlsa_utils_pFromAVLByLuidRec(ULONG_PTR pTable, ULONG LUIDoffset, PLUID luidToFind) { ULONG_PTR resultat = 0; PVOID buffer; RTL_AVL_TABLE maTable; if(ReadMemory(pTable, &maTable, sizeof(RTL_AVL_TABLE), NULL)) { if(pTable = (ULONG_PTR) maTable.OrderedPointer) { if(buffer = LocalAlloc(LPTR, LUIDoffset + sizeof(LUID))) { if(ReadMemory(pTable, buffer, LUIDoffset + sizeof(LUID), NULL)) { if(RtlEqualLuid(luidToFind, (PLUID) ((PBYTE) buffer + LUIDoffset))) resultat = (ULONG_PTR) maTable.OrderedPointer; } LocalFree(buffer); } } if(!resultat && (pTable = (ULONG_PTR) maTable.BalancedRoot.LeftChild)) resultat = kuhl_m_sekurlsa_utils_pFromAVLByLuidRec(pTable, LUIDoffset, luidToFind); if(!resultat && (pTable = (ULONG_PTR) maTable.BalancedRoot.RightChild)) resultat = kuhl_m_sekurlsa_utils_pFromAVLByLuidRec(pTable, LUIDoffset, luidToFind); } return resultat; }
ULONG_PTR kuhl_m_sekurlsa_utils_pFromAVLByLuid(ULONG_PTR pTable, ULONG LUIDoffset, PLUID luidToFind) { ULONG_PTR resultat = 0; RTL_AVL_TABLE maTable; if(ReadMemory(pTable, &maTable, sizeof(RTL_AVL_TABLE), NULL)) { pTable = (ULONG_PTR) maTable.BalancedRoot.RightChild; resultat = kuhl_m_sekurlsa_utils_pFromAVLByLuidRec(pTable, LUIDoffset, luidToFind); } return resultat; }
PVOID kuhl_m_sekurlsa_utils_pFromAVLByLuid(PKULL_M_MEMORY_ADDRESS pTable, ULONG LUIDoffset, PLUID luidToFind) { PVOID resultat = NULL; RTL_AVL_TABLE maTable; KULL_M_MEMORY_ADDRESS data = {&maTable, &KULL_M_MEMORY_GLOBAL_OWN_HANDLE}; if(kull_m_memory_copy(&data, pTable, sizeof(RTL_AVL_TABLE))) { pTable->address = maTable.BalancedRoot.RightChild; resultat = kuhl_m_sekurlsa_utils_pFromAVLByLuidRec(pTable, LUIDoffset, luidToFind); } return resultat; }