Уроки Iczelion'а

       

Анализ


VxD ожидает сообщений от DeviceIoControl, сервис 1. Когда он получит это сообщение, он регистрирует "aрy time" событие.

VxDCall _SHELL_CallAtAppyTime,<,0,0,0>

Он передает плоский адрес функции OnAрyTime _SHELL_CallAtAрyTime, чтобы Shell VxD вызвал ее, когда произойдет "aрy time" событие.

BeginProc OnAppyTime, CCALL

Мы объявляем функцию с помощью BeginProc. Так как Shell VxD вызовет OnAрyTime, используя C-соглашение о передаче параметров, нам требуется указать аттрибут CCALL.

ArgVar RefData,DWORD ArgVar TheFlag,DWORD EnterProc ... LeaveProc Return

Так как Shell VxD вызовет OnAрyTime с двумя параметрами, мы должны соответствующим образом настроить границы стека. Макрос ArgVar отвечает именно за это (вызывается для каждого параметра). Вот его синтакс:

ArgVar varname, size, used

varname - это имя параметра. Вы можете использовать любое имя, которое хотите. size - это, конечно, размер параметра в байтах. Вы можете использовать BYTE, WORD, DWORD или 1, 2, 4. used обычно опускается.

Сразу после вызовов макроса ArgVar нам нужно использовать макросы EntetProc и LeaveProc, чтобы отметить начало и конец инструкций в процедуре, чтобы локальные переменные и параметры могли использоваться корректно. Используйте макрос Return, чтобы передать управление вызывающему.

mov File.shex_dwTotalSize,sizeof SHEXPACKET add File.shex_dwTotalSize,sizeof EXEName mov File.shex_dwSize,sizeof SHEXPACKET mov File.shex_ibOp,0 mov File.shex_ibFile,sizeof SHEXPACKET mov File.shex_ibParams,0 mov File.shex_ibDir,0 mov File.shex_dwReserved,0 mov File.shex_nCmdShow,1 VxDCall _SHELL_ShellExecute,

Инструкции внутри процедуры просты: инициализируйте структуру SHEXPACKET и вызовите сервис_SHELL_ShellExecute. Заметьте, что shex_dwTotalSize содержит комбинированный размер структуры SHEXPACKET и строки, которая следует за ней. Это в простом случае. Если строка следует не сразу за ней, вы должны вычислить дистанцию между первым байтом структуры и последним байтом строки самостоятельно. shex_ibFile содержит размер структуры, так как имя программы следует сразу за ней. shex_ibDir равна нулю - это означает, что мы хотим использовать директорию Windows в качестве рабочей директории. Заметьте, что это не означает то, что программа должна быть в директории Windows. Программа может быть где угодно, главное, чтобы Windows мог ее найти. shex_nCmdShow pавен 1 (это значение SW_SHOWNORMAL).

File SHEXPACKET <> EXEName db "calc.exe",0

Мы определили структуру SHEXPACKET, за которой сразу следует имя программы, которую мы хотим запустить.

[C] Iczelion, пер. Aquila.





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