Compatibilidad de cancelación de E/S de Win32 en Windows Vista

Septiembre de 2005

Publicado: 25 de Septiembre de 2006

Gerald Maffeo y Paul Sliwowicz
Microsoft Corporation

Este artículo es para proveedores de software independientes y otros interesados en aprovechar la nueva compatibilidad de cancelación para mejorar la solidez de las aplicaciones de Windows. Esto permite una experiencia del cliente mejorada a través de la cancelación directa y la recuperación de la entrada/salida de archivos lentos o bloqueados.

En esta página

Introducción Introducción
Información general Información general
Mejoras de cancelación para Vista Mejoras de cancelación para Vista
Uso de las nuevas API de cancelación de E/S de archivos Uso de las nuevas API de cancelación de E/S de archivos
Cancelación de E/S asincrónica Cancelación de E/S asincrónica
Cancelación de E/S sincrónica Cancelación de E/S sincrónica
Resumen Resumen
Vínculos relacionados Vínculos relacionados
Apéndice A: Nuevas API de cancelación de E/S Apéndice A: Nuevas API de cancelación de E/S
Apéndice B: API de E/S de archivos cancelables Apéndice B: API de E/S de archivos cancelables
Información adicional Información adicional

Introducción

Windows Vista ofrece mejoras del núcleo y controlador, así como nuevas interfaces de programación de la aplicación Win32, para permitir la cancelación ampliada de funciones de administración de archivos Win32 nativos. Estas funciones incluyen la nueva compatibilidad para operaciones sincrónicas de cancelación.

Este artículo ofrece a los desarrolladores información suficientemente detallada para empezar a crear la compatibilidad de cancelación de E/S de archivos en las aplicaciones.

En este artículo se analizará la nueva compatibilidad de cancelación para las operaciones de entrada/salida (E/S) de archivos Win32 en Windows Vista y se proporcionará información detallada para permitir su uso en aplicaciones nativas (no administradas).

Tenga en cuenta que lo explicado en este artículo sólo se aplica al código nativo. La cancelación en las bibliotecas .Net Framework (WinFX) no está actualmente disponible para admitir la cancelación de E/S de archivos de bajo nivel.

Información general

Errores de finalización de la aplicación

En algunas ocasiones, las aplicaciones de Windows no pueden finalizar completamente después de que los usuarios intenten cerrarlas (por ejemplo, al hacer clic en la X roja de la barra de título). En estos casos la aplicación parece cerrarse, pero una inspección posterior muestra que el proceso de la aplicación continúa en la lista de procesos (esto se denomina proceso "inerte"). Los intentos de eliminación del proceso inerte no se pueden realizar. Esto a menudo bloquea los intentos para volver a iniciar la aplicación o puede provocar un comportamiento impredecible. Suele ser necesario reiniciar el equipo para recuperarse.

Disponemos de muchos informes llenos de anécdotas sobre este comportamiento y sospechamos que los controladores defectuosos fueron el motivo, pero necesitamos datos del núcleo para determinar las causas subyacentes y cómo solucionarlas. Para recopilar estos datos, hemos desarrollado una versión especialmente instrumentada de Windows XP que recopilaría y elaboraría un informe con los datos de núcleo, incluyendo las solicitudes del controlador que aún están pendientes del proceso estancado. Hemos implementado esta instrumentación tanto para los usuarios internos de Microsoft como para los clientes seleccionados a través de un programa beta técnico especial.

Estos informes han confirmado no sólo lo que esperábamos, sino también que una gran parte de los errores de finalización y la falta de respuesta de la aplicación se deben a la falta de capacidad de Windows y los controladores para cancelar las solicitudes de creación del controlador. Se deberían realizar cambios en Windows para tratar estos errores.

Compatibilidad de cancelación de las aplicaciones

