Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Irp->IoStatus.Status  (Прочитано 8716 раз)
0 Пользователей и 1 Гость смотрят эту тему.
dorador
Гость
« : 17-11-2003 11:13 » new

Код:
NTSTATUS
ToasterDispatchIoctl(
    IN  PDEVICE_OBJECT  DeviceObject,
    IN  PIRP            Irp
    )
{
.....
    Irp->IoStatus.Status = status;
    IoCompleteRequest (Irp, IO_NO_INCREMENT);
.....
    return status;
}
диспетчер возвращает статус и он же присваивается сабжу
первое возвращает DeviceIoControl
для чего нужно последнее?
только для передачи драйверу более верхнего уровня?
« Последнее редактирование: 21-11-2007 16:04 от Алексей1153++ » Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #1 : 17-11-2003 11:26 » 

Цитата

return status;


Вот это что-ли? Да это для верхнего драйвера или системы. это то что возвратит IoCallDriver. Кстати оно может отличаться от Irp->IoStatus.Status = status; так как можно вернуть верхнему драйверу STATUS_PENDING, а в Irp->IoStatus.Status его естественно вставлять нельзя, туда код, соответствующий окончанию операции вставят.
Записан
dorador
Гость
« Ответ #2 : 17-11-2003 15:02 » 

Цитата

можно вернуть верхнему драйверу STATUS_PENDING, а в Irp->IoStatus.Status его естественно вставлять нельзя, туда код, соответствующий окончанию операции вставят.

а я, когда возвращаю STATUS_PENDING, ничего не пишу в Irp->IoStatus.Status (в диспетчерской процедуре).
а сейчас как раз хотел исправить и писать STATUS_PENDING :oops:
А почему нельзя в Irp->IoStatus.Status писать STATUS_PENDING и что будет если записать и какой-такой
Цитата

код, соответствующий окончанию операции
или где его надо в Dispatch или уже в StartIO присваивать?
и кто его анализирует? IOManager?
Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #3 : 18-11-2003 06:58 » 

Цитата

А почему нельзя в Irp->IoStatus.Status писать STATUS_PENDING и что будет если записать


Ничего не будет, его перезапишут. Обработка IRP отложена, вот когда обработают, тогда и запишут код.

Цитата

и какой-такой Цитата:

код, соответствующий окончанию операции


Тот который будет после обработки отложенного IRP.

Цитата

или где его надо в Dispatch или уже в StartIO присваивать?


Где хочешь. В зависимости от результата. Почему ты так выделили StartIO, ее не обязательно применять. В Dispatch его точно ставить незачем- ты же отложил обработку и вышел из процедуры.

Цитата

и кто его анализирует? IOManager?


А как узнать результат операции? Вот по нему и узнают, а кто- не важно. Менеджер, драйвер или еще кто-то.

Сложно отвечать на твой вопрос, у тебя очень большая путаница в понимании работы системы. Попробуй почитать W.Oney "Programming WDM". Я так понимаю ты только пытаешься начать писать драйвера.
Записан
dorador
Гость
« Ответ #4 : 18-11-2003 15:07 » 

Цитата
Попробуй почитать W.Oney "Programming WDM".
SlavaI, я пробую...
и все же уточню первоначальную постановку вопроса
к драйверу обращается приложение посредством DeviceIoControl
IoManager сформирует IRP, передаст его в ToasterDispatchIoctl,
который его обработает и завершит, но возвращаемый статус и записанный в IRP будут разные
например
Код:
NTSTATUS 
ToasterDispatchIoctl(
    IN  PDEVICE_OBJECT  DeviceObject,
    IN  PIRP            Irp
    )
{
.....
    status = STATUS_SUCCESS;
    Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
    IoCompleteRequest (Irp, IO_NO_INCREMENT);
.....
    return status;
}
в результате приложение получит status, но не получит Irp->IoStatus.Status
вопрос для чего он нужен?
« Последнее редактирование: 21-11-2007 16:06 от Алексей1153++ » Записан
SlavaI
Главный специалист

ru
Offline Offline

« Ответ #5 : 19-11-2003 06:47 » 

Цитата
в результате приложение получит status, но не получит Irp->IoStatus.Status
вопрос для чего он нужен?

В режиме ядра приложение получит оба кода.

Посмотрим на ф-цию
Код:
 
