INDAdapter::RegisterMemory Method
Registers an application-defined buffer used for Send, Receive, Read, and Write requests.
Syntax
HRESULT RegisterMemory(
[in] const VOID *pBuffer,
[in] SIZE_T BufferSize,
[in, out] OVERLAPPED *pOverlapped,
[out] ND_MR_HANDLE *phMr
);
Parameters
pBuffer [in]
The application-defined buffer to register.BufferSize [in]
The size, in bytes, of the application-defined buffer.pOverlapped [in, out]
A pointer to an OVERLAPPED structure that must remain valid for the duration of the operation.phMr [out]
Opaque handle to the registered memory. The handle is set when the operation completes successfully. If the method returns ND_PENDING, the phMr variable must remain valid until the operation completes.
Return Value
When you implement this method, you should return the following return values. If you return others, try to use well-known values to aid in debugging issues.
Return code | Description |
---|---|
ND_SUCCESS | The operation completed successfully. |
ND_PENDING | The Network Direct adapter is in process of registering the memory. Completion is reported asynchronously. |
ND_INSUFFICIENT_RESOURCES | There was not enough hardware resources to register the memory. |
ND_ACCESS_VIOLATION | The specified buffer or buffer size was not valid. |
ND_DEVICE_REMOVED | The underlying Network Direct adapter was removed from the system. Only cleanup operations on the Network Direct adapter will succeed. |
ND_INVALID_PARAMETER | The buffer exceeds the size supported by the adapter. For details, see the MaxRegistrationSize member of the ND_ADAPTER_INFO structure. |
Remarks
The MaxRegistrationSize member of the ND_ADAPTER_INFO structure contains the maximum application-defined buffer size. To get the adapter information, call the INDAdapter::Query method.
You can allocate and register your memory before connecting, or you can start the connection process and then register the memory before calling INDConnector::Accept or INDConnector::CompleteConnect.
The registered memory's scope is the adapter object. It can be used on any objects within the adapter, for example, multiple endpoints can both use the registered memory. The scope of a memory window is also adapter-wide but it can be bound only to a single endpoint at a time. A window bound to an endpoint cannot be accessed by a different endpoint. However, after being invalidated (unbound), the window could be bound to a different endpoint.
To let a remote peer use the buffer for Read and Write operations, call the INDAdapter::CreateMemoryWindow method to create a memory window. Then, call the INDEndpoint::Bind method to bind the window to the registered memory. The Bind method returns a window descriptor that you send to the remote peer. The remote peer uses the descriptor for Read and Write operations.
Network Direct providers should secure the memory by calling the MmSecureVirtualMemory routine in their kernel drivers as part of memory registration, and calling the MmUnsecureVirtualMemory routine as part of deregistration.
Requirements
Product |
Microsoft Message Passing Interface (MS-MPI) |
Header |
Ndspi.h |
See Also
Send comments about this topic to Microsoft
Build date: 7/2/2010