Programming - cpueblo.com

Windows Vista의 Win32 I/O 취소 지원


이 백서에서는 Windows Vista에서 제공되는 Win32 파일 I/O(입력/출력) 작업에 대한 새로운 취소 지원 기능에 대해 설명하고 네이티브(관리되지 않는) 응용 프로그램에서 이를 사용할 수 있도록 자세한 정보를 제공합니다.

글쓴이 : 유광희 날짜 : 2006-11-13 (월) 11:14 조회 : 6357
이 백서에서는 Windows Vista에서 제공되는 Win32 파일 I/O(입력/출력) 작업에 대한 새로운 취소 지원 기능에 대해 설명하고 네이티브(관리되지 않는) 응용 프로그램에서 이를 사용할 수 있도록 자세한 정보를 제공합니다.

출처 : MSDN

Windows Vista의 Win32 I/O 취소 지원

Microsoft Corporation

2005년 9월

Gerald Maffeo, Paul Sliwowicz
Microsoft Corporation

개요

이 백서는 Windows 응용 프로그램의 성능을 보다 강력하게 향상시키기 위한 새로운 취소 지원 기능에 관심이 있는 독립 소프트웨어 공급업체 및 기타 사용자를 위한 것입니다. 이 기능은 느리거나 차단된 파일 입력/출력을 직접 취소하거나 복구하여 사용자 환경을 향상시켜 줍니다.

Windows Vista는 향상된 커널 및 드라이버를 비롯해 새로운 Win32 응용 프로그래밍 인터페이스를 제공하여 네이티브 Win32 파일 관리 함수를 포괄적으로 취소할 수 있도록 해줍니다. 여기에는 동기 작업을 취소하기 위한 새로운 지원 기능도 포함됩니다.

이 백서는 개발자가 응용 프로그램에 파일 I/O를 취소할 수 있는 지원 기능을 구축할 수 있도록 세부적인 정보를 제공합니다.

목차

소개
배경 정보
Vista의 향상된 취소 기능
새로운 파일 I/O 취소 API 사용
비동기 I/O 취소
동기 I/O 취소
요약
관련 링크
부록 A: 새로운 I/O 취소 API
부록 B: 취소 가능한 파일 I/O API

소개

이 백서에서는 Windows Vista에서 제공되는 Win32 파일 I/O(입력/출력) 작업에 대한 새로운 취소 지원 기능에 대해 설명하고 네이티브(관리되지 않는) 응용 프로그램에서 이를 사용할 수 있도록 자세한 정보를 제공합니다.

이 백서에서 논의되는 내용은 네이티브 코드에만 적용할 수 있습니다. 현재 .Net Framework 라이브러리(WinFX)의 취소 기능은 하위 수준의 파일 I/O에 대한 취소를 지원할 수 없습니다.

배경 정보

응용 프로그램 종료 실패

Windows 응용 프로그램은 사용자가 제목 표시줄의 X 단추를 클릭하거나 다른 방법으로 종료하려고 해도 완전히 종료되지 않는 경우가 있습니다. 이러한 경우 응용 프로그램은 닫힌 것으로 보이지만 프로세스 목록을 살펴보면 해당 응용 프로그램의 프로세스가 계속 남아 있는 것을 확인할 수 있습니다. "좀비" 프로세스라고 하는 이러한 프로세스는 제대로 종료가 되지 않습니다. 이 상태에서는 해당 응용 프로그램을 다시 실행할 수 없거나 예기치 않은 동작이 발생할 수 있습니다. 대개 이 문제를 해결하려면 컴퓨터를 재부팅해야 합니다.

Microsoft는 이러한 문제에 대해 많은 보고서를 검토한 결과 문제의 원인이 잘못된 드라이버일 것이라고 추측했지만 근본적인 원인과 이를 해결할 방법을 확인하기 위해서는 확실한 데이터가 필요했습니다. 이러한 데이터를 확보하기 위해 Microsoft에서는 중지된 프로세스에 대해 보류 상태를 유지하는 드라이버 요청을 비롯한 커널 데이터를 수집하고 보고하는 특수한 실험용 Windows XP 버전을 개발했습니다. 이 실험용 버전은 Microsoft 내부 사용자 및 특별한 기술 베타 프로그램을 통해 선정한 사용자에게 배포되었습니다.

