IOCTL

Тема в разделе "WASM.NT.KERNEL", создана пользователем kamax70, 26 май 2011.

  1. kamax70

    kamax70 New Member

    Публикаций:
    0
    Регистрация:
    31 мар 2010
    Сообщения:
    36
    Доброго дня!
    Я не знал, где создать топик, поэтому создал здесь.
    Есть программа и драйвер. Программа создает новый процесс через CreateProcess, потом должна отправить его PID в драйвер. А драйвер с ним что-нибудь делает (например выводит в дебагер)
    Я просто не совсем понял, как работает IOCTL и DeviceIoCintrol в частности.
    Не могли бы вы привести мизерный код, реализующий этот функционал, просто для наглядности.
     
  2. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    в юзермоде:
    Код (Text):
    1. HANDLE hDev = CreateFileW(L"\\\\.\\" DEVNAME,GENERIC_ALL,FILE_SHARE_READ|FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0);
    2.     if (hDev != INVALID_HANDLE_VALUE)
    3.     {
    4.         ULONG dwRet;
    5.         ULONG InBuf[2];
    6.         InBuf[0] = (ULONG)GetCurrentThreadId();
    7.         if (!DeviceIoControl(hDev,IOCTL, InBuf,sizeof(InBuf),0,0,&dwRet,0))
    8.         {
    9.             //
    10.         }
    11. }
    В ядре обработчик -
    Код (Text):
    1. static NTSTATUS NTAPI DeviceControlDispatch(PDEVICE_OBJECT pDeviceObject,PIRP pIrp)
    2. {
    3.     HANDLE ThreadId,ThreadHandle;
    4.     PVOID ApcRoutine;
    5.     NTSTATUS Status;
    6.     PIO_STACK_LOCATION pIoSl = IoGetCurrentIrpStackLocation(pIrp);
    7.  
    8.     // request handler
    9.     if (pIoSl->Parameters.DeviceIoControl.IoControlCode == IOCTL )
    10.     {
    11.         if (pIoSl->Parameters.DeviceIoControl.InputBufferLength != 8)
    12.         {
    13.             return STATUS_INFO_LENGTH_MISMATCH;
    14.         }
    15.  
    16.         ThreadId = ((PHANDLE)pIrp->AssociatedIrp.SystemBuffer)[0];
    17.          }
    18. }
    Код поскипан но основная идея думаю понятна