다음을 통해 공유


NdisMAllocateNetBufferSGList 함수(ndis.h)

주의

ARM 및 ARM64 프로세서의 경우 NDIS 드라이버 작성기는 NDIS 분산형/수집 DMA 대신 WDF DMA 또는 WDM DMA를 사용하는 것이 좋습니다.

WDF DMA에 대한 자세한 내용은 KMDF 드라이버DMA 작업 처리를 참조하세요.

WDM DMA에 대한 자세한 내용은 드라이버 대한 입력/출력 관리를DMA 관련 자식 항목을 참조하세요.

버스 마스터 미니포트 드라이버는 NdisMAllocateNetBufferSGList 함수를 호출하여 NET_BUFFER 구조와 연결된 네트워크 데이터에 대한 분산/수집 목록을 가져옵니다.

통사론

NDIS_STATUS NdisMAllocateNetBufferSGList(
  [in]           NDIS_HANDLE NdisMiniportDmaHandle,
  [in]           PNET_BUFFER NetBuffer,
  [in]           PVOID       Context,
  [in]           ULONG       Flags,
  [in, optional] PVOID       ScatterGatherListBuffer,
  [in]           ULONG       ScatterGatherListBufferSize
);

매개 변수

[in] NdisMiniportDmaHandle

NDIS가 DMA 리소스를 관리하는 데 사용하는 컨텍스트 영역에 대한 핸들입니다. 호출자가 다음을 호출하여 이 핸들을 획득했습니다. NdisMRegisterScatterGatherDma 함수입니다.

[in] NetBuffer

NET_BUFFER 구조체에 대한 포인터입니다. NdisMAllocateNetBufferSGList 이 NET_BUFFER 구조와 연결된 네트워크 데이터에 대한 분산/수집 목록을 할당합니다. 분산/수집 목록은 연결된 NET_BUFFER_DATA 구조체의 CurrentMdl 멤버에 지정된 MDL의 시작 부분에서 시작되는 데이터에서 생성됩니다.

[in] Context

호출자가 만든 컨텍스트 영역에 대한 포인터입니다. HAL은 HAL이 분산/수집 목록을 만든 후 MiniportProcessSGList 이 포인터를 전달합니다. 호출자는 고유한 용도로 이 컨텍스트 영역을 사용할 수 있습니다.

[in] Flags

OR 작업과 결합할 수 있는 NDIS 플래그입니다. 모든 플래그를 지우려면 이 멤버를 0으로 설정합니다. 이 함수는 NDIS_SG_LIST_WRITE_TO_DEVICE 플래그를 지원합니다. 설정된 경우 DMA 전송 방향이 NET_BUFFER 디바이스로 이동되었음을 나타냅니다. NDIS_SG_LIST_WRITE_TO_DEVICE 명확한 경우 전송은 디바이스에서 전송됩니다. 미니포트 드라이버는 DMA 작업이 NET_BUFFER 디바이스로 데이터를 전송할 때 송신 경로에 이 플래그를 설정해야 합니다. 디바이스에서 미리 할당된 NET_BUFFER DMA 작업을 수행하는 미니포트 드라이버(예: 수신 작업 중 굴뚝 오프로드 가능 NIC)는 이 플래그를 지워야 합니다.

[in, optional] ScatterGatherListBuffer

NULL 않으면 ScatterGatherListBuffer 호출자가 분산/수집 목록을 보관하기 위해 할당하는 스토리지에 대한 포인터를 지정합니다. NULL 경우 NDIS는 분산/수집 목록에 대한 스토리지를 할당합니다.

[in] ScatterGatherListBufferSize

ScatterGatherListBuffer 매개 변수가 NULL 않으면 ScatterGatherListBufferSize 분산/수집 목록을 포함하는 버퍼의 크기를 지정합니다. 이 크기가 너무 작으면 NDIS는 분산/수집 목록에 대한 스토리지를 할당합니다. ScatterGatherListBuffer 매개 변수가 NULL 경우 이 매개 변수는 사용되지 않습니다.

