Alocação de descritor
Embora os provedores de serviços do Windows Sockets sejam incentivados a implementar soquetes como objetos IFS (sistema de arquivos instalável), a arquitetura Winsock também acomoda provedores de serviço cujos identificadores de soquete não são objetos IFS. Provedores com identificadores IFS indicam isso por meio do bit de atributo XP1_IFS_HANDLES na estrutura WSAPROTOCOL_INFO . (Observação: o bit de atributo XP1_IFS_HANDLES não foi incluído na versão 2.0.8 da especificação de API, mas, desde então, foi adicionado por meio do mecanismo errata.) Os clientes winsock SPI podem aproveitar os provedores cujos descritores de soquete são identificadores IFS usando esses descritores com instalações padrão de E/S do Windows, como ReadFile e WriteFile.
Sempre que um provedor IFS cria um novo descritor de soquete, é obrigatório que o provedor chame WPUModifyIFSHandle antes de fornecer o novo identificador para um cliente SPI do Windows Sockets. Essa função usa um identificador de provedor e um identificador IFS proposto do provedor como entrada e retorna um identificador modificado (possivelmente). O provedor IFS deve fornecer apenas o identificador modificado para seu cliente, e todas as solicitações do cliente referenciarão apenas esse identificador modificado. O identificador modificado tem a garantia de ser indistinguível do identificador proposto no que diz respeito ao sistema operacional. Assim, na maioria das instâncias, o provedor de serviços simplesmente optará por usar apenas o identificador modificado em todo o processamento interno. A finalidade dessa função de modificação é permitir que o Ws2_32.dll simplifique bastante o processo de identificação do provedor de serviços associado a um determinado soquete.
Os provedores que não retornam identificadores IFS devem obter um identificador válido do Ws2_32.dll por meio da chamada WPUCreateSocketHandle . O provedor nãoIFS deve oferecer apenas um identificador fornecido por 2.DLL windows para seu cliente, e todas as solicitações do cliente referenciarão apenas esses identificadores. Como uma conveniência para os implementadores do provedor de serviços, um dos parâmetros de entrada fornecidos por um provedor no WPUCreateSocketHandle é um valor de contexto DWORD. O Ws2_32.dll associa esse valor de contexto ao identificador de soquete alocado e permite que um provedor de serviços recupere o valor de contexto a qualquer momento por meio da chamada WPUQuerySocketHandleContext . Um uso típico para esse valor de contexto seria armazenar um ponteiro para uma estrutura de dados mantida pelo provedor de serviços usada para armazenar informações de estado do soquete.