Las operaciones de archivos pueden legítimamente bloquear la continuidad del subproceso de una aplicación. Una aplicación bien diseñada y que responde bien está compuesta al menos de dos subprocesos, uno que sirve a la interfaz de usuario (IU) y que no llama, directa ni indirectamente, a ninguna API que podría provocar que ésta deje de responder. Se invocan uno o varios subprocesos de "trabajo" para realizar operaciones de bloqueo.

Esto permite que una aplicación sea compatible con la cancelación mediante el botón Cancelar o Detener, así como un indicador de progreso. En muchos casos, basta simplemente con omitir (abandonar) el subproceso de trabajo si el usuario decide anular la operación. Por ejemplo, una llamada a la resolución del servicio de nombres de dominio (DNS) u otra llamada de red en ocasiones finalizará el tiempo de espera, de modo que un subproceso de trabajo puede limpiarse posteriormente.

Sin embargo, hay otras situaciones para las que es necesario o deseable la compatibilidad de cancelación de E/S real. Como ejemplo, detener una llamada OpenFile para un dispositivo muy lento, especialmente si es necesario intentar volver a llamar rápidamente, tal vez con parámetros diferentes. La única alternativa de los usuarios a esperar (tal vez de forma indefinida) es intentar finalizar la aplicación (que puede dar error, como se ha visto anteriormente). Es evidente que se prefiere ofrecer a los clientes la posibilidad de cancelar la solicitud. Para ello es necesario que Windows y sus controladores sean totalmente compatibles con la cancelación, incluida la compatibilidad de la cancelación sincrónica

Mejoras de cancelación para Vista

Adiciones del administrador de E/S y núcleo

La posibilidad de cancelar las solicitudes de creación del controlador (IRP_MJ_CREATE) es compatible en Vista. Las API Win32 que se asignan a las solicitudes de creación del controlador incluyen CreateFile y OpenFile.

Tenga en cuenta que esto no garantiza que los controladores subyacentes vayan a respetar estas solicitudes. Los controladores que pueden tardar mucho tiempo en completar las solicitudes de creación deben implementar la compatibilidad de cancelación. Hemos desarrollado unas instrucciones de finalización/cancelación de E/S del controlador así como una nueva opción para el comprobador de controlador v2 de Vista para admitir los comportamientos de finalización y cancelación de prueba (consulte Comprobador de bloqueo de controlador (puede estar en inglés) en Vínculos relacionados).

Nuevas API de cancelación de E/S de archivos

La compatibilidad de cancelación de E/S limitada está disponible en las API de E/S de archivos en Windows XP y Windows Server 2003 mediante la función CancelIo, que cancela las operaciones de E/S asincrónicas pendientes emitidas por el subproceso llamador para un identificador de archivo determinado. Sin embargo, CancelIo presenta muchas limitaciones, ya que no es compatible con la cancelación de

  • operaciones de E/S que otros subprocesos han emitido para un identificador de archivo.

  • operaciones de E/S específicas.

  • operaciones sincrónicas de E/S, porque (por definición) bloquean el sistema operativo.

  • operaciones de E/S emitidas hacia un puerto de terminación o asociadas a un intervalo IOSB.

Por lo tanto, las API de cancelación nuevas de Win32 se han implementado para Longhorn. A diferencia de CancelIo, las API de CancelIoEx y CancelSynchronousIo nuevas sólo marcan las solicitudes de E/S pendientes para la cancelación y, a continuación, las devuelven inmediatamente. Algunos puntos clave que se derivan de esto son:

  • Existe una condición de carrera inherente entre la cancelación y la terminación, ya que la solicitud de E/S puede finalizar naturalmente, a pesar de la solicitud de cancelación.

  • Es necesario comprobar si la operación ha finalizado correctamente o se ha cancelado (si cancela una solicitud mediante las API de cancelación, la operación se concluye finalmente);

  • El código de estado del proceso de terminación indicará si la operación ha concluido correctamente, ha sido cancelada (ERROR_OPERATION_ABORTED), o bien produjo algún otro tipo de error