수집된 보고서를 통해 Microsoft는 의심했던 원인이 사실임을 확인할 수 있었을 뿐만 아니라, 종료 실패 오류와 응용 프로그램의 미응답 문제의 상당수가 Windows와 드라이버에 드라이버 생성 요청을 취소하는 기능이 부족했기 때문에 발생했다는 것을 알게 되었습니다. 이러한 오류를 해결하기 위해서는 Windows를 수정해야 했습니다.

응용 프로그램에 대한 취소 지원

파일 작업은 합법적으로 응용 프로그램의 스레드가 지속되지 않도록 차단할 수 있습니다. 제대로 디자인된 응답성이 뛰어난 응용 프로그램은 적어도 두 개의 스레드를 포함하는데, 이러한 스레드는 UI(사용자 인터페이스)를 지원하며 응용 프로그램의 응답성을 저해하는 API를 직접적으로든 간접적으로든 호출하지 않습니다. 차단 작업을 수행하기 위해서는 하나 이상의 "작업자" 스레드가 호출됩니다.

호출된 스레드는 응용 프로그램이 진행률 표시기와 취소 또는 중지 단추를 통해 취소 기능을 지원할 수 있도록 합니다. 대부분의 경우 작업을 중단할 때 사용자는 작업자 스레드를 무시(방치)해도 됩니다. 예를 들어 DNS(도메인 이름 서비스) 확인자 호출 또는 기타 네트워크 호출은 정해진 제한 시간이 있으며, 이를 초과하면 이후 작업자 스레드도 삭제됩니다.

하지만 실질적인 I/O 취소 기능을 지원해야 하는 경우도 있습니다. 예를 들어 매우 느린 장치에 대한 OpenFile 호출을 중지한 다음 다른 매개 변수를 사용하여 신속하게 호출을 다시 시도해야 할 수 있습니다. 이때 사용자가 "무한정" 기다리지 않기 위해 선택할 수 있는 유일한 방법은 해당 응용 프로그램을 종료하는 것이지만 위에서 말한 것처럼 종료 자체가 실패할 수 있습니다. 따라서 사용자에게 요청을 취소하는 기능을 제공하는 것이 가장 확실하고 바람직한 방법입니다. 이를 위해서는 Windows와 해당 드라이버에서 동기 취소에 대한 지원을 비롯한 취소 기능을 완전하게 지원해야 합니다.

Vista의 향상된 취소 기능

커널, I/O 관리자 추가 기능

Vista에서는 드라이버 생성 요청(IRP_MJ_CREATE)을 취소하는 기능이 지원됩니다. 드라이버 생성 요청에 해당하는 Win32 API에는 CreateFileOpenFile이 있습니다.

이 기능은 이러한 요청이 기본 드라이버에서 수행된다고 보장하지 않습니다. 생성 요청을 완료하는 데 오랜 시간이 걸릴 수 있는 드라이버는 취소 지원 기능을 구현해야 합니다. Microsoft는 완료 및 취소 동작 테스트를 지원하기 위해 드라이버 I/O 완료/취소에 대한 지침 및 Vista의 드라이버 검증 도구 v2에 대한 새로운 옵션을 개발했습니다(관련 링크의 Driver Hang Verifier(영문) 참조).

Microsoft MUP(Multi-UNC Provider) 및 Redirector처럼 Microsoft에서 제공하는 드라이버는 필요에 따라 요청 생성 취소 기능을 지원합니다.

새로운 파일 I/O 취소 API

