Partager via


Noms locaux et globaux des appareils MS-DOS

Microsoft Windows 2000 et versions ultérieures du système d’exploitation Windows NT conservent plusieurs versions du répertoire DosDevices .

Sur ces systèmes d’exploitation, il existe un répertoire global \DosDevices et plusieurs répertoires \DosDevices locaux. Le répertoire global \DosDevices contient les noms d’appareils MS-DOS visibles à l’échelle du système. Un répertoire \DosDevices local contient les noms d’appareils MS-DOS qui sont visibles uniquement dans un contexte DosDevices local particulier.

Les contextes DosDevices locaux sont les suivants.

  • Sur Windows XP et versions ultérieures, chaque session d’ouverture de session a son propre contexte DosDevices local. Les threads système et tous les threads qui s’exécutent en tant qu’utilisateur LocalSystem ne s’exécutent pas dans un contexte DosDevices local.

  • Sur Windows 2000, chaque session de serveur terminal a son propre contexte DosDevices local. Tout thread qui s’exécute dans le cadre de la session de console ne s’exécute pas dans un contexte DosDevices local.

Chaque thread a un contexte DosDevices actuel, qui peut changer au cours de la durée de vie d’un thread. Un thread qui ne s’exécute pas dans un contexte DosDevices local est dit s’exécuter dans le contexte Global DosDevices. Ainsi, le compte système s’exécute dans le contexte Global DosDevices .

Si un thread s’exécute actuellement dans un contexte DosDevices local, tous les noms d’appareils MS-DOS qu’il crée sont créés uniquement dans le répertoire DosDevices local. Par conséquent, les threads qui s’exécutent dans un contexte DosDevices local ne peuvent pas affecter les noms d’appareils MS-DOS visibles par les threads qui s’exécutent dans un autre contexte DosDevices local ou dans le contexte DosDevices global. Par exemple, si un utilisateur sur Windows XP ou version ultérieure monte un lecteur réseau en tant que X :, cela n’affecte pas la signification de X : pour tout autre utilisateur ou pour le système dans son ensemble.

Sur Windows XP et versions ultérieures, lorsque le gestionnaire d’objets recherche un nom dans \DosDevices, il recherche d’abord le répertoire local \DosDevices, puis le répertoire global \DosDevices. Si le nom existe à la fois, le nom local ombre le nom global.

Sur Windows 2000, chaque fois qu’une nouvelle session de serveur terminal est lancée, le système génère le répertoire local \DosDevices en copiant le répertoire global \DosDevices . Les modifications ultérieures apportées au répertoire global ne sont pas propagées au répertoire local.

Un pilote qui doit créer ses noms d’appareils MS-DOS dans le répertoire global \DosDevices peut le faire en créant ses liens symboliques dans une routine de pilote standard qui est garantie de s’exécuter dans un contexte de thread système, tel que DriverEntry. Sinon, le répertoire global \DosDevices est disponible en tant que pilotes \DosDevices\Global ; peut utiliser un nom de \ DosDevices\Global\DosDeviceName pour spécifier un nom dans le répertoire global.

Notez que \DosDevices\Global n’existe pas sur les plateformes qui ne prennent pas en charge les versions locales et globales de \DosDevices, telles que Windows 98/Me. L’exemple de code suivant crée un lien symbolique global qui fonctionne sur Windows 98/Me, ainsi que sur les systèmes d’exploitation Windows 2000 et versions ultérieures :

UNICODE_STRING deviceName; // Already initialized.
UNICODE_STRING symbolicLinkName; // Initializing below.
NTSTATUS status;

if (IoIsWdmVersionAvailable(1, 0x10)) {
    // We're on Windows 2000 or later, so we use \DosDevices\Global.
 
    RtlInitUnicodeString(&symbolicLinkName, L"\\DosDevices\\Global\\SymbolicLinkName");

} else {
    // Windows 98/Me.  We just use DosDevices.
 
    RtlInitUnicodeString(&symbolicLinkName, L"\\DosDevices\\SymbolicLinkName");
}

status = IoCreateSymbolicLink(&symbolicLinkName, &deviceName);
if (!NT_SUCCESS(status)) {
  /* Symbolic link creation failed.  Handle error appropriately. */
}

Un pilote peut créer des noms d’appareils MS-DOS dans des répertoires \DosDevices locaux en créant le lien symbolique en réponse à une IOCTL. Lorsqu’un thread dans un contexte DosDevices local particulier envoie le IOCTL, dispatchDeviceControl du pilote est appelé à partir du contexte de thread actuel.

Pour plus d’informations sur le contexte dans lequel une routine de pilote standard s’exécute, consultez Routines dispatch et IRQLs.

Le système distingue les répertoires locaux \DosDevices comme suit :

  • Sur Windows XP et versions ultérieures, les répertoires \DosDevices locaux sont identifiés par l’ID d’authentification pour le jeton d’accès de la session d’ouverture de session. Pour plus d’informations sur AuthenticationID, consultez la description de la structure TOKEN_STATISTICS dans la documentation du Kit de développement logiciel (SDK) Microsoft Windows.

  • Sur Windows 2000, les répertoires \DosDevices locaux sont identifiés par l’ID de session du serveur terminal. Pour plus d’informations sur sessionId, consultez la description de la structure WTS_SESSION_INFO dans la documentation du Kit de développement logiciel (SDK) Windows.

Windows NT 4.0 Terminal Server Edition prend en charge les répertoires \DosDevices locaux de la même manière que Windows 2000.