Existen prototipos disponibles para estas API nuevas (consulte Vínculos relacionados). Se ofrece información más detallada en el Apéndice A: Nuevas API de cancelación de E/S de archivos.

API de E/S de archivos cancelables

La mayoría de las API de E/S de archivos se pueden cancelar.

Un número menor de API complejas de Win32, como CopyFile, no se pueden cancelar. Se proporcionan las formas cancelables de estas API (por ejemplo, CopyFileEx), que se deben usar. Además de ser compatible con la cancelación, estas API presentan devolución de llamadas integradas para permitir el seguimiento del progreso de la llamada.

Consulte el Apéndice B para obtener una lista de las API de E/S de archivos cancelables.

Uso de las nuevas API de cancelación de E/S de archivos

Cancelación de E/S asincrónica

Puede cancelar operaciones de E/S asincrónicas desde cualquier subproceso del proceso que emite la E/S. Sólo debe proporcionar el identificador con el que se realizó la E/S y, de forma opcional, la estructura superpuesta usada para realizar la E/S. El ejemplo siguiente muestra una rutina que precisa un tiempo de espera e intenta la lectura, de modo que cancela con CancelIoEx cuando el tiempo de espera acaba. Tenga en cuenta que la llamada a CancelIoEx no garantiza la cancelación de la lectura; el controlador encargado de dicha tarea debe ser compatible con la cancelación y debe estar en un estado cancelable.

En el caso asincrónico, puede determinar si la cancelación tuvo lugar revisando el estado cuando recupere la estructura superpuesta o en la devolución de llamada de terminación. El estado ERROR_OPERATION_ABORTED indicará la cancelación de la operación.

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;
    }

    //
    // The I/O was pended, let's wait and see if it times out.
    // Note the overlapped event should have been set up before
    // calling this routine.
    //
    waitResult = WaitForSingleObject( lpOverlapped->hEvent,
                                      dwTimeout );

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

        *bCancelCalled = TRUE;

        //
        // Wait for the I/O to complete (it may or may not actually
        // be cancelled!)
        //
     waitResult = WaitForSingleObject( lpOverlapped->hEvent,
                                          0 );
    }

    return result;
}

Cancelación de E/S sincrónica

Puede cancelar las operaciones de E/S sincrónicas desde cualquier subproceso del proceso que la E/S emite. Para ello, debe proporcionar un identificador del subproceso que ejecuta la E/S actualmente.

El ejemplo siguiente muestra dos rutinas:

  • SynchronousIoWorker es un subproceso de trabajo que implementa algunas E/S de archivo sincrónicas; empieza llamando a CreateFile. Si se realiza correctamente, tendrán lugar otras operaciones adicionales (éstas no se muestran). La variable global gCompletionStatus se puede usar para determinar si se han realizado correctamente todas las operaciones o si alguna de ellas ha producido un error o ha sido cancelada. La variable global dwOperationInProgress indica si la E/S de archivo se encuentra aún en curso. En este ejemplo, el subproceso de la interfaz de usuario también puede comprobar la existencia del subproceso de trabajo. Tenga en cuenta que las comprobaciones manuales adicionales (no se muestran en este ejemplo) son necesarias en SynchronousIoWorker para garantizar que, si se solicitó la cancelación durante los periodos cortos de tiempo entre las llamadas de E/S de archivo, las demás operaciones se cancelarán.

  • MainUIThreadMessageHandler simula el identificador de mensaje en un procedimiento de ventana de un subproceso de la interfaz de usuario. El usuario solicita un conjunto de operaciones de archivo sincrónicas haciendo clic en un control, lo que genera el mensaje de ventana definido por el usuario WM_MYSYNCOPS. El resultado es un código de creación de un subproceso nuevo con la rutina CreateFileThread, que inicia SynchronousIoWorker. A continuación, el subproceso de la interfaz de usuario procesa los mensajes mientras el subproceso de trabajo realiza las operaciones de E/S solicitadas. Si el usuario decide cancelar las operaciones no concluidas (normalmente haciendo clic en el botón para cancelar), el código para WM_MYCANCEL llama a CancelSynchronousIo mediante el identificador de subproceso devuelto por CreateFileThread. CancelSynchronousIo realiza una devolución inmediatamente después del intento de cancelación; no se puede garantizar la cancelación de la solicitud de creación. Por último, el usuario o la aplicación puede solicitar posteriormente otra operación que dependerá de si las operaciones de archivo han concluido. En este caso, el código de ejemplo de WM_PROCESSDATA comprobará primero que las operaciones han finalizado y, a continuación, ejecutará el código de limpieza. En este ejemplo, puesto que la cancelación puede haber ocurrido en cualquier momento de la secuencia de operaciones, puede ser necesario que el llamador se asegure de que el estado es coherente o, al menos, de que se ha comprendido antes de avanzar.

