保护和释放虚拟地址所有权

每当代理驱动程序的 SAN 服务提供程序缓存这些缓冲区时,代理驱动程序都必须保护用户模式缓冲区的虚拟地址的所有权。 有关缓存缓冲区的详细信息,请参阅 缓存已注册的内存。 代理驱动程序保护用户模式缓冲区的所有权,以便当应用程序将缓冲区释放回操作系统时,操作系统会通知 Windows 套接字开关。 若要确保缓冲区的所有权,代理驱动程序必须调用 MmSecureVirtualMemory 函数。 在此调用中,代理驱动程序传递指向缓冲区的起始地址和缓冲区的大小(以字节为单位)的指针。

如果已计划更改缓存缓冲区的虚拟到物理映射,则会通知交换机,并调用 SAN 服务提供商的 WSPMemoryRegistrationCacheCallback 函数从 SAN NIC 中删除缓冲区注册,并从 SAN 服务提供商的缓存中删除缓冲区注册。 而 SAN 服务提供商的代理驱动程序必须调用 MmUnsecureVirtualMemory 函数才能释放缓冲区的所有权。 在此调用中,代理驱动程序将句柄传递给先前从 MmSecureVirtualMemory 调用返回的缓冲区。

注意 尝试访问通过调用 MmSecureVirtualMemory 保护的用户模式缓冲区的驱动程序可能会关闭操作系统。 因此,当代理驱动程序访问此类用户模式缓冲区时,还必须围绕访问缓冲区的代码使用 try/except 机制。 有关 try/except 的详细信息,请参阅 Visual C++ 文档。

SAN 服务提供商可以将 I/O 控制 (IOCTL) 请求发送到代理驱动程序,以保护和释放缓冲区的所有权。 有关详细信息,请参阅 为 SAN 服务提供程序实现 IOCTL