Esperas y APC
Nota:
El comportamiento descrito en esta página para un usuario APC se aplica a las API de modo de usuario normales, así como a las API de modo de usuario especiales.
Los subprocesos que esperan un objeto distribuidor en nombre de un autor de llamada en modo de usuario deben estar preparados para que se interrumpa esa espera, ya sea por un usuario APC 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 se cierra 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 es Alertable = TRUE, la espera es una espera que se puede alertar. De lo contrario, la espera es una espera no alertable. El sistema operativo interrumpe las esperas de alerta solo para entregar un usuario APC. El sistema operativo interrumpe ambos tipos de esperas para finalizar el subproceso.
En la tabla siguiente se explica la relación entre diferentes configuraciones de parámetros, esperas y entrega de APC de usuario.
Parámetros | ¿Espera interrumpida? | ¿Se entregó el usuario APC? |
---|---|---|
Alertable = TRUE WaitMode UserMode = | Sí | Sí |
Alertable = TRUE WaitMode = KernelMode | Sí | No |
Alertable = FALSE WaitMode UserMode = | Sí, para la finalización del subproceso. No, para las API de usuario. | No |
Alertable = FALSE WaitMode = KernelMode | No | No |
Puede deshabilitar las API de kernel para un subproceso. Si deshabilita las API de kernel para un subproceso, la entrega de APC de usuario y la terminación del subproceso para ese subproceso también están deshabilitadas. 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 que es interno para el sistema operativo, también pueden interrumpir los estados de espera que se puedan generar alertas. 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 las API de kernel se ejecutan de forma preventiva y no hacen 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.