Función FsRtlCancellableWaitForMultipleObjects (ntifs.h)
La rutina FsRtlCancellableWaitForMultipleObjects ejecuta una operación de espera cancelable (una espera que se puede finalizar) en uno o varios objetos distribuidores.
Sintaxis
NTSTATUS FsRtlCancellableWaitForMultipleObjects(
[in] ULONG Count,
[in] PVOID [] ObjectArray,
[in] WAIT_TYPE WaitType,
[in, optional] PLARGE_INTEGER Timeout,
[in, optional] PKWAIT_BLOCK WaitBlockArray,
[in, optional] PIRP Irp
);
Parámetros
[in] Count
Número de objetos en los que se va a esperar.
[in] ObjectArray
Puntero a una matriz de punteros a objetos distribuidores (eventos, exclusión mutua, semáforos, subprocesos y temporizadores) para los que el autor de la llamada proporciona el almacenamiento.
[in] WaitType
Ya sea WaitAll, que indica que todos los objetos especificados deben alcanzar un estado señalado antes de que se cumpla la espera; o WaitAny, que indica que cualquiera de los objetos debe alcanzar un estado señalado antes de que se cumpla la espera.
[in, optional] Timeout
Puntero a un valor de tiempo de espera opcional. Este parámetro especifica el tiempo absoluto o relativo, en 100 unidades nanosegundas, en las que se va a completar la espera.
Si tiempo de espera apunta a un valor cero (es decir, *Tiempo de espera == 0), la rutina devuelve sin esperar. Si el autor de la llamada proporciona un puntero NULL (es decir, Tiempo de espera == NULL), la rutina espera indefinidamente hasta que cualquiera o todos los objetos del distribuidor se establezcan en el estado señalado.
Un valor positivo especifica una hora absoluta, relativa al 1 de enero de 1601. Un valor negativo especifica un intervalo relativo a la hora actual. Los tiempos de expiración absolutos realizan un seguimiento de los cambios en la hora del sistema; Los tiempos de expiración relativos no se ven afectados por los cambios en la hora del sistema.
Si se especifica tiempo de espera, la espera se cumplirá automáticamente si no se cumple ninguna de las condiciones de espera especificadas cuando expire el intervalo especificado.
Un valor de tiempo de espera de cero (es decir, *Tiempo de espera == 0) permite probar un conjunto de condiciones de espera y realizar condicionalmente cualquier acción adicional si la espera se puede satisfacer inmediatamente, como en la adquisición de una exclusión mutua.
[in, optional] WaitBlockArray
Si Count<= THREAD_WAIT_OBJECTS, waitBlockArray puede ser NULL. De lo contrario, este parámetro debe apuntar a un búfer de memoria de sizeof(KWAIT_BLOCK * Count)
bytes. La rutina usa este búfer para el mantenimiento de registros mientras realiza la operación de espera.
[in, optional] Irp
Puntero al IRP original que corresponde a la operación de E/S emitida por el usuario y que el usuario puede cancelar. El autor de la llamada debe asegurarse de que el IRP seguirá siendo válido durante esta rutina y que el IRP no debe tener un conjunto de rutinas de cancelación (por ejemplo, ioSetCancelRoutine no se debe haber llamado en el IRP). Tenga en cuenta que el IRP debe ser mantenido por el autor de la llamada, no se puede pasar a un controlador de nivel inferior.
Valor devuelto
FsRtlCancellableWaitForMultipleObjects puede devolver uno de los siguientes valores:
Código devuelto | Descripción |
---|---|
STATUS_SUCCESS | El autor de la llamada especificó |
STATUS_TIMEOUT | Se agotó el tiempo de espera antes de que se cumpla el conjunto especificado de condiciones de espera. Este valor se puede devolver cuando no se puede cumplir inmediatamente el conjunto especificado de condiciones de espera y tiempo de espera se establece en cero. |
STATUS_WAIT_0 a través de STATUS_WAIT_63 | El autor de la llamada especificó |
STATUS_ABANDONED_WAIT_0 a través de STATUS_ABANDONED_WAIT_63 | El autor de la llamada intentó esperar una exclusión mutua que se ha abandonado. Los seis bits inferiores del valor devuelto codifican el índice de base cero de la exclusión mutua en la matriz de ObjectArray. |
STATUS_CANCELLED | La espera se interrumpió mediante una solicitud de cancelación pendiente en el IRP especificado. Tenga en cuenta que este valor solo se devuelve si se pasa un IRP válido a FsRtlCancellableWaitForMultipleObjects y el IRP se canceló CancelSynchronousIo. |
STATUS_THREAD_IS_TERMINATING | La espera se interrumpió porque una aplicación o el usuario han terminado el subproceso. |
El valor devuelto solo indica el estado de la espera. Si procede, el estado real de la solicitud de E/S debe obtenerse directamente de otro IRP generado en el proceso de control del IRP original en modo de usuario.
Tenga en cuenta que la macro NT_SUCCESS devuelve FALSE ("error") para el STATUS_CANCELLED y STATUS_THREAD_IS_TERMINATING valores de estado y TRUE ("correcto") para todos los demás valores de estado.
Observaciones
La rutina FsRtlCancellableWaitForMultipleObjects ejecuta una operación de espera cancelable en objetos distribuidores. Si el usuario o la aplicación finalizan el subproceso, o si CancelSynchronousIo publica una solicitud de cancelación en un IRP subproceso (IRP sincrónico) asociado al subproceso, se cancela la espera.
La rutina de FsRtlCancellableWaitForMultipleObjects se diseñó para admitir las directrices de finalización y cancelación de E/S de a partir de Windows Vista. El objetivo de estas directrices es permitir que los usuarios (o aplicaciones) finalicen rápidamente las aplicaciones. Esto, a su vez, requiere que las aplicaciones tengan la capacidad de finalizar rápidamente los subprocesos que ejecutan E/S, así como las operaciones de E/S actuales. Esta rutina proporciona una manera de bloquear los subprocesos de usuario (es decir, esperar) en el kernel para la finalización de E/S, los objetos de distribuidor o las variables de sincronización de una manera que permita que la espera se cancele fácilmente. Esta rutina también permite que finalice la espera del subproceso si un usuario o una aplicación finalizan el subproceso.
Por ejemplo, un redirector puede necesitar crear uno o varios IRP secundarios para procesar un IRP en modo de usuario y esperar sincrónicamente a que se completen los IRP secundarios. Una manera de hacerlo es configurar un evento que se indicará mediante la rutina de finalización del IRP secundario y, a continuación, esperar a que se señale el evento. A continuación, para realizar una operación de espera cancelable, FsRtlCancellableWaitForMultipleObjects se llama pasando el evento asociado al IRP secundario, así como al IRP en modo de usuario original. La espera del subproceso para que se indique el evento se cancela si se produce un evento de terminación pendiente o si se cancela el IRP en modo de usuario original.
Tenga en cuenta que la terminación de la espera no cancela automáticamente ninguna operación de E/S emitida por el autor de la llamada, que el autor de la llamada debe controlar por separado.
Cada objeto de subproceso tiene una matriz integrada de bloques de espera que se pueden usar para esperar varios objetos simultáneamente. Siempre que sea posible, la matriz integrada de bloques de espera debe usarse en una operación wait-multiple porque no es necesario asignar ningún almacenamiento de bloque de espera adicional y desasignarse posteriormente. Sin embargo, si el número de objetos que se deben esperar simultáneamente es mayor que el número de bloques de espera integrados, use el parámetro WaitBlockArray para especificar un conjunto alternativo de bloques de espera que se usarán en la operación de espera. Los controladores solo necesitan asignar un búfer de memoria suficientemente grande para WaitBlockArray. No es necesario inicializar el búfer y los controladores pueden tratarlo como una estructura opaca. El búfer se puede liberar una vez que se devuelve la rutina.
Si Count es mayor que MAXIMUM_WAIT_OBJECTS o si waitBlockArray es NULL y Count es mayor que THREAD_WAIT_OBJECTS, el sistema emite 0xC comprobación de errores: MAXIMUM_WAIT_OBJECTS_EXCEEDED.
Se aplica una consideración especial cuando el parámetro
Una exclusión mutua solo se puede adquirir de forma recursiva solo las veces de MINLONG. Si se supera este límite, la rutina genera una excepción de STATUS_MUTANT_LIMIT_EXCEEDED.
se debe llamar a FsRtlCancellableWaitForMultipleObjects en IRQL PASSIVE_LEVEL si el parámetro irp opcional apunta a un IRP válido. Si no se usa el parámetro irp de
Requisitos
Requisito | Valor |
---|---|
cliente mínimo admitido | Windows Vista |
de la plataforma de destino de |
Universal |
encabezado de |
ntifs.h (incluya Ntifs.h) |
biblioteca de |
NtosKrnl.lib |
DLL de |
NtosKrnl.exe |
irQL | Consulte la sección Comentarios. |
reglas de cumplimiento de DDI | HwStorPortProhibitedDIs(storport), PowerIrpDDis(wdm), SpNoWait(storport) |