Windows XP 및 Windows Server 2003 파일 I/O API에는 CancelIo 함수를 사용한 제한적인 I/O 취소 지원 기능이 제공됩니다. 이 기능은 지정한 파일 핸들을 호출한 스레드가 발급한 보류 중인 비동기 I/O를 취소합니다. 하지만 CancelIo는 매우 제한적이며 다음과 같은 작업에 대해서는 취소를 지원하지 않습니다.

  • 다른 스레드에 의해 파일 핸들에 발급된 I/O 작업
  • 특정 I/O 작업
  • 동기 I/O 작업(이러한 작업은 운영 체제에서 기본적으로 차단됨)
  • 완료 포트에 발급되었거나 IOSB 범위와 연결된 I/O

따라서 Longhorn에서는 새로운 Win32 취소 API가 구현되었습니다. CancelIo와는 달리 새로운 CancelIoExCancelSynchronousIo API는 보류 중인 I/O 요청에 대해 취소하도록 표시하고 즉시 반환됩니다. 여기에서 중요한 점은 다음과 같습니다.

  • I/O 요청은 취소 요청에도 불구하고 정상적으로 완료될 수 있으므로 취소와 완료 사이에는 본질적인 경합 조건이 있습니다.
  • 작업이 성공적으로 완료되었는지 또는 취소되었는지 확인해야 합니다(취소 API를 사용하여 요청을 취소하는 경우 해당 요청은 결국 완료됨).
  • 완료 상태 코드는 작업이 성공적으로 완료되었는지, 취소되었는지(ERROR_OPERATION_ABORTED) 또는 다른 오류로 인해 실패했는지를 나타냅니다.

이러한 새로운 API의 프로토타입을 확인하려면 관련 링크를 참조하십시오. 자세한 정보는 부록 A: 새로운 I/O 취소 API를 참조하십시오.

취소 가능한 파일 I/O API

대부분의 파일 I/O API는 취소가 가능합니다.

CopyFile과 같은 몇 가지 복잡한 Win32 API는 취소할 수 없습니다. 이러한 API의 경우에는 CopyFileEx와 같이 취소할 수 있는 형태로 제공되는 API를 사용해야 합니다. 이러한 API는 취소 기능을 지원할 뿐만 아니라 호출의 진행 상태를 추적할 수 있는 콜백을 기본 제공합니다.

취소 가능한 파일 I/O API 목록을 보려면 부록 B를 참조하십시오.

새로운 파일 I/O 취소 API 사용

비동기 I/O 취소

I/O를 발급한 프로세스의 모든 스레드에서 비동기 I/O를 취소할 수 있습니다. 이를 위해서는 I/O가 수행되고 있는 핸들만 제공하면 되며, 필요한 경우 I/O 수행에 사용된 Overlapped 구조체를 제공하면 됩니다. 다음 샘플에서는 제한 시간을 사용하면서 읽기를 시도하여 제한 시간이 초과될 경우 CancelIoEx로 I/O를 취소하는 루틴을 보여 줍니다. CancelIoEx를 호출한다고 읽기 취소가 보장되는 것은 아닙니다. 이를 처리 중인 드라이버에서 이 기능을 지원해야 하며 해당 작업이 취소 가능한 상태여야 합니다.

비동기 I/O의 경우 Overlapped 구조체를 검색할 때 또는 완료 콜백에서 상태를 검사하여 취소가 실제로 실행되었는지 여부를 확인할 수 있습니다. 상태가 ERROR_OPERATION_ABORTED이면 작업이 취소된 것입니다.

