⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 kdlinkedlist.cpp

📁 尔罗斯著名黑客写的rootkit
💻 CPP
字号:
#include "KDLinkedList.h"
#include "../KLocker/KLocker.h"

KDLinkedList::KDLinkedList(VOID* pObject, KDLinkedListItem* pPrev, KDLinkedListItem* pNext)
            : KDLinkedListItem(pObject, pPrev, pNext)
{
//  m_pStartMatchDirItem = NULL;
  m_pHead = NULL;
  m_pTail = NULL;
}

KDLinkedList::~KDLinkedList()
{
  Clear();
}

void KDLinkedList::Clear()
{
  KLocker locker(&m_KSynchroObject);

  KDLinkedListItem* pItem;
  KDLinkedListItem* pItemNext;

  pItem = m_pHead;
  while (pItem != NULL)
  {
    pItemNext = pItem->GetNext();
    delete pItem;
    pItem = pItemNext;
  }
}

PVOID KDLinkedList::GetHeadObject()
{
  KLocker locker(&m_KSynchroObject);

  PVOID pObject = NULL;

  if (m_pHead != NULL)
    pObject = m_pHead->GetObject();

  return pObject;
}

PVOID KDLinkedList::GetTailObject()
{
  KLocker locker(&m_KSynchroObject);

  PVOID pObject = NULL;

  if (m_pTail != NULL)
    pObject = m_pTail->GetObject();

  return pObject;
}

BOOLEAN KDLinkedList::AddHeadObject(PVOID pObject)
{
  KLocker locker(&m_KSynchroObject);
  return Add(new KDLinkedListItem(pObject, NULL, NULL), (KDLinkedListItem*)NULL);
}

BOOLEAN KDLinkedList::AddTailObject(PVOID pObject)
{
  KLocker locker(&m_KSynchroObject);
  return Add(new KDLinkedListItem(pObject, NULL, NULL), m_pTail);
}

BOOLEAN KDLinkedList::AddObject(PVOID pObject, int nNumber)
{
  KLocker locker(&m_KSynchroObject);

  KDLinkedListItem* pItem = m_pHead;
  int               nCount = 0;
  BOOLEAN           bRes = FALSE;

  while(pItem != NULL)
  {
    if (nCount == nNumber)
    {
      bRes = Add(new KDLinkedListItem(pObject, NULL, NULL), pItem);//Add(pObject, pItem);
      break;
    }
    pItem = pItem->GetNext();
    ++nCount;
  }

  return bRes;
}

BOOLEAN KDLinkedList::AddObject(PVOID pObject, KDLinkedListItem* pItemPrev)
{
  KLocker locker(&m_KSynchroObject);
  return Add(new KDLinkedListItem(pObject, NULL, NULL), pItemPrev);
}

BOOLEAN KDLinkedList::Add(KDLinkedListItem* pItem, KDLinkedListItem* pItemPrev)
{
  KLocker locker(&m_KSynchroObject);

  KDLinkedListItem* pItemNext;

  if (pItem == NULL)
    return FALSE;

  pItem->SetPrev(pItemPrev);
  if (pItemPrev != NULL)
  {
    pItemNext = pItemPrev->GetNext();
    pItem->SetNext(pItemNext);
    pItemPrev->SetNext(pItem);
    if (pItemNext != NULL)
      pItemNext->SetPrev(pItem);
    else
      m_pTail = pItem;
  }
  else
  {
    if (m_pHead == NULL)
    {
      m_pHead = m_pTail = pItem;
      pItem->SetNext(NULL);
    }
    else
    {
      m_pHead->SetPrev(pItem);
      pItem->SetNext(m_pHead);
      m_pHead = pItem;
    }
  }

  return TRUE;
}

PVOID KDLinkedList::RemoveHead()
{
  KLocker locker(&m_KSynchroObject);

  return Remove(m_pHead);
}

PVOID KDLinkedList::RemoveTail()
{
  KLocker locker(&m_KSynchroObject);

  return Remove(m_pTail);
}

PVOID KDLinkedList::Remove(KDLinkedListItem* pItem)
{
  KLocker locker(&m_KSynchroObject);

  KDLinkedListItem*     pItemNext;
  KDLinkedListItem*     pItemPrev;
  PVOID                 pObject = NULL;

  if (pItem != NULL)
  {
    pItemNext = pItem->GetNext();
    pItemPrev = pItem->GetPrev();
    pObject = pItem->GetObject();

    if (pItemPrev != NULL)
    {
      pItemPrev->SetNext(pItemNext);
      if (pItemNext != NULL)
        pItemNext->SetPrev(pItemPrev);
      else
        m_pTail = pItemPrev;
    }
    else
    {
      if (pItemNext != NULL)
      {
        pItemNext->SetPrev(NULL);
        m_pHead = pItemNext;
      }
      else
      {
        m_pHead = m_pTail = NULL;
      }
    }

    delete pItem;
  }

  return pObject;
}

PVOID KDLinkedList::FindObject(int nNumber)
{
  KLocker locker(&m_KSynchroObject);

  KDLinkedListItem* pItem = m_pHead;
  int               nCount = 0;
  PVOID             pObject = NULL;

  while(pItem != NULL)
  {
    if (nCount == nNumber)
    {
      pObject = pItem->GetObject();
      break;
    }
    pItem = pItem->GetNext();
    ++nCount;
  }

  return pObject;
}

BOOLEAN KDLinkedList::IsEmpty()
{
  KLocker locker(&m_KSynchroObject);

  return ((m_pHead == NULL) && (m_pTail == NULL));
}

int KDLinkedList::Size()
{
  KLocker locker(&m_KSynchroObject);

  KDLinkedListItem* pItem = m_pHead;
  int               nCount = 0;

  while(pItem != NULL)
  {
    pItem = pItem->GetNext();
    ++nCount;
  }

  return nCount;
}

KDLinkedListItem* KDLinkedList::GetHead()
{
  KLocker locker(&m_KSynchroObject);
  return m_pHead;
}

KDLinkedListItem* KDLinkedList::GetTail()
{
  KLocker locker(&m_KSynchroObject);
  return m_pTail;
}

KDLinkedListItem* KDLinkedList::Find(PVOID pObject)
{
  KLocker locker(&m_KSynchroObject);

  return FindNext(m_pHead, pObject);
}

KDLinkedListItem* KDLinkedList::FindNext(KDLinkedListItem* pStartItem, PVOID pObject)
{
  KLocker locker(&m_KSynchroObject);

  KDLinkedListItem* pItem;

  pItem = pStartItem;
  while (pItem != NULL)
  {
    if (pItem->GetObject() == pObject)
      return pItem;
    pItem = pItem->GetNext();
  }

  return NULL;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -