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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Перезагрузка и SystemBuffer  (Прочитано 7721 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Python
Гость
« : 20-08-2004 16:07 » 

[IRP_MJ_READ]

NTSTATUS DriverRead(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
    //...
    RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,
      GlobalBuffer->buffer, sizeof(GLOBAL_BUFFER));
    //...
    Irp->IoStatus.Status = STATUS_SUCCESS;
    IoCompleteRequest(Irp, IO_NO_INCREMENT);
    return STATUS_SUCCESS;
}

Subj...
Если я записываю в UserBuffer - то не перезагружается, но достать оттуда из проги ничего не могу, а если SystemBuffer - то перезагруз происходить при вызове ReadFile().

Помогите пожалуйста, какие могут быть причины?
Записан
Kife
Помогающий

by
Offline Offline

« Ответ #1 : 21-08-2004 07:24 » 

блин, у меня похожая фигня была, когда я делал так же. ьыла такая ошибка -- в deviceiocontrol() я в драйвер передавал, скажем, 4 байта, а потом в приложение через буффер пытался передать больше (например 8 байт). А этот буфер работает так, что если передал N байт в драйвер, то обратно можно передать НЕ БОЛЬШЕ чем N. Кажется так. проверь, сколько ты передаешь, и какой размер возвращаешь.
Записан

_______
Да поможет нам F1,  и да сохранит нас F2 ...
Python
Гость
« Ответ #2 : 21-08-2004 08:02 » 

Я в драйвер пока что ничего не передаю, мне бы хотя бы прочитать:

    GlobalBuffer->dwSize = 16;
    RtlCopyBytes(GlobalBuffer->buffer, "*This is a TEST*", GlobalData->dwSize);
    RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,
             GlobalBuffer->buffer, sizeof(GLOBAL_BUFFER));
Записан
Python
Гость
« Ответ #3 : 21-08-2004 09:08 » 

Хе, оказывается это не совсем перезагрузка, а BSOD!

Тогда другой вопрос:

    PIO_STACK_LOCATION irpStack;
    PULONG ioBuffer;
   
    irpStack = IoGetCurrentIrpStackLocation(Irp);
    ioBuffer = Irp->AssociatedIrp.SystemBuffer;


    if (irpStack->MajorFunction == IRP_MJ_READ)
    {
        ioBuffer[0] = 'Y';
        Irp->IoStatus.Information = 1;
    }
    else
        Irp->IoStatus.Information = 0;

    Irp->IoStatus.Status = STATUS_SUCCESS;
    IoCompleteRequest(Irp, IO_NO_INCREMENT);
    return STATUS_SUCCESS;


Почему такой код приводит к синему экрану?
Записан
Python
Гость
« Ответ #4 : 21-08-2004 11:36 » 

Добавил try/ProbeForRead/ProbeForWrite/except - BSOD`ы прекратились!
Но допустим при ProbeForWrite(Irp->AssociatedIrp.SystemBuffer, GlobalBuffer->dwSize, 1) возникает STATUS_ACCESS_VIOLATION.

Все сделал через Irp->UserBuffer, но так и не понял почему раньше не получалось...
Записан
mad
Гость
« Ответ #5 : 23-08-2004 08:02 » 

NTSTATUS DriverRead(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
//...
RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,
GlobalBuffer->buffer, sizeof(GLOBAL_BUFFER));
//...
Irp->IoStatus.Status = STATUS_SUCCESS;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}


........

Цитата

Почему такой код приводит к синему экрану?


ты сделал проверку размера входного буфера?
ты заполнил статусблок информайшн айрп?
ты посмотрел метод буферизации фо флагах фдо для реадрайт, ты уверен, что у тебя там стоит буфеееред метод (обычно для реадрайт используют дайрект метод)?

Цитата

Все сделал через Irp->UserBuffer, но так и не понял почему раньше не получалось...

у тебя по ходу вобще нейзе метод буферизации. Страницы надо локировать probeandlockpages и разлокировать

dot laugh me more plz
Записан
mad
Гость
« Ответ #6 : 23-08-2004 08:04 » 

читай воньЕЯ )
Записан
mad
Гость
« Ответ #7 : 23-08-2004 08:07 » 

and dot make me laugh...
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines