ABOUT ME

Today
-
Yesterday
-
Total
-
  • Network Data Structure
    etc/Log 2021. 2. 16. 05:09

    네트워크 데이터는 네트워크를 통해 송수신되는 데이터 패킷으로 구성

     

    NDIS 6.0 이상의 기본 네트워크 구조

    네트워크 데이터 구조

    NET_BUFFER_LIST

    - NET_BUFFER 구조의 연결 목록을 지정함

    typedef struct _NET_BUFFER_LIST {
      union {
        struct {
          PNET_BUFFER_LIST Next;
          PNET_BUFFER      FirstNetBuffer;
        };
        SLIST_HEADER           Link;
        NET_BUFFER_LIST_HEADER NetBufferListHeader;
      };
      PNET_BUFFER_LIST_CONTEXT Context;
      PNET_BUFFER_LIST         ParentNetBufferList;
      NDIS_HANDLE              NdisPoolHandle;
      PVOID                    NdisReserved[2];
      PVOID                    ProtocolReserved[4];
      PVOID                    MiniportReserved[2];
      PVOID                    Scratch;
      NDIS_HANDLE              SourceHandle;
      ULONG                    NblFlags;
      LONG                     ChildRefCount;
      ULONG                    Flags;
      union {
        NDIS_STATUS Status;
        ULONG       NdisReserved2;
      };
      PVOID                    NetBufferListInfo[MaxNetBufferListInfo];
    } NET_BUFFER_LIST, *PNET_BUFFER_LIST;
    • Next : 체인의 다음 NET_BUFFER_LIST 구조, NET_BUFFER_LIST_NEXT_NBL 매크로를 통해 호출
    • FirstNetBuffer : NBL의 첫번째 NET_BUFFER, NET_BUFFER_LIST_FIRST_NB 매크로를 통해 호출
    • ParentNetBufferLIst : NBL의 Clone을 만들었을 경우, 원본 NBL을 ParentNBL로 지정
    • ChildRefCount : NBL의 Clone을 만들었을 경우, 원본 NBL의 ChildRefCount를 올림

     

    NET_BUFFER

    네트워크를 통해 전송되거나 수신되는 데이터를 지정함

    typedef struct _NET_BUFFER {
      union {
        struct {
          PNET_BUFFER Next;
          PMDL        CurrentMdl;
          ULONG       CurrentMdlOffset;
          union {
            ULONG  DataLength;
            SIZE_T stDataLength;
          };
          PMDL        MdlChain;
          ULONG       DataOffset;
        };
        SLIST_HEADER      Link;
        NET_BUFFER_HEADER NetBufferHeader;
      };
      USHORT                ChecksumBias;
      USHORT                Reserved;
      NDIS_HANDLE           NdisPoolHandle;
      PVOID                 NdisReserved[2];
      PVOID                 ProtocolReserved[6];
      PVOID                 MiniportReserved[4];
      NDIS_PHYSICAL_ADDRESS DataPhysicalAddress;
      union {
        PNET_BUFFER_SHARED_MEMORY SharedMemoryInfo;
        PSCATTER_GATHER_LIST      ScatterGatherList;
      };
    } NET_BUFFER, *PNET_BUFFER;
    • Next : NET_BUFFER 구조의 링크드 리스트에서 다음 NB를 가리키는 포인터
    • DataLength : MDL 체인에서 사용된 공간의 길이 (byte)
    • DataOffset : MDL 체인의 시작에서 MDL 체인의 네트워크 데이터 시작까지의 오프셋(byte), 사용되지 않은 데이터 공간의 크기

     


    • 전송 시에는 한 NBL이 여러 개의 NB를 갖게 되고, 수신 시에는 한 NBL은 한 개의 NB를 가짐. 
    • 한 NBL에 속한 NB들은 같은 TCP 스트림을 가지고 있음
    • 첫번째 NB의 헤더를 봄으로써 알고싶은 알고 싶은 통신 정보를 볼 수 있음 (IP 주소, 포트 등등...)

     

     

     

     

    NBL, NB 설명 출처 : msdn (docs.microsoft.com/en-us/windows-hardware/drivers/ddi/ndis/ns-ndis-_net_buffer_list, docs.microsoft.com/en-us/windows-hardware/drivers/ddi/ndis/ns-ndis-_net_buffer)

    'etc > Log' 카테고리의 다른 글

    마이크로소프트 오픈소스에 기여하다?  (0) 2023.02.10
    Filter driver에서 데이터 송신  (0) 2021.03.16
    NDIS filter driver  (0) 2021.03.16
    인턴일지 - NDIS filter driver  (0) 2021.02.16

    댓글

Designed by nanometre380.