Ассемблер для Windows


Программа загружающая использующая и выгружающая динамический драйвер



Рисунок 4.7.4. Программа, загружающая, использующая и выгружающая динамический драйвер.

Прокомментируем программу на Рисунок 4.7.4. Главное здесь - разобрать работу функции DeviceIoControl. Вот параметры этой функции:

  • 1-й параметр, дескриптор драйвера, полученный через функцию CreateFile.
  • 2-й параметр, номер необходимой Вам операции.
  • 3-й параметр, адрес данных для драйвера.
  • 4-й параметр, длина данных.
  • 5-й параметр, буфер, куда драйвер поместит свои данные.
  • 6-й параметр, длина буфера.
  • 7-й параметр, адрес переменной, куда будет занесено количество байтов, помещенных в буфер драйвером.
  • 8-й параметр, адрес OVERLAPPED-структуры.
  • Как видите, при вызове мы передаем указатель на строку MES1.

    Теперь, я думаю. Вы легко сможете разобраться в программе загрузки. Переходим к самому драйверу. Драйвер выполняет весьма простую функцию. При вызове его сервиса он выводит на экран сообщение. Причем текст сообщения передается вызывающей программой. При вызове функции DeviceIoControl с дескриптором драйвера, на драйвер приходит сообщение w32_deviceIoControl. При этом регистр EBX содержит дескриптор виртуальной машины, ESI указывает на структуру, содержимое которой мы сейчас разберем. При этом надо иметь в виду, что при загрузке драйвера на него тоже приходит это же сообщение, и мы его должны также обработать. Разберем теперь структуру, на которую указывает регистр ESI.

    DIOCParams STRUC Internal1 DD ? VMHandle DD ? Internal2 DD ? dwIoControlCode DD ? lpvInBuffer DD ? cbInBuffer DD ? lpvOutBuffer DD ? cbOutBuffer DD ? lpcbBytesReturned DD ? lpoOverlapped DD ? hDevice DD ? tagProcess DD ? DIOCParams ENDS

    Опишем поле структуры:

    Internal1 - указатель на структуру Client_Reg_Struc, определяющую регистры вызывающего приложения (см. Рисунок 4.7.6. и пояснения к нему).

    VMHandle - дескриптор виртуальной машины.

    Internal2 - указатель на блок DDB.

    dwIoControlCode - номер необходимой операции.

    lpvInBuffer - указатель на буфер, содержащий информацию вызывающей программы.

    cbInBuffer - количество байт, пересылаемых в буфере.




    - Начало -  - Назад -  - Вперед -