DWORD gCompletionStatus;      // Completion status for last operation
DWORD dwOperationInProgress;   // TRUE if operation is in progress

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) {
   
        /* TODO: CreateFile succeeded. Do more synchronous calls with hFile */
        
        if (result == FALSE) {
            // Some operation failed or was cancelled. If cancelled,
            // GetLastError() will return ERROR_OPERATION_ABORTED

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

    } else {
        // CreateFile failed or was cancelled. If cancelled,
        // GetLastError() will return ERROR_OPERATION_ABORTED
        gCompletionStatus = GetLastError();
    }

    dwOperationInProgress = FALSE;
}



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

    /* TODO: Miscellaneous initializations, etc. */

    switch (uMsg) {

    case WM_MYSYNCOPS:   // User requested an operation on a file
        /* TODO: Retrieve filename from parameters */

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

        if (syncThread == INVALID_HANDLE_VALUE) {
            /* TODO: Handle failure */
        }
        break;
    
    // User clicked a cancel button
    case WM_MYCANCEL:
        if (syncThread != INVALID_HANDLE_VALUE) {
            CancelSynchronousIo(syncThread);
        }
        Break;

    case WM_PROCESSDATA:
        if (!dwOperationInProgress) {
            if (gCompletionStatus == ERROR_OPERATION_ABORTED) {
                /* TODO: Do appropriate cleanup */
            } else if (...) {
                /* TODO: Handle other cases */
            }
        }
        break;
    
    case ...:
        /* TODO: Handle any other cases */
    }

    return TRUE;
}

Problemas de cancelación

Controladores defectuosos

Por desgracia, no existe garantía de que los controladores subyacentes sean perfectamente compatibles con la cancelación. Aunque la solicitud de cancelación sea correcta, el controlador puede bloquear la operación solicitada antes de que finalice. Para agravar la situación, una aplicación con una compatibilidad perfecta con la cancelación puede detener repentinamente solicitudes de cancelación después de restablecer la configuración de un sistema; por ejemplo, después de una instalación o actualización de controladores, como los de un antivirus o de los filtros de un servidor de seguridad.

Condiciones de carrera probables

Al cancelar las operaciones de E/S en otros subprocesos, surgen problemas de sincronización a los que un desarrollador debe prestar atención.

En el caso asincrónico, donde no se proporciona ninguna estructura superpuesta, una llamada a CancelIoEx intentará cancelar todas las operaciones de E/S destacables del archivo durante todos los subprocesos del proceso principal. Observe que procesa cada subproceso de forma individual, de modo que después de haber procesado un subproceso, puede iniciar otra E/S en el archivo antes de que los otros subprocesos hayan cancelado las operaciones de E/S para el archivo.

