Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Nota:
El comportamiento descrito en esta página para un usuario APC se aplica tanto a los APC de modo de usuario regulares como a los APC de modo de usuario especiales.
Los subprocesos que esperan un objeto despachador en nombre de un llamador en modo de usuario deben estar preparados para que esa espera sea interrumpida, ya sea por un APC de usuario o por terminación del subproceso. Cuando un subproceso llama a KeWaitForSingleObject, KeWaitForMultipleObjects, KeWaitForMutexObject o KeDelayExecutionThread, el sistema operativo puede colocar el subproceso en un estado de espera. Normalmente, el subproceso permanece en estado de espera hasta que el sistema operativo pueda completar la operación que solicita el autor de la llamada. Sin embargo, si el autor de la llamada especifica WaitMode = UserMode, el sistema operativo podría interrumpir la espera. En ese caso, la rutina finaliza con un valor NTSTATUS de STATUS_USER_APC.
Cualquier controlador que llame a una de las cuatro rutinas anteriores con WaitMode = UserMode debe estar preparado para recibir un valor devuelto de STATUS_USER_APC. El controlador debe completar su operación actual con STATUS_USER_APC y devolver el control al modo de usuario.
Las situaciones exactas en las que el sistema operativo interrumpe la espera depende del valor del parámetro Alertable de la rutina. Si Alertable = TRUE, la espera es una espera alertable. De lo contrario, la espera es una espera no alertable. El sistema operativo interrumpe las esperas alertables solo para entregar un APC de usuario. El sistema operativo interrumpe ambos tipos de esperas para finalizar el subproceso.
En la tabla siguiente se explica la relación entre diferentes ajustes de parámetros, esperas y entrega de APC al usuario.
| Parámetros | ¿Se ha interrumpido la espera? | ¿El usuario APC entregó? |
|---|---|---|
| Alertable = TRUEWaitMode = UserMode | Sí | Sí |
| Alertable = TRUEWaitMode = KernelMode | Sí | No |
| Alertable = FALSEWaitMode = UserMode | Sí, para la finalización del subproceso. No, para los APC de usuario. | No |
| Alertable = FALSEWaitMode = KernelMode | No | No |
Puede deshabilitar las API de kernel para un subproceso. Si deshabilita los APC de kernel para un subproceso, la entrega de APC de usuario y la finalización de ese subproceso también se desactivan. Para obtener más información sobre cómo deshabilitar las API, consulte Deshabilitación de las API.
Las alertas, un mecanismo que rara vez se usa y que es interno al sistema operativo, también pueden interrumpir los estados de espera alerta. Una alerta puede interrumpir una espera cuando Alertable = TRUE, independientemente del valor del parámetro WaitMode . La rutina de espera devuelve un valor de STATUS_ALERTED.
Tenga en cuenta que los APC del kernel se ejecutan preemptivamente y no causan que KeWaitForXxx o KeDelayExecutionThread devuelvan. El sistema interrumpe y reanuda la espera internamente. Normalmente, los controladores no se ven afectados por este proceso, pero es posible que el controlador pierda una señal de objeto distribuidor para una condición transitoria, como una llamada a KePulseEvent.