BOOL
DoCancelableRead(
    HANDLE hFile,
    LPVOID lpBuffer,
    DWORD nNumberOfBytesToRead,
    LPDWORD lpNumberOfBytesRead,
    LPOVERLAPPED lpOverlapped,
    DWORD dwTimeout,
    LPBOOL bCancelCalled
)
{
    BOOL result;
    DWORD waitResult;

    *bCancelCalled = FALSE;
    
    result = ReadFile( hFile,
                       lpBuffer,
                       nNumberOfBytesToRead,
                       lpNumberOfBytesRead,
                       lpOverlapped );

    
if (!result) {
        if (GetLastError() != ERROR_IO_PENDING) {
            return result; 
        }
    } else {
        return result;
    }

    //
    // I/O가 보류되었으므로 제한 시간이 초과되는지 기다리고 확인합니다.
    // 이 루틴을 호출하기 전에 겹친 이벤트가 설정되어 있어야
    // 합니다.
    //
    waitResult = WaitForSingleObject( lpOverlapped->hEvent,
                                      dwTimeout );

    if (waitResult == WAIT_TIMEOUT) {
        result = CancelIoEx( hFile,
                             lpOverlapped );

        *bCancelCalled = TRUE;

        //
        // I/O가 완료될 때까지 기다립니다. 실제로 취소될 수도 있고
        // 취소되지 않을 수도 있습니다.
        //
     waitResult = WaitForSingleObject( lpOverlapped->hEvent,
                                          0 );
    }

    return result;
}

동기 I/O 취소

I/O를 발급한 프로세스의 모든 스레드에서 동기 I/O를 취소할 수 있습니다. 동기 I/O를 취소하려면 현재 I/O를 수행 중인 스레드에 핸들을 제공합니다.

다음 샘플에서는 두 가지 루틴을 보여 줍니다.

  • SynchronousIoWorker는 CreateFile에 대한 호출로 시작하여 몇 가지 동기 파일 I/O를 구현하는 작업자 스레드입니다. 성공하면 추가 작업(표시되지 않음)이 수행됩니다. 전역 변수인 gCompletionStatus를 사용하면 모든 작업이 성공했는지 또는 어느 한 작업이 실패하거나 취소되었는지 확인할 수 있습니다. dwOperationInProgress 전역 변수는 파일 I/O가 계속 진행 중인지 여부를 나타냅니다. 이 예제에서는 UI 스레드에서 작업자 스레드의 존재 여부를 확인할 수도 있습니다. 파일 I/O 호출 사이의 짧은 시간 동안 취소가 요청된 경우 나머지 작업들이 반드시 취소되도록 하려면 SynchronousIoWorker에 몇 가지 수동 검사(이 예제에는 표시되지 않음)를 추가해야 합니다.
  • MainUIThreadMessageHandler는 UI 스레드의 창 프로시저 내에서 메시지 처리기를 시뮬레이션합니다. 사용자는 사용자 정의 창 메시지 WM_MYSYNCOPS를 생성하는 컨트롤을 클릭하여 일련의 동기 파일 작업을 요청합니다. 이에 대한 코드를 통해 SynchronousIoWorker를 시작하는 CreateFileThread 루틴이 있는 새로운 스레드가 생성됩니다. 작업자 스레드가 요청된 I/O를 수행하는 동안 UI 스레드는 메시지를 계속해서 처리합니다. 사용자가 완료되지 않은 작업을 취소하는 경우(일반적으로 취소 단추를 누름) WM_MYCANCEL 코드는 CreateFileThread에 의해 반환된 스레드 핸들을 사용하여 CancelSynchronousIo를 호출합니다. CancelSynchronousIo는 취소를 시도한 후 즉시 반환됩니다. 이때 해당 생성 작업이 반드시 취소된다고 보장할 수는 없습니다. 마지막으로, 파일 작업이 완료되었는지 여부에 따라 나중에 사용자 또는 응용 프로그램에서 다른 작업을 요청할 수 있습니다. 이 경우 WM_PROCESSDATA의 샘플 코드는 먼저 작업이 완료되었는지 확인한 다음 정리 코드를 실행합니다. 이 예제에서는 작업 단계 중 어디에서나 취소가 발생할 수 있기 때문에 호출자는 상태의 일관성을 확인하거나, 최소한 계속 진행하기 전에 상태를 파악하고 있어야 합니다.
DWORD gCompletionStatus;      // 마지막 작업의 완료 상태
DWORD dwOperationInProgress;   // 작업이 진행 중인 경우 TRUE