Además, los desarrolladores deben prestar especial atención al combinar estructuras reutilizadas superpuestas con la cancelación objetivo. No es seguro volver a usar la estructura justo después de llamar a CancelIoEx. Una vez que concluya la operación de E/S (correctamente o en estado de cancelación), la estructura superpuesta no volverá a estar disponible para que el sistema la utilice y se podrá volver a usar.

En el caso sincrónico, una llamada a CancelSynchronousIo intentará cancelar todas las llamadas sincrónicas actuales del subproceso. Si no existe una sincronización perfecta, se puede producir la cancelación de la llamada incorrecta en una serie de llamadas. Es muy difícil realizar un diagnóstico de esta, porque este tipo de llamadas es imprevisible y no ocurre con frecuencia. Una situación posible puede ser la llamada a CancelSynchronousIo. Aunque está orientada a una operación sincrónica determinada, sólo empieza después de que la operación concluya (correctamente o con error). Si el subproceso que llamó a la primera operación inicia entonces otra llamada sincrónica, la llamada de cancelación puede interrumpir esta operación de E/S nueva. Esto puede tener consecuencias muy graves.

Puede existir otra condición de carrera similar para E/S sincrónicas siempre que se comparta un subproceso entre partes diferentes de una aplicación, por ejemplo, el subproceso de un conjunto de subprocesos.

Por ejemplo, supongamos que la subaplicación 1 llama a CreateFile en el subproceso 2 y emite cancelaciones desde el subproceso 1. La subaplicación 2 también comparte el subproceso 2 y lo usa para llamar a Flush, que cancela desde otro subproceso. Si éstos no están coordinados, las solicitudes de cancelación podrían producir la cancelación de la operación equivocada.

Resumen

Se ha mejorado la compatibilidad de cancelación de los núcleos y de muchos controladores de Windows Vista. Hay interfaces de programación de la aplicación Win32 nuevas que permiten cancelar solicitudes sincrónicas de archivo. Éstas han sido diseñadas para satisfacer las necesidades del cliente de Vista mediante la mejora de la confiabilidad en la finalización de la aplicación. Esta mejora también pretende enriquecer la experiencia del usuario a través de la compatibilidad con la cancelación directa de las operaciones de E/S de archivos lentos o bloqueados o la recuperación de los mismos.

Este artículo, en concreto las referencias y apéndices, ofrece a los desarrolladores información suficientemente detallada para empezar a crear la compatibilidad de cancelación de E/S de archivos en las aplicaciones.

Vínculos relacionados

Consulte las siguientes fuentes para obtener más información:

Apéndice A: Nuevas API de cancelación de E/S

Esta sección ofrece información adicional sobre las API de cancelación nuevas de Vista (aparte de lo ofrecido en la sección Vínculos relacionados). Nota: Esta información es preliminar y está sujeta a cambios.

CancelIoEx

Nota  Esta información es preliminar y está sujeta a cambios.

La función CancelIoEx marca todas las operaciones de E/S pendientes para el identificador de archivos especificado del proceso actual como canceladas, independientemente del subproceso que la emita.

BOOL CancelIoEx(
  HANDLE hFile,
  LPOVERLAPPED lpOverlapped
);

Parámetros

hFile [in] Identificador para el archivo cuyas operaciones se van a cancelar. lpOverlapped [in] Puntero para una estructura de datos SUPERPUESTA que proporciona datos usados para las operaciones de E/S (superpuestas) asincrónicas.

Si el valor lpOverlapped no es NULL, sólo se marcan como canceladas las solicitudes emitidas con la estructura superpuesta proporcionada; de no ser así, se cancelan todas las solicitudes de E/S para el identificador de archivo.

Valores devueltos

Si la operación finaliza correctamente, el valor devuelto es distinto de cero.

Si la operación da error, el valor devuelto es cero. Para obtener más información acerca del error, llame a GetLast Error.

Comentarios

CancelIoEx se diferencia de CancelIo en que CancelIo sólo marca las solicitudes canceladas que fueron emitidas por el mismo subproceso que llamó a CancelIo.

