NDK_FN_BUILD_LAM 콜백 함수(ndkpi.h)

NdkBuildLam(NDK_FN_BUILD_LAM) 함수는 가상 연속 메모리 영역에 대한 NDK 공급자로부터 어댑터 LAM(논리 주소 매핑)을 가져옵니다.

구문

NDK_FN_BUILD_LAM NdkFnBuildLam;

NTSTATUS NdkFnBuildLam(
  [in]           NDK_ADAPTER *pNdkAdapter,
  [in]           MDL *Mdl,
  [in]           SIZE_T Length,
  [in]           NDK_FN_REQUEST_COMPLETION RequestCompletion,
  [in, optional] PVOID RequestContext,
                 NDK_LOGICAL_ADDRESS_MAPPING *pNdkLAM,
                 ULONG *pLAMSize,
  [out]          ULONG *pFBO
)
{...}

매개 변수

[in] pNdkAdapter

NDK 어댑터 개체(NDK_ADAPTER)에 대한 포인터입니다.

[in] Mdl

MDL(메모리 설명자 목록) 또는 MDL 체인입니다. 시작 가상 주소에서 Length 매개 변수의 바이트 수까지 MDL 체인의 부분은 거의 연속된 메모리 영역을 나타내야 합니다.

[in] Length

첫 번째 MDL의 가상 주소부터 매핑할 바이트 수입니다. MDL 가상 주소는 MmGetMdlVirtualAddress 매크로를 사용하여 가져올 수 있습니다. 길이는 MDL 체인이 나타내는 총 바이트 수를 초과해서는 안됩니다.

[in] RequestCompletion

NdkRequestCompletion(NDK_FN_REQUEST_COMPLETION) 콜백 함수에 대한 포인터입니다.

[in, optional] RequestContext

RequestCompletion 매개 변수에 지정된 NdkRequestCompletion 콜백 함수로 다시 전달할 공급자의 컨텍스트 값입니다.

pNdkLAM

어댑터 페이지 배열을 포함하는 NDK_LOGICAL_ADDRESS_MAPPING 구조를 보유할 버퍼에 대한 포인터입니다. 어댑터 페이지 배열은 AdapterPageArray 멤버에 저장되고 AdapterPageCount 멤버에는 어댑터 페이지 요소 수가 포함됩니다.

pLAMSize

입력에 대한 pNdkLAM 매개 변수의 버퍼 크기(바이트)이거나 출력을 위해 작성된 실제 바이트 수입니다.

[out] pFBO

첫 번째 바이트 오프셋(FBO) 값이 이 위치에 반환됩니다. FBO는 첫 번째 어댑터 페이지 내의 시작 오프셋입니다.

반환 값

NdkBuildLam 함수는 다음 NTSTATUS 코드 중 하나를 반환합니다.

반환 코드 설명
STATUS_SUCCESS
작업이 성공적으로 완료되었습니다.
STATUS_PENDING
요청이 보류 중이며 LAM 빌드 작업이 완료되면 RequestCompletion 매개 변수(NDK_FN_REQUEST_COMPLETION)에 지정된 함수가 호출됩니다.
STATUS_INVALID_PARAMETER
시작 가상 주소에서 Length 매개 변수에 지정된 바이트 수까지의 MDL 체인 부분은 거의 연속된 메모리 영역을 나타내지 않습니다.
STATUS_INSUFFICIENT_RESOURCES
리소스 부족으로 인해 요청이 실패했습니다.
중요 요청은 이 상태 코드와 비동기적으로도 인라인으로 실패할 수 있습니다.
 
STATUS_BUFFER_TOO_SMALL
*pLAMSize 매개 변수로 표시된 버퍼 크기가 너무 작아서 LAM을 보유할 수 없습니다. 이 경우 *pLAMSize 값은 필요한 버퍼 크기로 업데이트됩니다.
기타 상태 코드
오류가 발생했습니다.

설명

시작 가상 주소에서 Length 매개 변수에 지정된 바이트 수까지 MDL 체인의 부분은 거의 연속된 메모리 영역을 나타내야 합니다. 그렇지 않으면 NDK 공급자가 요청에 실패해야 합니다. MDL 체인이 잠겨 있는지 확인하는 것은 NDK 소비자의 책임입니다. 즉, MDL 변경의 페이지는 실제 메모리에 고정됩니다.

중요NdkBuildLam 이 완료될 때까지 NDK 소비자는 MDL 체인을 사용하지 않아야 합니다.
 
어댑터는 논리적 주소를 사용하여 실제 메모리에 액세스합니다. 이는 가상 주소를 사용하여 실제 메모리에 액세스하는 CPU와 비슷합니다. NDK 소비자가 전송, 수신, 읽기 또는 쓰기 요청에서 실제 메모리 페이지를 로컬 데이터 버퍼로 직접 사용하는 경우 NDK 공급자로부터 NDK 어댑터 논리 주소 매핑을 가져와서 실제 주소가 아닌 논리 주소를 사용해야 합니다. 마찬가지로 NDK 소비자는 빠른 등록 요청에서도 논리적 주소를 사용해야 합니다.

NDK 소비자는 NdkGetPrivilegedMemoryRegionToken (NDK_FN_GET_PRIVILEGED_MEMORY_REGION_TOKEN) 함수를 호출하여 NDK 공급자로부터 권한 있는 메모리 영역 토큰을 가져올 수 있습니다.

NDK 공급자가 반환하는 모든 어댑터 페이지의 길이는 PAGE_SIZE 바이트여야 합니다. 여기서 PAGE_SIZE wdm.h에 정의된 호스트 플랫폼에서 지원하는 메모리 페이지 크기입니다.

공급자는 MDL에 대해 MmGetMdlVirtualAddress 매크로가 반환하는 가상 주소 값을 매핑되는 메모리 영역의 시작 부분에 대한 인덱스로 처리해야 합니다. 공급자는 버퍼 콘텐츠를 읽거나 쓰기 위한 유효한 가상 주소로 가상 주소 값을 사용하면 안 됩니다.

공급자가 NdkBuildLam 요청을 처리하는 동안 오류가 발생하는 경우 공급자는 실패로 요청을 완료하기 전에 지금까지 내부적으로 빌드한 부분 매핑을 해제해야 합니다.

요구 사항

요구 사항
지원되는 최소 클라이언트 지원되지 않음, NDIS 6.30 이상에서 지원됨
지원되는 최소 서버 Windows Server 2012
대상 플랫폼 Windows
헤더 ndkpi.h(Ndkpi.h 포함)
IRQL <=DISPATCH_LEVEL

추가 정보

MmGetMdlVirtualAddress

NDKPI 개체 수명 요구 사항

NDK_ADAPTER

NDK_ADAPTER_DISPATCH

NDK_FN_GET_PRIVILEGED_MEMORY_REGION_TOKEN

NDK_FN_RELEASE_LAM

NDK_FN_REQUEST_COMPLETION

NDK_LOGICAL_ADDRESS_MAPPING