VOID
SynchronousIoWorker( VOID * pv )
{
    LPCSTR lpFileName = (LPCSTR) *pv;
    HANDLE hEvent = lpCreateParams->hEvent;
    HANDLE hFile;

    dwOperationInProgress = TRUE;   
    gCompletionStatus = ERROR_SUCCESS;
    hFile = CreateFileA( lpFileName,
                         GENERIC_READ,
                         0,
                         NULL,
                         OPEN_EXISTING,
                         0,
                         NULL );


    if (hFile != INVALID_HANDLE_VALUE) {
   
        
        
        if (result == FALSE) {
            // 일부 작업이 실패했거나 취소되었습니다. 취소된 경우
            // GetLastError()가 ERROR_OPERATION_ABORTED를 반환합니다.

            gCompletionStatus = GetLastError();            
        }
             
        CloseHandle(hFile);

    } else {
        // CreateFile이 실패했거나 취소되었습니다. 취소된 경우
        // GetLastError()가 ERROR_OPERATION_ABORTED를 반환합니다.
        gCompletionStatus = GetLastError();
    }

    dwOperationInProgress = FALSE;
}



LRESULT
CALLBACK
MainUIThreadMessageHandler(
    HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam
)
{
    HANDLE syncThread;

    

    switch (uMsg) {

    case WM_MYSYNCOPS:   // 사용자가 파일에 대해 작업을 요청함
        

        syncThread = CreateThread( NULL,
                                0,
                                (LPTHREAD_START_ROUTINE)SynchronousIoWorker,
                                &lpFileName,
                                0,
                                NULL );

        if (syncThread == INVALID_HANDLE_VALUE) {
            
        }
        break;
    
    // 사용자가 취소 단추를 클릭했음
    case WM_MYCANCEL:
        if (syncThread != INVALID_HANDLE_VALUE) {
            CancelSynchronousIo(syncThread);
        }
        Break;

    case WM_PROCESSDATA:
        if (!dwOperationInProgress) {
            if (gCompletionStatus == ERROR_OPERATION_ABORTED) {
                
            } else if (...) {
                
            }
        }
        break;
    
    case ...:
        
    }

    return TRUE;
}

취소 문제

잘못된 드라이버

불행하게도 기본 드라이버에서 취소 기능을 올바르게 지원한다는 보장은 없습니다. 취소가 올바르게 요청되더라도 드라이버가 요청된 작업을 차단하여 완료하지 못하게 할 수 있습니다. 더욱 나쁜 점은 올바르게 작동하는 취소 기능을 갖춘 응용 프로그램이 바이러스 백신이나 방화벽 필터 드라이버의 설치 및 업데이트와 같은 시스템 재구성 이후에 취소 요청에 갑자기 응답하지 않을 수 있다는 점입니다.

잠재적인 경합 조건

개발자는 다른 스레드의 I/O 작업을 취소할 때 동기화 문제를 고려해야 합니다.

Overlapped 구조체가 제공되지 않는 비동기 작업의 경우 CancelIoEx를 호출하면 진행 중인 모든 스레드에서 파일에 대한 모든 미해결 I/O를 취소하려고 시도합니다. 각각의 스레드가 개별적으로 처리되기 때문에 한 스레드가 처리된 후 다른 모든 스레드에서 파일에 대한 I/O를 취소하기 전에 해당 파일에 대해 다른 I/O가 시작될 수 있습니다.

또한 개발자는 대상 취소 작업과 Overlapped 구조체의 재사용을 결합할 때 주의해야 합니다. CancelIoEx를 호출한 후에 바로 구조체를 재사용하는 것은 안전하지 않습니다. I/O 작업이 성공적으로 또는 취소된 상태로 완료되면 시스템에서 Overlapped 구조체가 더 이상 사용되지 않으므로 이를 재사용할 수 있습니다.

동기 I/O의 경우, CancelSynchronousIo를 호출하면 스레드의 모든 현재 동기 호출을 취소하려고 시도합니다. 동기화할 때 조심하지 않으면 일련의 호출 중에서 잘못된 호출이 취소될 수 있습니다. 이러한 문제는 예측할 수 없는데다 드물게 발생하기 때문에 진단하기가 매우 어렵습니다. 가능한 시나리오는 CancelSynchronousIo가 호출되는 경우입니다. 이 함수는 특정 동기 작업을 위한 것일지라도 해당 작업이 정상적으로 또는 오류가 발생한 상태로 완료된 직후에만 시작됩니다. 첫 번째 작업을 호출한 스레드가 다른 동기 호출을 시작할 경우 취소 호출로 인해 이 새로운 I/O가 중단될 수 있습니다. 이 문제는 심각한 결과를 초래할 수 있습니다.

응용 프로그램의 여러 부분 간에 스레드가 공유될 경우(예: 스레드 풀 스레드) 동기 I/O에 대한 다른 유사한 경합 조건이 존재할 수 있습니다.

예를 들어 sub-app 1이 스레드 2에서 CreateFile을 호출하고 스레드 1에서 취소를 발급한다고 가정해 보십시오. Sub-app 2 역시 스레드 2를 공유하고 이를 사용하여 Flush를 호출한 다음 이를 다른 스레드에서 취소한다고 가정해 보십시오. 이러한 상황을 조정하지 않고 그대로 두면 취소 요청으로 인해 잘못된 작업이 취소될 수 있습니다.

요약

Windows Vista 커널 및 여러 드라이버에서는 취소 지원 기능이 향상되었으며, 동기 파일 요청을 취소할 수 있게 해주는 새로운 Win32 응용 프로그래밍 인터페이스가 제공됩니다. 이러한 기능은 응용 프로그램 종료에 대한 안정성을 향상시켜 Vista 고객 만족도를 높이기 위한 것으로서, 느리거나 차단된 파일 I/O를 직접 취소하거나 이를 복구할 수 있도록 지원하여 사용자 환경을 더욱 개선시켜 줍니다.

특히 이 백서의 참조 및 부록에서는 개발자가 응용 프로그램에 파일 I/O 취소 지원 기능을 구축할 수 있도록 자세한 정보를 제공합니다.

관련 링크

자세한 내용은 다음 리소스를 참조하십시오.

부록 A: 새로운 I/O 취소 API

이 섹션에서는 관련 링크에 포함된 내용 이외에 Vista의 새로운 취소 API에 대한 추가 정보를 제공합니다. 참고: 이 정보는 임시 정보이며 변경될 수 있습니다.

CancelIoEx

참고 이 문서는 임시 문서이며 변경될 수 있습니다.

CancelIoEx 함수는 I/O 작업을 발급한 스레드에 관계없이 현재 프로세스에 있는 지정된 파일 핸들에 대한 모든 보류 중인 I/O 작업을 취소하도록 표시합니다.

BOOL CancelIoEx(
  HANDLE hFile,
  LPOVERLAPPED lpOverlapped
);

매개 변수

hFile
[in] 해당 작업을 취소하려는 파일에 대한 핸들입니다.
lpOverlapped
[in] 비동기(Overlapped) I/O에 사용되는 데이터를 제공하는 OVERLAPPED (영문)데이터 구조체에 대한 포인터입니다.

lpOverlapped가 NULL이 아니면 제공된 Overlapped 구조체로 발급된 요청만 취소하도록 표시되며, 그렇지 않으면 해당 파일 핸들에 대한 모든 I/O 요청이 취소됩니다.

반환 값

작업이 성공하면 0이 아닌 값이 반환됩니다.

함수가 실패하면 0이 반환됩니다. 자세한 오류 정보를 보려면 GetLastError (영문)를 호출합니다.

주의

CancelIoExCancelIo와 다릅니다. CancelIoCancelIo를 호출하는 동일 스레드에서 발급된 요청만 취소하도록 표시합니다.

지정된 파일 핸들에 대해 진행 중인 보류된 I/O 작업이 있는 경우 CancelIoEx 함수는 이를 취소하도록 표시합니다. 대부분의 작업 유형은 즉시 취소할 수 있지만 일부 작업은 실제로 취소되어 이를 호출자에게 알리기 전에 계속 진행되어 완료되는 경우가 있습니다. CancelIoEx는 취소된 작업이 모두 완료될 때까지 기다리지 않습니다.