Si queda pendiente alguna operación de E/S para el identificador de archivo especificado, la función CancelIoEx la marca para su cancelación. La mayoría de las operaciones se pueden cancelar de forma inmediata; sin embargo, existen otras que se deben finalizar antes de cancelarlas y de que se le notifique al autor de la llamada. CancelIoEx no espera a que las operaciones canceladas finalicen.

La operación en proceso de cancelación se completará finalmente. Es necesario comprobar el estado de conclusión para determinar si la operación ha finalizado normalmente, lo que puede ocurrir a pesar de la solicitud de cancelación; si la operación se canceló, con el estado de conclusión ERROR_OPERATION_ABORTED; o bien, si la operación dio algún otro error.

Requisitos

Cliente

Requiere Windows Vista

Servidor

Requiere Windows Server Vista

Encabezado

Declarado en Winbase.h

Biblioteca

Vínculo a Kernel32.lib

DLL

Requiere Kernel32.dll

CancelSynchronousIo

Nota Esta información es preliminar y está sujeta a cambios.

La función CancelSynchronousIo provoca que las operaciones de E/S sincrónicas pendientes emitidas por el subproceso especificado se marquen como canceladas.

BOOL CancelSynchronousIo(
  HANDLE hThread
);

Parámetros

hThread [in] Identificador para el subproceso bloqueado en E/S sincrónica.

Valores devueltos

Si la operación finaliza correctamente, el valor devuelto es distinto de cero.

Si la operación da error, el valor devuelto es cero. Para obtener más información acerca del error, llame a GetLast Error.

Comentarios

Las operaciones pendientes de E/S sincrónicas emitidas por el subproceso especificado se marcan como canceladas. La mayoría de las operaciones se pueden cancelar de forma inmediata; sin embargo, existen otras que se deben finalizar antes de cancelarlas y de que se le notifique al autor de la llamada. CancelSynchronousIoEx no espera a que las operaciones canceladas finalicen.

La operación en proceso de cancelación se completará finalmente. Es necesario comprobar el estado de conclusión para determinar si la operación ha finalizado normalmente, lo que puede ocurrir a pesar de la solicitud de cancelación; si la operación se canceló, con el estado de conclusión ERROR_OPERATION_ABORTED; o bien, si la operación dio algún otro error. Este servicio es más útil cuando se ha emitido una solicitud de creación que debe ser cancelada, dado que el usuario dejará de tener un identificador para el archivo.

Requisitos

Cliente

Requiere Windows Vista

Servidor

Requiere Windows Server Vista

Encabezado

Declarado en Winbase.h

Biblioteca

Vínculo a Kernel32.lib

DLL

Requiere Kernel32.dll

Apéndice B: API de E/S de archivos cancelables

Nombre de API

¿Se puede cancelar?

Mecanismo de cancelación

WalkTree

Parcialmente

WalkTree no es compatible con la cancelación, pero usa la devolución de llamada de enumeración para realizar el "recorrido". Se puede usar esta devolución de llamada para ser compatible con la cancelación y detener la enumeración si se cancela.

DeleteTree

No

Devolución de llamada para WalkTree que no es compatible con la cancelación

AreFileApisANSI

No disponible

.

CheckNameLegalDOS8Dot3

No disponible

.

CloseHandle

No disponible

.

CopyFile

No

Usa CopyFileEx

CopyFileEx

Si

Se puede cancelar durante la rutina de progreso devolviendo PROGRESS_CANCEL o se puede pasar la variable pbCancel y establecer el valor en TRUE en cualquier momento para realizar la cancelación.

CreateFile

Si

.

CreateHardLink

Si

.

DeleteFile

Si

.

FindClose

Si

.

FindFirstFile

Si

.

FindFirstFileEx

Si

.

FindFirstStreamW

Si

.

FindNextFile

Si

.

