로컬 및 전역 MS-DOS 디바이스 이름

Microsoft Windows 2000 이상 버전의 Windows NT 기반 운영 체제는 여러 버전의 DosDevices 디렉터리를 유지 관리합니다.

이러한 운영 체제에는 하나의 global\DosDevices 디렉터리와 여러 local\DosDevices 디렉터리가 있습니다. 전역 \DosDevices 디렉터리에는 시스템 전체에 표시되는 MS-DOS 디바이스 이름이 있습니다. 로컬 \DosDevices 디렉터리에는 특정 로컬DosDevices컨텍스트에서만 표시되는 MS-DOS 디바이스 이름이 있습니다.

로컬 DosDevices 컨텍스트는 다음과 같습니다.

  • Windows XP 이상에서는 각 로그온 세션에 고유한 로컬 DosDevices 컨텍스트가 있습니다. 시스템 스레드 및 LocalSystem 사용자로 실행되는 모든 스레드는 로컬 DosDevices 컨텍스트에서 실행되지 않습니다.

  • Windows 2000에서 각 터미널 서버 세션에는 고유한 로컬 DosDevices 컨텍스트가 있습니다. 콘솔 세션의 일부로 실행되는 스레드는 로컬 DosDevices 컨텍스트에서 실행되지 않습니다.

각 스레드에는 스레드의 수명 동안 변경되는 현재 DosDevices 컨텍스트가 있습니다. 로컬 DosDevices 컨텍스트에서 실행되지 않는 스레드는 전역DosDevices컨텍스트에서 실행한다고 합니다. 따라서 시스템 계정은 전역 DosDevices 컨텍스트에서 실행됩니다.

스레드가 현재 로컬 DosDevices 컨텍스트에서 실행 중인 경우 스레드가 만드는 MS-DOS 디바이스 이름은 로컬 DosDevices 디렉터리에만 만들어집니다. 따라서 로컬 DosDevices 컨텍스트에서 실행되는 스레드는 다른 로컬 DosDevices 컨텍스트 또는 전역 DosDevices 컨텍스트에서 실행되는 스레드에 표시되는 MS-DOS 디바이스 이름 에 영향을 줄 수 없습니다. 예를 들어 Windows XP 이상의 사용자가 네트워크 드라이브를 X:로 탑재하는 경우 다른 사용자 또는 시스템 전체의 X: 의미에는 영향을 주지 않습니다.

Windows XP 이상에서는 개체 관리자가 \DosDevices에서 이름을 조회할 때 먼저 로컬 \DosDevices 디렉터리를 검색한 다음 전역 \DosDevices 디렉터리를 검색합니다. 이름이 두 위치에 모두 있는 경우 로컬 이름은 전역 이름을 숨기게 됩니다.

Windows 2000에서 새 터미널 서버 세션이 시작될 때마다 시스템은 전역 \DosDevices 디렉터리를 복사하여 로컬 \DosDevices 디렉터리를 빌드합니다. 전역 디렉터리에 대한 후속 변경 내용은 로컬 디렉터리로 전파되지 않습니다.

전역 \DosDevices 디렉터리에서 MS-DOS 디바이스 이름을 만들어야 하는 드라이버는 DriverEntry와 같은 시스템 스레드 컨텍스트에서 실행되도록 보장되는 표준 드라이버 루틴에서 기호 링크를 만들어 만들 수 있습니다. 또는 전역 \DosDevices 디렉터리를 \DosDevices\Global로 사용할 수 있습니다. 드라이버는 \DosDevices\Global\DosDeviceName 의 이름을 사용하여 전역 디렉터리에 이름을 지정할 수 있습니다.

\DosDevices\Global은 Windows 98/Me와 같은 \DosDevices의 로컬 및 전역 버전을 지원하지 않는 플랫폼에 없습니다. 다음 코드 예제에서는 Windows 98/Me 및 Windows 2000 이상 운영 체제에서 작동하는 전역 기호 링크를 만듭니다.

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

드라이버는 IOCTL에 대한 응답으로 기호 링크를 만들어 로컬 \DosDevices 디렉터리에 MS-DOS 디바이스 이름을 만들 수 있습니다. 특정 로컬 DosDevices 컨텍스트의 스레드가 IOCTL을 보내면 드라이버의 DispatchDeviceControl 이 현재 스레드 컨텍스트 내에서 호출됩니다.

표준 드라이버 루틴이 실행되는 컨텍스트에 대한 자세한 내용은 디스패치 루틴 및 IRQL을 참조하세요.

시스템은 다음과 같이 로컬 \DosDevices 디렉터리를 구분합니다.

  • Windows XP 이상에서는 로컬 \DosDevices 디렉터리를 로그온 세션의 액세스 토큰에 대한 AuthenticationID 로 식별합니다. AuthenticationID에 대한 자세한 내용은 Microsoft Windows SDK 설명서의 TOKEN_STATISTICS 구조에 대한 설명을 참조하세요.

  • Windows 2000에서 로컬 \DosDevices 디렉터리 터미널 서버 세션에 대한 SessionId 로 식별됩니다. SessionId에 대한 자세한 내용은 Windows SDK 설명서의 WTS_SESSION_INFO 구조에 대한 설명을 참조하세요.

Windows NT 4.0 Terminal Server Edition은 Windows 2000과 동일한 방식으로 로컬 \DosDevices 디렉터리를 지원합니다.