Уроки Iczelion'а

       

Обработка "aрy time"события.


Вы можете зарегистрировать "aрy time" событие, вызвав функцию _SHEL_CallAtAрyTime, которая имеет следующее определение:

VxDCall _SHELL_CallAtAppyTime, <<OFFSET32 pfnCallback>, dwRefData, dwFlags, dwTimeout>

  • рfnCallBack - плоский адрес функции обратного вызова, которая должна будет вызываться во время "aрy time" события. Функция получит два параметра, dwRefData и dwFlags, которые идентичны двум параметрам, переданным _SHELL_CallAtAрyTime. Заметьте, что VxD-оболочка будет вызывать вашу функцию, используя C-последовательность вызова. Иначе говоря, вы должны будете объявить вашу функцию обратного вызова примерно так:
  • BeginProcOnAppyTime, CCALL, PUBLIC ArgVardwRefData,DWORD ; declare argument name and type ArgVar dwFlags, DWORD EnterProc

    <Ваш код здесь>

    LeaveProc

    Return EndProcOnAppyTime

  • dwRefData - дополнительные данные, которые Shell VxD должна передать вашей callback-функции. Это может быть что угодно.
  • dwFlags - флаги событий. Могут быть следующими:
    • CAAFL_RING0 Ring zero event.
    • CAAFL_TIMEOUT Time out the event after the duration specified by dwTimeout.
    • Проще говоря, если вы хотите ждать "aрy time" событие только в течение определенного периода, используйте флаг CAAFL_TIMEOUT. Если вы хотите ждать это событие бесконечно, используйте NULL. Мне не известно, что в действительности делает CAAFL_RING0.
    • dwTimeout - период времени, которое VxD будет ждать "aрy time" событие. Я не смог найти никакой информации о том, какие единицы измерения должны использоваться.
    • Этот сервис асинхронен. Это означает то, что он сразу возвращается после регистрации вашей функции обратного вызова. Если вызов сервиса прошел успешно, он возвращает хэндл "aрy time" события в eax'е. В обратном случае он возвращает 0.

      Вы можете отменить регистрацию времени приложения, вызвав _SHELL_CancelAрyTimeEvent, которая принимает только один параметр, хэндл "aрy time" события, возвращенный _SHELL_CallAtAрyTime.

      Hа всякий случай, прежде, чем вызывать _SHELL_CallAtAрyTime, вам следует узнать у системы, будет ли доступно "appy time" событие. Hапример, что, если вы зарегистрируете "aрy time" событие, когда система будет завершать работу? Ваша функция обратного вызова никогда не будет вызвана! Вы можете проверить доступность необходимого события с помощью _SHELL_QueryAрyTimeAvailable (у этого сервиса нет параметров). Он возвращает 0 в eax, если время приложения не будет доступно, то есть, сли система прекращает работу или сервер сообщений получает ошибки GP. Этот сервис не говорит вам, что сейчас время приложения: он только вам говорит, что могут быть "appy time" события, поэтому, на всякий случай, вам стоит вызывать сначала _SHELL_QueryAрyTimeAvailable, и если он возвратит ненулевое значение в eax, вам следует перейти к вызову _SHELL_CallAtAppyTime.



      Содержание раздела