취소 중인 작업은 결국 완료됩니다. 작업이 정상적으로 완료되었는지(취소 요청에도 불구하고 발생할 수 있음) 여부, 작업이 취소되었는지 여부(완료 상태가 ERROR_OPERATION_ABORTED) 또는 다른 오류로 작업이 실패했는지 여부를 확인하려면 완료 상태를 확인해야 합니다.

요구 사항

클라이언트 Windows Vista 필요
서버 Windows Server Vista 필요
헤더 Winbase.h에 선언됨
라이브러리 Kernel32.lib에 대한 연결
DLL Kernel32.dll 필요

CancelSynchronousIo

참고 이 문서는 임시 문서이며 변경될 수 있습니다.

CancelSynchronousIo 함수는 지정된 스레드에 의해 발급된 보류 중인 동기 I/O 작업을 취소하도록 표시합니다.

BOOL CancelSynchronousIo(
  HANDLE hThread
);

매개 변수

hThread
[in] 동기 I/O에서 차단된 스레드에 대한 핸들입니다.

반환 값

작업이 성공하면 0이 아닌 값이 반환됩니다.

함수가 실패하면 0이 반환됩니다. 자세한 오류 정보를 보려면 GetLastError (영문)를 호출합니다.

주의

지정한 스레드에서 발급된 보류 중인 동기 I/O 작업은 취소되도록 표시됩니다. 대부분의 작업 유형은 즉시 취소할 수 있지만 일부 작업은 실제로 취소되고 이를 호출자에게 알리기 전에 계속 진행되어 완료되는 경우가 있습니다. CancelSynchronousIoEx는 취소된 작업이 모두 완료될 때까지 기다리지 않습니다.

취소 중인 작업은 결국 완료됩니다. 작업이 정상적으로 완료되었는지(취소 요청에도 불구하고 발생할 수 있음) 여부, 작업이 취소되었는지 여부(완료 상태: ERROR_OPERATION_ABORTED) 또는 다른 오류로 작업이 실패했는지 여부를 확인하려면 완료 상태를 확인해야 합니다. 이 서비스는 사용자가 아직 파일에 대한 핸들을 갖고 있지 않기 때문에 발급된 생성 요청을 취소해야 하는 경우에 가장 유용합니다.

요구 사항

클라이언트 Windows Vista 필요
서버 Windows Server Vista 필요
헤더 Winbase.h에 선언됨
라이브러리 Kernel32.lib에 대한 연결
DLL Kernel32.dll 필요

부록 B: 취소 가능한 파일 I/O API

