Dela via


Lokala och globala MS-DOS enhetsnamn

Microsoft Windows 2000 och senare versioner av det Windows NT-baserade operativsystemet har flera versioner av DosDevices-katalogen .

På dessa operativsystem finns det en global\DosDevices-katalog och flera lokala\DosEnhetskataloger . Katalogen global \DosDevices innehåller MS-DOS enhetsnamn som är synliga i hela systemet. En lokal \DosDevices-katalog innehåller MS-DOS enhetsnamn som endast visas i en viss lokalDosEnhetskontext.

De lokala DosDevices-kontexterna är följande.

  • I Windows XP och senare har varje inloggningssession en egen lokal DosDevices-kontext . Systemtrådar och alla trådar som körs som LocalSystem-användare ska inte köras i en lokal DosDevices-kontext .

  • I Windows 2000 har varje terminalserversession en egen lokal DosDevices-kontext . Alla trådar som körs som en del av konsolsessionen körs inte i en lokal DosDevices-kontext .

Varje tråd har en aktuell DosDevices-kontext , som kan ändras under en tråds livslängd. En tråd som inte körs i en lokal DosDevices-kontext sägs köras i den globalaDosDevices-kontexten. Därför körs systemkontot i den globala DosDevices-kontexten .

Om en tråd för närvarande körs i en lokal DosDevices-kontext skapas alla MS-DOS enhetsnamn som den skapar endast i den lokala DosDevices-katalogen . Därför kan trådar som körs i en lokal DosDevices-kontext inte påverka MS-DOS enhetsnamn som är synliga för trådar som körs i en annan lokal DosDevices-kontext eller i den globala DosDevices-kontexten . Om till exempel en användare på Windows XP eller senare monterar en nätverksenhet som X:, påverkar detta inte innebörden av X: för någon annan användare eller för systemet som helhet.

I Windows XP och senare, när objekthanteraren letar upp ett namn i \DosDevices, söker den först igenom den lokala katalogen \DosDevices och sedan katalogen global \DosDevices . Om namnet finns på båda platserna skuggar det lokala namnet det globala namnet.

I Windows 2000, när en ny terminalserversession initieras, skapar systemet den lokala katalogen \DosDevices genom att kopiera katalogen global \DosDevices . Efterföljande ändringar i den globala katalogen sprids inte till den lokala katalogen.

En drivrutin som måste skapa sina MS-DOS enhetsnamn i katalogen global \DosDevices kan göra det genom att skapa sina symboliska länkar i en standarddrivrutin som garanterat körs i en systemtrådskontext, till exempel DriverEntry. Alternativt är katalogen global \DosDevices tillgänglig som \DosDevices\Global; drivrutiner kan använda namnet \DosDevices\Global\DosDeviceName för att ange ett namn i den globala katalogen.

Observera att \DosDevices\Global inte finns på plattformar som inte stöder lokala och globala versioner av \DosDevices, till exempel Windows 98/Me. I följande kodexempel skapas en global symbolisk länk som fungerar på Windows 98/Me samt Windows 2000 och senare operativsystem:

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. */
}

En drivrutin kan skapa MS-DOS-enhetsnamn i en lokal \DosDevices-katalog genom att skapa en symbolisk länk som svar på en IOCTL. När en tråd i en viss lokal DosDevices-kontext skickar IOCTL anropas drivrutinens DispatchDeviceControl inifrån den aktuella trådkontexten.

Mer information om kontexten där en standarddrivrutin körs finns i Dispatch Routines and IRQLs (Dispatch Routines and IRQLs).

Systemet särskiljer lokala \DosEnhetskataloger på följande sätt:

  • I Windows XP och senare identifieras lokala \DosEnhetskataloger av AuthenticationID för inloggningssessionens åtkomsttoken. Mer information om AuthenticationID finns i beskrivningen av TOKEN_STATISTICS-strukturen i Microsoft Windows SDK-dokumentationen.

  • I Windows 2000 identifieras lokala \DosDevices-kataloger av SessionId för terminalserversessionen. Mer information om SessionId finns i beskrivningen av WTS_SESSION_INFO-strukturen i Windows SDK-dokumentationen.

Windows NT 4.0 Terminal Server Edition stöder lokala \DosEnhetskataloger på exakt samma sätt som Windows 2000.