NdisMAllocateNetBufferSGList 함수(ndis.h)

주의

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

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

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

버스 master 미니포트 드라이버는 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 버스 master 미니포트 드라이버는 해당 드라이버에서 NdisMAllocateNetBufferSGList를 호출합니다. MiniportSendNetBufferLists 함수입니다 . 미니포트 드라이버는 분산/수집 목록을 가져와야 하는 각 NET_BUFFER 구조에 대해 NdisMAllocateNetBufferSGList를 한 번 호출합니다.

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

HAL은 NdisMAllocateNetBufferSGList에서 NDIS가 반환되기 전이나 후에 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