API 이름 취소 가능 여부 취소 메커니즘
WalkTree 부분적으로 가능 WalkTree 자체는 취소를 지원하지 않지만 열거 콜백을 사용하여 "walking"을 수행합니다. 이 콜백을 사용하면 취소를 지원하고 취소된 경우 열거를 중지할 수 있습니다.
DeleteTree 불가능 취소를 지원하지 않는 WalkTree에 대한 콜백입니다.
AreFileApisANSI 해당 없음
CheckNameLegalDOS8Dot3 해당 없음
CloseHandle 해당 없음
CopyFile 불가능 CopyFileEx를 사용하십시오.
CopyFileEx 가능 진행 루틴으로 PROGRESS_CANCEL을 반환하여 취소할 수도 있고 또는 pbCancel 변수를 전달하여 TRUE로 설정함으로써 취소할 수도 있습니다.
CreateFile 가능
CreateHardLink 가능
DeleteFile 가능
FindClose 가능
FindFirstFile 가능
FindFirstFileEx 가능
FindFirstStreamW 가능
FindNextFile 가능
FindNextStreamW 가능
GetBinaryType 가능
GetCompressedFileSize 가능
GetFileAttributes 가능
GetFileAttributesEx 가능
GetFileInformationByHandle 가능
GetFileSize 가능
GetFileSizeEx 가능
GetFileTime 가능
GetFileType 가능
GetFullPathName 가능
GetLongPathName 가능
GetShortPathName 가능
GetTempFileName 가능
GetTempPath 가능
MoveFile 불가능 MoveFileWithProgress를 사용하십시오.
MoveFileEx 불가능 MoveFileWithProgress를 사용하십시오.
MoveFileWithProgress 가능 진행 루틴은 PROGRESS_STOP 또는 PROGRESS_CANCEL을 반환하여 작업을 중지할 수 있지만 CopyFile과 같은 Boolean 취소는 지원하지 않습니다.
ReplaceFile 불가능 취소할 수 없는 소수의 스트림 복사를 수행합니다.
SearchPath 가능
SetFileApisToANSI 해당 없음
SetFileApisToOEM 해당 없음
SetFileAttributes 가능
SetFileSecurity 가능
SetFileShortName 가능
SetFileTime 가능
SetFileValidData 가능
CreateIoCompletionPort 해당 없음
FlushFileBuffers 가능
GetQueuedCompletionStatus 가능 사용자 모드 대기가 중단될 수 있습니다.
LockFile 가능
LockFileEx 가능
PostQueuedCompletionStatus 해당 없음
ReadFile 가능
ReadFileEx 가능
ReadFileScatter 가능
SetEndOfFile 가능
SetFilePointer 가능
SetFilePointerEx 가능
UnlockFile 가능
UnlockFileEx 가능
WriteFile 가능
WriteFileEx 가능
WriteFileGather 가능
CreateFileMapping 가능
FlushViewOfFile 가능
MapViewOfFile 가능
MapViewOfFileEx 가능
OpenFileMapping 해당 없음
UnmapViewOfFile 해당 없음


이 문서에 포함된 정보는 문서 발행 시에 논의된 문제들에 대한 Microsoft Corporation의 당시 관점을 나타냅니다. Microsoft는 변화하는 시장 상황에 부응해야 하므로 이를 Microsoft의 공약으로 해석해서는 안 되며 발행일 이후 소개된 어떠한 정보에 대해서도 Microsoft는 그 정확성을 보증하지 않습니다.

이 문서는 정보 제공용입니다. Microsoft는 이 문서의 정보와 관련해서 어떠한 명시적, 묵시적 보증도 하지 않습니다.

해당 저작권법을 준수하는 것은 사용자의 책임입니다. 저작권에서의 권리와는 별도로, 이 설명서의 어떠한 부분도 Microsoft의 명시적인 서면 승인 없이는 어떠한 형식이나 수단(전자적, 기계적, 복사기에 의한 복사, 디스크 복사 또는 다른 방법) 또는 목적으로도 복제되거나, 검색 시스템에 저장 또는 도입되거나, 전송될 수 없습니다.

Microsoft는 이 문서 본안에 관련된 특허권, 특허 출허권, 상표권, 저작권 또는 기타 지적 재산권을 보유할 수 있습니다. 서면 사용권 계약에 따라 Microsoft로부터 귀하에게 명시적으로 제공된 권리 이외에, 이 설명서의 제공은 귀하에게 이러한 특허권, 상표권, 저작권 또는 기타 지적 재산권 등에 대한 어떠한 사용권도 허여하지 않습니다.

용례에 사용된 회사, 기관, 제품, 사람 및 이벤트는 실제 데이터가 아닙니다. 어떠한 실제 회사, 기관, 제품, 사람 또는 이벤트와도 연관시킬 의도가 없으며 그렇게 유추해서도 안 됩니다. Aⓒ 2004 Microsoft Corporation. All rights reserved.

Microsoft, Windows 및 Windows Vista는 미국, 대한민국 및/또는 기타 국가에서의 Microsoft Corporation 등록 상표 또는 상표입니다.

여기에 인용된 실제 회사와 제품 이름은 해당 소유자의 상표일 수 있습니다.