Structures de données de classe de service dans le SPI
Lorsqu’une nouvelle classe de service est installée, une structure WSASERVICECLASSINFO doit être préparée et fournie. Cette structure se compose également de sous-structures qui contiennent une série de paramètres qui s’appliquent à des espaces de noms spécifiques.
Pour chaque classe de service, il existe une seule structure WSASERVICECLASSINFO . Dans la structure WSASERVICECLASSINFO , l’identificateur unique de la classe de service est contenu dans lpServiceClassId et une chaîne d’affichage associée est référencée par lpServiceClassName.
Le membre lpClassInfos dans la structure WSASERVICECLASSINFO référence un tableau de structures WSANSCLASSINFO , chacune d’elles fournit un paramètre nommé et typé qui s’applique à un espace de noms spécifié. Exemples de valeurs pour le membre lpszName : SAPID, TCPPORT, UDPPORT, etc. Ces chaînes sont généralement spécifiques à l’espace de noms identifié dans dwNameSpace. Les valeurs typiques de dwValueType peuvent être REG_DWORD, REG_SZ, etc. Le membre dwValueSize indique la longueur de l’élément de données pointé par lpValue.
L’intégralité de la collection de données représentée dans une structure WSASERVICECLASSINFO est fournie à chaque fournisseur d’espaces de noms via NSPInstallServiceClass. Chaque fournisseur d’espaces de noms individuel passe ensuite au crible la liste des structures WSANSCLASSINFO et conserve les informations qui lui sont applicables. Cette architecture envisage également l’existence future d’un fournisseur d’espaces de noms spécial qui conserverait toutes les informations de schéma de classe de service pour tous les espaces de noms. Le Ws2_32.dll interrogerait ce fournisseur pour obtenir les données WSASERVICECLASSINFO nécessaires pour fournir aux fournisseurs d’espaces de noms lorsque NSPLookupServiceBegin est appelé pour lancer une requête et lorsque NSPSetService est appelé pour inscrire un service. Le fournisseur d’espaces de noms ne doit pas s’appuyer sur cette fonctionnalité pour le moment, et doit à la place disposer d’un moyen spécifique au fournisseur pour obtenir les informations de schéma de classe de service nécessaires. En l’absence d’un fournisseur qui stocke tous les schémas de classe de service pour tous les espaces de noms, le Ws2_32.dll utilisera NSPGetServiceClassInfo pour obtenir ces informations auprès de chaque fournisseur d’espaces de noms individuel.