반환 값

NdisMAllocateNetBufferSGList 다음 중 하나를 반환합니다.

반환 코드 묘사
NDIS_STATUS_SUCCESS
NdisMAllocateNetBufferSGList 지정된 NET_BUFFER 구조에 대한 분산/수집 목록을 성공적으로 빌드했습니다.
NDIS_STATUS_RESOURCES
NdisMAllocateNetBufferSGList 리소스 부족으로 인해 실패했습니다.

발언

NDIS 버스 마스터 미니포트 드라이버는 NdisMAllocateNetBufferSGList 호출합니다. MiniportSendNetBufferLists 함수입니다. 미니포트 드라이버는 분산/수집 목록을 가져와야 하는 각 NET_BUFFER 구조에 대해 NdisMAllocateNetBufferSGList 한 번 호출합니다.

미니포트 드라이버가 NdisMAllocateNetBufferSGList호출하면 NDIS는 HAL을 호출하여 분산/수집 목록을 작성합니다. HAL은 분산형/수집 목록을 빌드한 후 미니포트 드라이버가 호출하여 등록한 MiniportProcessSGList 함수를 호출합니다. NdisMRegisterScatterGatherDma.

HAL은 NdisMAllocateNetBufferSGListNDIS가 반환되기 전이나 후에 MiniportProcessSGList 호출할 수 있습니다. Miniport 드라이버는 HAL이 MiniportProcessSGList 호출할 때까지 분산/수집 목록에 액세스하려고 시도해서는 안 됩니다.

시스템 성능을 향상시키려면 미니포트 드라이버는 NdisMAllocateNetBufferSGListScatterGatherListBuffer 매개 변수에 사용할 버퍼를 미리 할당해야 합니다. NDIS는 미니포트 드라이버가 NdisMRegisterScatterGatherDma호출할 때 DmaDescription 매개 변수의 ScatterGatherListSize 멤버의 버퍼에 권장되는 크기를 제공합니다. 미니포트 드라이버는 NdisMAllocateNetBufferSGList호출할 때 ScatterGatherListBufferSize 매개 변수의 버퍼 크기를 지정합니다.

미니포트 드라이버가 ScatterGatherListBuffer 매개 변수에 버퍼를 지정하는 경우에도 NDIS는 버퍼를 할당할 수 있습니다. 지정된 버퍼가 너무 작아서 분산/수집 목록을 저장할 수 없는 경우에 발생할 수 있습니다. 따라서 드라이버 작성기는 ScatterGatherListBuffer 매개 변수에 지정된 버퍼에 분산/수집 목록이 포함되어 있다고 가정해서는 안 됩니다. HAL은 미니포트 드라이버의 MiniportProcessSGList 함수에 올바른 분산/수집 목록 포인터를 전달합니다.

시스템 성능을 향상시키기 위해 연결된 NET_BUFFER_DATA 구조의 CurrentMdl 멤버에 지정된 MDL의 시작 부분에서 시작하는 네트워크 데이터에서 분산/수집 목록이 생성됩니다. SG 목록에서 네트워크 데이터의 시작은 연결된 NET_BUFFER_DATA 구조체의 CurrentMdlOffset 멤버에 지정된 값으로 SG 목록의 시작 부분에서 오프셋됩니다.

미니포트 드라이버는 분산/수집 목록을 해제하려면 NdisMFreeNetBufferSGList 함수를 호출해야 합니다.

요구 사항

요구
지원되는 최소 클라이언트 NDIS 6.0 이상에서 지원됩니다.
대상 플랫폼 보편적
헤더 ndis.h(Ndis.h 포함)
라이브러리 Ndis.lib
IRQL DISPATCH_LEVEL
DDI 규정 준수 규칙 Irql_Gather_DMA_Function(ndis)

참고 항목

MiniportProcessSGList

MiniportSendNetBufferLists

NDIS 분산/수집 DMA

NET_BUFFER

NET_BUFFER_DATA

NdisMFreeNetBufferSGList

NdisMRegisterScatterGatherDma