FindNextStreamW

Si

.

GetBinaryType

Si

.

GetCompressedFileSize

Si

.

GetFileAttributes

Si

.

GetFileAttributesEx

Si

.

GetFileInformationByHandle

Si

.

GetFileSize

Si

.

GetFileSizeEx

Si

.

GetFileTime

Si

.

GetFileType

Si

.

GetFullPathName

Si

.

GetLongPathName

Si

.

GetShortPathName

Si

.

GetTempFileName

Si

.

GetTempPath

Si

.

MoveFile

No

Usa MoveFileWithProgress

[Text]

No

Usa MoveFileWithProgress

MoveFileWithProgress

La rutina de progreso puede devolver PROGRESS_STOP o PROGRESS_CANCEL para detener la operación; aunque no es compatible con cancelaciones de tipo booleano como CopyFile

ReplaceFile

No

Realiza un número elevado de copias que no se pueden cancelar

SearchPath

.

SetFileApisToANSI

No disponible

.

SetFileApisToOEM

No disponible

.

SetFileAttributes

.

SetFileSecurity

.

SetFileShortName

.

SetFileTime

.

SetFileValidData

.

CreateIoCompletionPort

No disponible

.

FlushFileBuffers

.

GetQueuedCompletionStatus

Se puede interrumpir la espera del modo de usuario

LockFile

.

LockFileEx

.

PostQueuedCompletionStatus

No disponible

.

ReadFile

.

ReadFileEx

.

ReadFileScatter

.

SetEndOfFile

.

SetFilePointer

.

SetFilePointerEx

.

UnlockFile

.

UnlockFileEx

.

WriteFile

.

WriteFileEx

.

WriteFileGather

.

CreateFileMapping

.

FlushViewOfFile

.

MapViewOfFile

.

MapViewOfFileEx

.

OpenFileMapping

No disponible

.

UnmapViewOfFile

No disponible

.

Información adicional

La información que contiene este documento representa la visión actual de Microsoft Corporation sobre el tema en cuestión en la fecha de publicación. Puesto que Microsoft debe responder a las condiciones variables del mercado, no se debe interpretar como un compromiso por parte de Microsoft, y Microsoft no puede garantizar la precisión de la información presentada tras la fecha de publicación.

Este documento se publica únicamente a título informativo. MICROSOFT NO OTORGA GARANTÍAS EXPRESAS O IMPLÍCITAS SOBRE LA INFORMACIÓN CONTENIDA EN ESTE DOCUMENTO.

El usuario tendrá la responsabilidad de cumplir todas las leyes de copyright aplicables. Sin limitación de los derechos de autor aplicables, ninguna parte de este documento se podrá reproducir, almacenar o insertar en un sistema de recuperación, ni transmitir de ninguna forma, por ningún medio (electrónico, mecánico, de reprografía, grabación o de cualquier otro tipo) o propósito, sin la previa autorización por escrito de Microsoft Corporation.

Microsoft puede ser titular de patentes, solicitudes de patentes, marcas comerciales, derechos de autor o derechos de propiedad intelectual sobre los contenidos de este documento. A excepción de lo indicado explícitamente en el contrato de licencia por escrito de Microsoft, este documento no le otorga ninguna licencia para estas patentes, marcas, derechos de autor u otra propiedad intelectual.

Las compañías, organizaciones, productos, personas y acontecimientos de ejemplo que se describen en este documento son ficticios. No se pretende indicar ni debe deducirse ninguna asociación con compañías, organizaciones, productos, personas o acontecimientos reales. © 2004 Microsoft Corporation. Reservados todos los derechos.

Microsoft, Windows y Windows Vista son marcas comerciales registradas o marcas comerciales de Microsoft Corporation en Estados Unidos y/o en otros países.

Los nombres de compañías y productos reales mencionados aquí pueden ser marcas comerciales de sus respectivos propietarios.

Mostrar: