Со стороны win32-приложения:
Оно должно вызвать CreateFile, чтобы открыть/загрузить VxD. Если вызов прошел успешно, VxD будет загружен в память и CreateFile возвратит хэндл VxD в eax.
Затем вы вызываете API-функцию DeviceIoControl, чтобы выбрать нужную функцию. DeviceIoControl имеет следующий синтаксис:
DeviceIoControl PROTO hDevice:DWORD,\ dwIoControlCode:DWORD,\ lpInBuffer:DWORD,\ nInBufferSize:DWORD,\ lpOutBuffer:DWORD,\ nOutBufferSize:DWORD,\ lpBytesReturned:DWORD,\ lpOverlapped:DWORD
hDevice - это хэндл VxD, возвращенного CreateFile'ом. dwIocontrolCode - это значение, которое указывает операцию, которую должен выполнить VxD. Вы должны каким-то образом достать список допустимых значений dwIoControlCode для данного VxD, прежде, чем вы узнаете, какую операцию вам нужно совершить. Hо, как правило, вы будете являться тем, кто программирует VxD, поэтому вы будете знать этот список. lрInBuffer - это адрес буфера, который содержит данные, необходимые VxD для выполнения операции, указанные в dwIoControlCode. Если операция не требует данных, вы можете передать NULL. nInBufferSize - это размер в байтах данных в буфере, на который указывает lpInBuffer. lрOutBuffer - это адрес буфера, который VxD заполнит выходными данными, когда операция будет успешно произведена. Если операция не предполагает выходных данных, это поле должно равняться NULL'у. nOutBufferSiz - это размер в байтах буфера, на который указывает lpOutbuffer. lрBytesReturned - адрес переменной типа dword, которая получит pазмеp данных, вписанных VxD в lpOutBuffer. lрOverlaрed - это адрес структуры OVERLAPPED, если вы хотите, чтобы операция была асинхронной. Если вы хотите подождать, пока операция будет выполнена, поместите NULL в это поле.
Содержание раздела