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 는 다음 중 하나를 반환합니다.
반환 코드 | 설명 |
---|---|
|
NdisMAllocateNetBufferSGList 는 지정된 NET_BUFFER 구조체에 대한 분산/수집 목록을 성공적으로 빌드했습니다. |
|
리소스가 부족하여 NdisMAllocateNetBufferSGList가 실패했습니다. |
설명
NDIS 버스 master 미니포트 드라이버는 해당 드라이버에서 NdisMAllocateNetBufferSGList를 호출합니다. MiniportSendNetBufferLists 함수입니다 . 미니포트 드라이버는 분산/수집 목록을 가져와야 하는 각 NET_BUFFER 구조에 대해 NdisMAllocateNetBufferSGList를 한 번 호출합니다.
미니포트 드라이버가 NdisMAllocateNetBufferSGList를 호출하면 NDIS는 HAL을 호출하여 분산/수집 목록을 작성합니다. HAL이 분산/수집 목록을 빌드한 후 를 호출하여 미니포트 드라이버가 등록한 MiniportProcessSGList 함수를 호출합니다. NdisMRegisterScatterGatherDma.
HAL은 NdisMAllocateNetBufferSGList에서 NDIS가 반환되기 전이나 후에 MiniportProcessSGList를 호출할 수 있습니다. Miniport 드라이버는 HAL이 MiniportProcessSGList를 호출할 때까지 분산/수집 목록에 액세스하려고 시도해서는 안 됩니다.
시스템 성능을 향상시키려면 미니포트 드라이버는 NdisMAllocateNetBufferSGList의 ScatterGatherListBuffer 매개 변수에 사용할 버퍼를 미리 할당해야 합니다. 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) |