METHOD_BUFFERED & ProbeForWrite

Тема в разделе "WASM.NT.KERNEL", создана пользователем h0t, 23 авг 2011.

  1. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    Добрый день, наткнулся на интересную особенность (вроде ошибки в коде нет).
    Смысл в следующем: есть обработчик запроса METHOD_BUFFERED типа такого:
    Код (Text):
    1. IoStatus->Status      = STATUS_SUCCESS;
    2. IoStatus->Information = 0;  
    3. .......
    4. case IOCTL_XXX:
    5.                 if( LOGBUFSIZE > OutputBufferLength )  {
    6.                     IoStatus->Status = STATUS_BUFFER_TOO_SMALL;
    7.                     return FALSE;
    8.                 }
    9.  
    10.                 try {                
    11.                     ProbeForWrite( OutputBuffer,OutputBufferLength,sizeof( UCHAR ));
    12.                 } except( EXCEPTION_EXECUTE_HANDLER ) {
    13.                     IoStatus->Status = STATUS_INVALID_PARAMETER;
    14.                     return FALSE;
    15.                 }    
    16.                 ExAcquireFastMutex( &LogMutex );
    17.                 memcpy( OutputBuffer, Data, Len );
    18.                 ExReleaseFastMutex( &LogMutex );
    19.                 IoStatus->Information = Len;
    20.                 break;
    если запрос с этим кодом сделать то DeviceIoControl отрабатывает(вернет TRUE, и в буффере будут верные данные), но в количестве возвращаемых байт - мусор, при чем если закоментить ProbeForWrite то все будет OK)
    вот интересно почему... если кто сталкивался скажите)
    Код (Text):
    1. IoStatus->Information = 0;
    все равно не делает 0)
    А еще момент используется FastIoDeviceControl

    P.S. в довершение ко всему функция возвращает FALSE;) Намеренно)))
     
  2. rttgedt

    rttgedt Антон

    Публикаций:
    0
    Регистрация:
    12 окт 2010
    Сообщения:
    85
    А где вы берете переменную Len?
     
  3. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    Не важно, данные все равно не совпадают)
    можно там 0 смело ставить
     
  4. rttgedt

    rttgedt Антон

    Публикаций:
    0
    Регистрация:
    12 окт 2010
    Сообщения:
    85
    Ну, раз не совпадают, значит где-то вы портите память. Если в отладчике глянуть вот в этот момент:
    Код (Text):
    1. memcpy( OutputBuffer, Data, Len );
    Чему будет равно Len? И после выполнения копирования.
     
  5. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    Да в том то и дело что не порчу, это все можно закоментить если пробу оставить то возврат все равно левый len нигде не портиться
     
  6. rttgedt

    rttgedt Антон

    Публикаций:
    0
    Регистрация:
    12 окт 2010
    Сообщения:
    85
    А зачем вы в METHOD_BUFFERED используете ProbeForWrite? Эта функция проверяет ведь "юзермодную память". А в случае METHOD_BUFFERED вы работаете с клоном режима ядра.
     
  7. rttgedt

    rttgedt Антон

    Публикаций:
    0
    Регистрация:
    12 окт 2010
    Сообщения:
    85
    В DDK даже предупреждение есть по этому поводу:
     
  8. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    Знаю, ну опять при чем тут поле Information ума не приложу)
    Я понимаю КАК НУЖНО сделать мне интересно ПОЧЕМУ это происходит)

    P.S. исключение не вылазит....
     
  9. rttgedt

    rttgedt Антон

    Публикаций:
    0
    Регистрация:
    12 окт 2010
    Сообщения:
    85
    Смотрите в отладчике что происходит. Уверен, где-то в кишках ProbeForWrite происходит порча памяти.
     
  10. h0t

    h0t Member

    Публикаций:
    0
    Регистрация:
    3 апр 2011
    Сообщения:
    735
    да про отладчик ясно, сейчас глянуть не могу по техническим причинам, на счет порчи не катит потому, что я устанавливаю Information после ProbeForWrite... и вообще какое отношение входной буфер имеет к IoStatus....
    а как оно может так портить не ясно...