Registrazione di un'interfaccia di estensione
Dopo che un'applicazione Winock Kernel (WSK) ha creato correttamente un socket, può registrare tale socket per una o più interfacce di estensione supportate dal sottosistema WSK. Un'applicazione WSK determina quale set di interfacce di estensione sono supportate dal sottosistema WSK esaminando il membro Version della struttura WSK_PROVIDER_DISPATCH restituito al sottosistema WSK durante l'allegato.
Ogni interfaccia di estensione è definita da un'entità di rete indipendente dall'npI WSK. Si noti tuttavia che i criteri di rete per le interfacce di estensione non supportano caratteristiche specifiche di NPI.
Un'applicazione WSK registra per un'interfaccia di estensione eseguendo l'operazione IOCTL del socket SIO_WSK_REGISTER_EXTENSION nel socket. Per altre informazioni sull'esecuzione di operazioni IOCTL socket, vedere Esecuzione di operazioni di controllo su un socket.
Se un'applicazione WSK tenta di registrare un socket per un'interfaccia di estensione non supportata dal sottosistema WSK, l'operazione IOCTL del socket SIO_WSK_REGISTER_EXTENSION restituirà STATUS_NOT_SUPPORTED.
Si supponga, ad esempio, che un'interfaccia di estensione sia definita come nell'esempio di codice seguente.
const NPIID EXAMPLE_EXTIF_NPIID = {...};
typedef struct _EXAMPLE_EXTIF_PROVIDER_DISPATCH {
.
. // Function pointers for the functions that are
. // defined by the extension interface.
.
} EXAMPLE_EXTIF_PROVIDER_DISPATCH, *PEXAMPLE_EXTIF_PROVIDER_DISPATCH;
typedef struct _EXAMPLE_EXTIF_CLIENT_DISPATCH {
.
. // Function pointers for the callback functions
. // that are defined by the extension interface.
.
} EXAMPLE_EXTIF_CLIENT_DISPATCH, *PEXAMPLE_EXTIF_CLIENT_DISPATCH;
Di seguito viene illustrato come un'applicazione WSK può registrarsi per questa interfaccia di estensione per un socket orientato alla connessione.
// Client dispatch structure for the extension interface
const EXAMPLE_EXTIF_CLIENT_DISPATCH ExtIfClientDispatch = {
.
. // The WSK application's callback functions
. // for the extension interface
.
};
// Context structure type for the example extension interface
typedef struct _EXAMPLE_EXTIF_CLIENT_CONTEXT
{
const EXAMPLE_EXTIF_PROVIDER_DISPATCH *ExtIfProviderDispatch;
PVOID ExtIfProviderContext;
.
. // Other application-specific members
.
} EXAMPLE_EXTIF_CLIENT_CONTEXT, *PEXAMPLE_EXTIF_CLIENT_CONTEXT;
// Function to register the example extension interface
NTSTATUS
RegisterExampleExtIf(
PWSK_SOCKET Socket,
PEXAMPLE_EXTIF_CLIENT_CONTEXT ExtIfClientContext
)
{
PWSK_PROVIDER_CONNECTION_DISPATCH Dispatch;
WSK_EXTENSION_CONTROL_IN ExtensionControlIn;
WSK_EXTENSION_CONTROL_OUT ExtensionControlOut;
NTSTATUS Status;
// Get pointer to the socket's provider dispatch structure
Dispatch =
(PWSK_PROVIDER_CONNECTION_DISPATCH)(Socket->Dispatch);
// Fill in the WSK_EXTENSION_CONTROL_IN structure
ExtensionControlIn.NpiId = &EXAMPLE_EXTIF_NPIID;
ExtensionControlIn.ClientContext = ExtIfClientContext;
ExtensionControlIn.ClientDispatch = &ExtIfClientDispatch;
// Initiate the IOCTL operation on the socket
Status =
Dispatch->WskControlSocket(
Socket,
WskIoctl,
SIO_WSK_REGISTER_EXTENSION,
0,
sizeof(WSK_EXTENSION_CONTROL_IN),
&ExtensionControlIn,
sizeof(WSK_EXTENSION_CONTROL_OUT),
&ExtensionControlOut,
NULL,
NULL // No IRP used for this IOCTL operation
);
// Check result
if (Status == STATUS_SUCCESS)
{
// Save provider dispatch table and provider context
ExtIfClientContext->ExtIfProviderDispatch =
(const EXAMPLE_EXTIF_PROVIDER_DISPATCH *)
ExtensionControlOut.ProviderDispatch;
ExtIfClientContext->ExtIfProviderContext =
ExtensionControlOut.ProviderContext;
}
// Return the status of the call to WskControlSocket()
return Status;
}
Un'applicazione WSK registra le interfacce di estensione su base socket.