VxD question
От: Аноним  
Дата: 05.04.02 07:56
Оценка:
Здравствуйте.

Не подскажет ли кто можно ли обратится к какому-либо драйверу по IOCTL или как иначе внутри другого драйвера?
Re: VxD question
От: Vovkos Россия https://ioninja.com
Дата: 05.04.02 09:42
Оценка:
Здравствуйте Аноним, Вы писали:

А>Здравствуйте.


А>Не подскажет ли кто можно ли обратится к какому-либо драйверу по IOCTL или как иначе внутри другого драйвера?



PVOID pfnDriverControlDispatch = NULL; 
PDEVICEINFO pdi = VXDLDR_GetDeviceList();
while (pdi)
{
    if (pdi->DI_ModuleName && stricmp(pdi->DI_ModuleName, "DRIVERNAME") == 0)
    {
        PVOID pfnDriverControlDispatch = (PVOID) pdi->DI_DDB->DDB_Control_Proc;
        break;
    }

    pdi = pdi->DI_Next;
}

ASSERT(pfnDriverControlDispatch)
             
DIOCParams ioctl;
memset(&ioctl, 0, sizeof(DIOCParams));
ioctl.dwIoControlCode = //...
ioctl.lpvInBuffer = //...
ioctl.cbInBuffer = //...
ioctl.lpvOutBuffer = //...
ioctl.cbOutBuffer = //...

DWORD dwError = ERROR_SUCCESS;

_asm mov eax, W32_DEVICEIOCONTROL
_asm lea esi, ioctl
_asm call [pfnDriverControlDispatch]    
_asm mov dwError, eax
Re[2]: VxD question
От: Vovkos Россия https://ioninja.com
Дата: 05.04.02 09:47
Оценка:
сорри, очепятка вкралась =)
конечно надо
pfnDriverControlDispatch = (PVOID) pdi->DI_DDB->DDB_Control_Proc;
а не
PVOID pfnDriverControlDispatch = (PVOID) pdi->DI_DDB->DDB_Control_Proc;
Re[3]: VxD question
От: begger Украина  
Дата: 05.04.02 10:05
Оценка:
Здравствуйте Vovkos, Вы писали:

V>сорри, очепятка вкралась =)

V>конечно надо
V>pfnDriverControlDispatch = (PVOID) pdi->DI_DDB->DDB_Control_Proc;
V>а не
V>PVOID pfnDriverControlDispatch = (PVOID) pdi->DI_DDB->DDB_Control_Proc;

Большое спасибо, давно искал.
Re[2]: VxD question
От: Roman_M rgmroman.narod.ru
Дата: 05.04.02 13:44
Оценка:
Здравствуйте Vovkos, Вы писали:

А>>Не подскажет ли кто можно ли обратится к какому-либо драйверу по IOCTL или как иначе внутри другого драйвера?



V>
V>PVOID pfnDriverControlDispatch = NULL; 
V>PDEVICEINFO pdi = VXDLDR_GetDeviceList();
V>while (pdi)
V>{
V>    if (pdi->DI_ModuleName && stricmp(pdi->DI_ModuleName, "DRIVERNAME") == 0)
V>    {
V>        PVOID pfnDriverControlDispatch = (PVOID) pdi->DI_DDB->DDB_Control_Proc;
V>        break;
V>    }

V>    pdi = pdi->DI_Next;
V>}

V>ASSERT(pfnDriverControlDispatch)
V>             
V>DIOCParams ioctl;
V>memset(&ioctl, 0, sizeof(DIOCParams));
V>ioctl.dwIoControlCode = //...
V>ioctl.lpvInBuffer = //...
V>ioctl.cbInBuffer = //...
V>ioctl.lpvOutBuffer = //...
V>ioctl.cbOutBuffer = //...

V>DWORD dwError = ERROR_SUCCESS;

V>_asm mov eax, W32_DEVICEIOCONTROL
V>_asm lea esi, ioctl
V>_asm call [pfnDriverControlDispatch]    
V>_asm mov dwError, eax
V>



Официальных упоминаний об этом я не видел, но тем не менее практика показывает, что еще нужно сделать
_asm mov   ecx, ioctl.dwIoControlCode


Очень многие драйвера используют значение в регистре ecx.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.