Допустим есть приложение которому нужно передать данные в драйвер (данных много например 100-200кб) . Приложение передает драйверу указатель на данные драйвер проверяет валидность указателя и копирует память себе в пул. Казалось бы все хорошо, но это пока один поток есть. Примерный код драйвера Код (Text): { ProbeForRead(InBuffer,size,1); RtlCopyMemory(&data,ptn->InBuffer,sizeof(data)); } Допустим проверка валидности памяти прошла успешно и в этот момент произошло прерывание, и планировщик потоков сменил активный поток. А другой поток взял и освободил память InBuffer. Получается после получения управления снова поток получит исключение и слетит система. Как бороться с подобной проблемой? Блокировать все остальные процессоры и повышать свой irql ?
XshStasX Для того, чтобы не слетала, нужно обработчик исключения ставить, т.е. обрамлять в __try/__except весь доступ к памяти, включая ProbeForRead. А вообще для одноразовой передачи 100-200кб совсем не обязательно работать напрямую с пользовательским буфером, вполне можно и direct I/O, и даже buffered I/O использовать. Я для одноразовых передач по 16Мб buffered I/O использовал. Передача 100-200кб/с — это уже другое дело. P.S. Тему как-нибудь по-умнее нельзя было назвать? Мне при виде названия Гамлет вспомнился, а не методы передачи данных в ядро.
А может быть такое что пока напервом процессоре выполняется чтение из памяти. На втором процессоре происходит освобождение этой памяти. И что будет в таком случаи ? префикс lock поможет ? kejcerfcrv достаточно отключить отключить доставку АРС ?
100500 Память с апк не связана, аллокация по отношению к данной проверке асинхронна. Если выполнять код в двух потоках, в одном проверку выше, в другом освобождение и аллокацию памяти, то на некоторой итерации поток успешно пройдёт проверку, но окажется далее что память не доступна.
Т.С. Смотри в сторону Лока памяти или копирования в SEH блоке. kejcerfcrv Как синхроницировать время? то и есть выполнить атаку. И так дано Есть уязвимая функция которая делает проверку ,а после глупо пологает что память останется валидной. Пример void Func( LPVOID lpMemory, DWORD dwSize ) { if ( lpMemory ) { ProbeForRead(lpMemory); CopyMemory(g_GlobalMemory, lpMemory, dwSize); // Как узнать что поток находится на этом этапе? ( код в драйвере) } }