2011-09-23 3 views
5

Windows에서 디스크에 원시 IO를 수행하는 프로그램이 있습니다.디스크를 온라인/오프라인으로 가져 오기

대상 디스크가 온라인 상태이면 모두 정상적으로 작동합니다. 그러나 일부 Windows OS의 기본 동작은 처음에 새 디스크를 오프라인으로 만드는 것입니다.

Windows에서이 작업을 수행하는 데 올바른 API를 찾는 데 어려움을 겪고 있습니다. 같은 명령 줄은 다음과 같습니다.

"select disk 2", "online disk" | diskpart 

그러나 코드에서이를 수행 할 수 있어야합니다. DeviceIoControl Win32 API를 통해 보았지만 (어느 것이 옳은지) 사용할 컨트롤 코드를 결정할 수 없습니다. 내가 찾을 수 없다는 사실은 내가 더 나은 API를 사용할 수 없다고 생각하게 만든다.

+0

왜 쉘이 C#에서 명령 줄을 실행하지 않는 것입니까? –

+1

여러 가지 이유가 있지만 옵션이 아니라고 말하는 것은 충분합니다. diskmgmt 및 diskpart가이를 수행 할 수있는 방법이 있습니다. 나는 그 방법이 무엇인지 알고 싶다. – Joe

+1

@joe - diskmgmt 및 diskpart는 Win32 API를 사용할 수있는 Windows에 내장 된 명령입니다. 그들이 잠시 주위에 있었을 것을 고려하면 그럴 것 같지 않습니다. 커맨드 라인을 통해 할 수있는 모든 것을 할 수 있습니다. –

답변

2

This question에는 DeviceIOControl 메서드를 포함하여 Windows API에 대한 몇 가지 유용한 링크가 있습니다.

모든 열거 형을 살펴본 후에 디스크를 온라인 상태로 만드는 것과 관련된 내용을 찾지 못했거나 서식 지정/파티션 이상으로 디스크를 흥미롭게 변경하지 못했습니다. 이는 핫 스왑 가능 하드 드라이브 만이 기능으로 지원되기 때문일 수 있습니다. 핫스왑이 가능한 하드 드라이브 시장은 매우 작으며 필요한 상황을 지원하는 드라이버가 대부분 있습니다. 마지막으로 나머지는 필요한 부분에 대해 diskpart 도구를 사용할 수 있어야합니다.

내가 생각하는 요구 사항을 다시 살펴 봐야합니다. 하드 디스크를 온라인으로 전환하는 데 필요한 권한이 있지만 명령 줄 프로그램에 액세스 할 수없는 프로세스를 실행하고 있습니까? 다음은 명령 줄 프로그램을 사용하지 않는 일반적인 이유에 대한 몇 가지 제안 사항 : - 그것을 허용하지 않습니다

  • 보안 팀에 온라인으로 제공이 문제에 대한 해결책의 톤을

    • 검은 화면이 팝업하지 수는 - 당신은 이미 당신이 신뢰하는 관리자로서 프로세스를 실행하고 있습니다. 왜 Windows 내장 함수를 신뢰하지 않을 것입니까?
    • 다른 프로세스를 호출하는 것을 막을 수있는 기술적 인 문제는 - 프로세스가 실행 중일 때 어떻게 관리되는지에 관심이 있습니다. 관리자
    • "항상 API 사용"과 같은 코딩 가이드 라인 - 필요성 부족으로 인한 코딩이 없음
  • +0

    실제로 핫 스왑 외부의 동적 디스크에는 여러 가지 용도가 있습니다. 링크를 가져 주셔서 감사합니다, 거기에 실제 해결책이 없다는 것을 알았지 만 나는 그것을 보았습니다. – Joe

    +0

    @ 조 : 나는 행동의 물리적 능력을 의미하지 않았다. – Guvante

    4

    차세대 버전의 경우, 답변은 (Windows 2k3/Vista 이상) 가상 디스크 서비스 (VDS)입니다. 특히 .NET 내에서 COM 객체를 많이 사용하지 않는 경우에는 모든 작업을 통합하는 작업이 필요합니다.

    온라인/오프라인 디스크는 IVdsDrive::SetStatus으로 완료됩니다. 적어도 그것은해야한다; 디스크에 읽기 전용 상태를 비활성화하는 것으로 문제를 해결할 수 있음을 발견했습니다. 적절한 플래그 값을 사용하여 IVdsDisk::SetFlags으로이 작업을 수행 할 수있었습니다.

    +0

    API는 하나의 큰 지옥이다. 어떻게 사용합니까? 설명서가 실제로 명확하지 않습니다. – Gizmo

    2

    C#에 대해서는 잘 모르겠지만 C++에서는 이것을 사용하고 있습니다. DeviceIoControl()IOCTL_DISK_SET_DISK_ATTRIBUTES으로 전화 해보세요. 파일 핸들에는 읽기 및 쓰기 액세스 권한이 있어야합니다. 적어도 Windows 7이 필요하다고 생각합니다. Windows 2003 x64에서는 작동하지 않습니다. Windows 8은 디스크를 성공적으로 오프라인 상태로 만든 다음 백업에서 다시 쓸 수 있습니다.

    BOOL disk_offline(HANDLE h_file, bool enable){ 
    DWORD bytes_returned = 0; 
    BOOL b_offline = 0; 
    if(get_size_volume_disk(h_file)){ 
        SET_DISK_ATTRIBUTES disk_attr; 
        ZeroMemory(&disk_attr, sizeof(disk_attr)); 
        disk_attr.Version = sizeof(SET_DISK_ATTRIBUTES); 
        disk_attr.Attributes = enable? DISK_ATTRIBUTE_OFFLINE: 0; 
        disk_attr.AttributesMask = DISK_ATTRIBUTE_OFFLINE; 
        b_offline = DeviceIoControl(h_file, IOCTL_DISK_SET_DISK_ATTRIBUTES, &disk_attr, disk_attr.Version, NULL, 0, &bytes_returned, NULL); 
        // Invalidates the cached partition table and re-enumerates the device. 
        if(!enable) BOOL b_update = DeviceIoControl(h_file, IOCTL_DISK_UPDATE_PROPERTIES, NULL, 0, NULL, 0, &bytes_returned, NULL); 
    } 
    return b_offline; 
    } 
    
    0

    DeviceIoControl을 IOCTL_DISK_IS_WRITABLE 및 제어 코드를 사용하면, 기록 가능한 디스크인지 확인하는 것이 가능하다. 디스크가 오프라인이면 false를 반환합니다.즉, 디스크가 오프라인 상태이고 Windows 2003 이상에서 제대로 작동하는지 확인할 수 있습니다. 그러나 Windows 2003에서 디스크를 온라인 상태로 만드는 유용한 IOCTL을 찾을 수 없었습니다. IOCTL_DISK_SET_DISK_ATTRIBUTES는 Windows 2008 이상에서만 작동합니다.

    관련 문제