Добрый день, наткнулся на интересную особенность (вроде ошибки в коде нет). Смысл в следующем: есть обработчик запроса METHOD_BUFFERED типа такого: Код (Text): IoStatus->Status = STATUS_SUCCESS; IoStatus->Information = 0; ....... case IOCTL_XXX: if( LOGBUFSIZE > OutputBufferLength ) { IoStatus->Status = STATUS_BUFFER_TOO_SMALL; return FALSE; } try { ProbeForWrite( OutputBuffer,OutputBufferLength,sizeof( UCHAR )); } except( EXCEPTION_EXECUTE_HANDLER ) { IoStatus->Status = STATUS_INVALID_PARAMETER; return FALSE; } ExAcquireFastMutex( &LogMutex ); memcpy( OutputBuffer, Data, Len ); ExReleaseFastMutex( &LogMutex ); IoStatus->Information = Len; break; если запрос с этим кодом сделать то DeviceIoControl отрабатывает(вернет TRUE, и в буффере будут верные данные), но в количестве возвращаемых байт - мусор, при чем если закоментить ProbeForWrite то все будет OK) вот интересно почему... если кто сталкивался скажите) Код (Text): IoStatus->Information = 0; все равно не делает 0) А еще момент используется FastIoDeviceControl P.S. в довершение ко всему функция возвращает FALSE Намеренно)))
Ну, раз не совпадают, значит где-то вы портите память. Если в отладчике глянуть вот в этот момент: Код (Text): memcpy( OutputBuffer, Data, Len ); Чему будет равно Len? И после выполнения копирования.
Да в том то и дело что не порчу, это все можно закоментить если пробу оставить то возврат все равно левый len нигде не портиться
А зачем вы в METHOD_BUFFERED используете ProbeForWrite? Эта функция проверяет ведь "юзермодную память". А в случае METHOD_BUFFERED вы работаете с клоном режима ядра.
Знаю, ну опять при чем тут поле Information ума не приложу) Я понимаю КАК НУЖНО сделать мне интересно ПОЧЕМУ это происходит) P.S. исключение не вылазит....
да про отладчик ясно, сейчас глянуть не могу по техническим причинам, на счет порчи не катит потому, что я устанавливаю Information после ProbeForWrite... и вообще какое отношение входной буфер имеет к IoStatus.... а как оно может так портить не ясно...