NTSTATUS ZwDeviceIoControlFile(
    IN HANDLE  FileHandle,
    IN HANDLE  Event,
    IN PIO_APC_ROUTINE  ApcRoutine,
    IN PVOID  ApcContext,
    OUT PIO_STATUS_BLOCK  IoStatusBlock,
    IN ULONG  IoControlCode,
    IN PVOID  InputBuffer,
    IN PVOID  InputBufferLength,
    OUT PVOID  OutputBuffer,
    OUT PVOID  OutputBufferLength
    );



возвращенное этой ф-цией значение - это то что вернула ф-ция ToasterDispatchIoctl путем return status;  . Но как видно ф-ции  ZwDeviceIoControlFile необходимо передать  PIO_STATUS_BLOCK  IoStatusBlock, причем структура *IoStatusBlock должна быть создана, а ее указаетль передается в ф-цию. Этот указатель и копируется в Irp->IoStatus.
 Аналогично, если создается просто запрос, например через IoBuildDeviceIoControlRequest или IoAllocateIrp, то необходимр поместить указатель в  Irp->IoStatus на созданную структуру IO_STATUS_BLOCK. Тогда IoCallDriver вернет то что вернула ф-ция дтспетчеризации, а в IO_STATUS_BLOCK будет код завершения.
  Нужен IO_STATUS_BLOCK именно потому что ф-ция диспетчеризации может вернуть STATUS_PENDING, тем самым отложив обработку, но после ее завершения надо как-то сообщить о статусе- вот он и будет в IO_STATUS_BLOCK. То есть для асинхронных операций имеет значение IO_STATUS_BLOCK так как именно из него берут статус завершения, возвращенный ZwDeviceIoControlFile, а для синхронных операций возвращенное значение и значение в IO_STATUS_BLOCK должны совпадать(я так думаю), так как для синхронных операций сложно сказать на основании чего принимается решение о возврате значения из ZwDeviceIoControlFile пользовательскому приложению, по моему это не определено.
Кстати в примере из DDK для toaster сделано так как я и написал(равны значения) для синхронного запроса. Откуда ты взял свой код?
Код:
 
NTSTATUS
ToasterDispatchIoctl(
    IN  PDEVICE_OBJECT  DeviceObject,
    IN  PIRP            Irp
    )
/*++
Routine Description:

    Handle user mode DeviceIoControl requests.

Arguments:

   DeviceObject - pointer to a device object.

   Irp - pointer to an I/O Request Packet.

Return Value:

   NT status code

--*/
{
    PIO_STACK_LOCATION      irpStack;
    NTSTATUS                status= STATUS_SUCCESS;
    PFDO_DATA               fdoData;

    PAGED_CODE ();

    ToasterDebugPrint((3, "Ioctl called\n"));

    fdoData = (PFDO_DATA) DeviceObject->DeviceExtension;

    ToasterIoIncrement (fdoData);

    if (HoldRequests == fdoData->QueueState) {

        return ToasterQueueRequest(fdoData, Irp);

    } else if (Deleted == fdoData->DevicePnPState) {

        //
        // Since the device is removed, we will not hold any IRPs.
        // We just fail it.
        //
        Irp->IoStatus.Status = STATUS_DELETE_PENDING;
        IoCompleteRequest (Irp, IO_NO_INCREMENT);
        ToasterIoDecrement(fdoData);
        return STATUS_DELETE_PENDING;
    }

    irpStack = IoGetCurrentIrpStackLocation (Irp);

    switch (irpStack->Parameters.DeviceIoControl.IoControlCode) {

    case IOCTL_TOASTER_DONT_DISPLAY_IN_UI_DEVICE:

        fdoData->DontDisplayInUI = TRUE;
        IoInvalidateDeviceState(fdoData->UnderlyingPDO);
        Irp->IoStatus.Information = 0;
        break;

    default:
        status = STATUS_INVALID_DEVICE_REQUEST;
    }

    Irp->IoStatus.Status = status;
    IoCompleteRequest (Irp, IO_NO_INCREMENT);
    ToasterIoDecrement(fdoData);
    return status;
}
« Последнее редактирование: 21-11-2007 16:08 от Алексей1153++ » Записан
dorador
Гость
« Ответ #6 : 19-11-2003 08:35 » 

SlavaI, спасибо
Цитата

Откуда ты взял свой код?

это я над этим примером из DDK и издеваюсь Отлично
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines