| #include<ntifs.h>
  VOID DriverUnload(PDRIVER_OBJECT pDriver) {
    UNREFERENCED_PARAMETER(pDriver);//对没引用的参数进行处理
    DbgPrint("Unload success!\n"); 
  }
  NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject, PUNICODE_STRING pRegPath) {//驱动对象指针,注册表路径 DriverEntry不能改
    //指明该参数未被使用,避免被编译器警告
    UNREFERENCED_PARAMETER(pRegPath);
    //注册卸载函数,作用是指定用哪个函数来完成卸载
    pDriverObject->DriverUnload = DriverUnload;
    //定义结构
      typedef struct _TestListEntry{
      int m_data;
      LIST_ENTRY m_ListEntry;
    }TestListEntry,*PTestListEntry;
    //声明一个头结点
      LIST_ENTRY ListHeader = { 0 };
  
    //初始化头结点 
      InitializeListHead(&ListHeader); 
    //声明带数据的结构
      TestListEntry EntryA = { 0 };
      TestListEntry EntryB = { 0 };
      TestListEntry EntryC = { 0 };
      TestListEntry EntryD = { 0 };
  
    //给数据成员赋值
      EntryA.m_data = 11;
      EntryB.m_data = 22; 
      EntryC.m_data = 33;
      EntryD.m_data = 44;
  
    //插入数据
      InsertHeadList(&ListHeader, &EntryA.m_ListEntry);//头插法
      InsertTailList(&ListHeader, &EntryB.m_ListEntry);//尾插法
      InsertTailList(&ListHeader, &EntryC.m_ListEntry);
      InsertHeadList(&ListHeader, &EntryD.m_ListEntry);
    //循环遍历链表
      PLIST_ENTRY pListEntry=NULL;
      //删除节点
      RemoveHeadList(&ListHeader);//删除第一个
      RemoveTailList(&ListHeader);//删除最后一个
      pListEntry = ListHeader.Flink;
      while (pListEntry!=&ListHeader)
      {
        PTestListEntry pTestEntry = CONTAINING_RECORD(pListEntry, TestListEntry, m_ListEntry);
        DbgPrint("%d", pTestEntry->m_data);
        pListEntry = pListEntry->Flink;
      }
    return STATUS_SUCCESS;//状态成功0,一定要有返回值
  }
 |