0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 44
|
||||||
1 | ||||||
RtlInitAnsiString - inBuf равняется ?02.05.2013, 18:11. Показов 4480. Ответов 9
Метки нет (Все метки)
Пишу программу, которая на уровне пользователя получает список процессов, нужное имя процесса передает драйверу и скрывает данный процесс...Имя процесса передается правильно, но проблема со строкой 39....inBuf - имя требуемого процесса....При первом запуске данной функции все нормально, но потом при отладке обнаружил, что inBuf равняется ???...Подскажите в чем проблема....Заранее спасибо
0
|
02.05.2013, 18:11 | |
Ответы с готовыми решениями:
9
1,8 + 0,1 не равняется 1,9 Почему i=i++ равняется i ? Вычислить Z, которая равняется label на форме равняется CommandButton.name |
Ушел с форума
|
||||||
02.05.2013, 21:17 | 2 | |||||
Ошибка в обработчике IRP_MJ_DEVICE_CONTROL:
но не его содержимое. После завершения процедуры диспетчер ввода-вывода уничтожает буфер и inBuf указывает в пустоту. Странно, что это в "синий экран" не вылетает.
0
|
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 44
|
|
02.05.2013, 21:59 [ТС] | 3 |
Спасибо за помощь...Не подскажите как решить эту проблему?
0
|
Ушел с форума
|
|
02.05.2013, 22:11 | 4 |
Выделите буфер памяти, например с помощью ExAllocatePoolWithTag, и скопируйте туда
содержимое буфера, который приходит в Dispatch routine. Адрес будет в системном диапазоне адресов, поэтому обращаться к нему можно будет независимо от контекста. И еще. Почему ANSI string ? При конвертировании в UNICODE_STRING будет использована текущая системная локаль. Это чревато проблемами, если имя процесса будет содержать символы, отличные от латиницы. Лучше везде использовать только Юникод.
0
|
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 44
|
||||||
03.05.2013, 12:55 [ТС] | 5 | |||||
Не могли бы привести пример как это сделать? А то я только начинаю разбираться с драйверами...Как я понял надо сделать так:
0
|
Ушел с форума
|
|
03.05.2013, 13:35 | 6 |
Сначала из неподкачиваемого пула выделяется буфер памяти. Но во второй строке указателю, который получил адрес этого буфера, присваивается новое значение. Копирования содержимого буфера здесь не происходит, а сам выделенный буфер безвозвратно теряется (утечка памяти). Я бы посоветовал пока отложить разработку драйверов и перечитать некоторые главы из книг по языку С, особенно те, что касаются работы с памятью и указателями.
0
|
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 44
|
||||||
03.05.2013, 15:55 [ТС] | 7 | |||||
0
|
Ушел с форума
|
||||||||||||||||
03.05.2013, 17:23 | 8 | |||||||||||||||
Уже лучше
Но помедитируйте над тем, что возвращает sizeof. SystemBuffer - это указатель. sizeof(указатель) вернет размер указателя, а не размер буфера, на который он указывает. На x86 это 4 байта, на x64 - 8. Вряд ли это то, что требуется в данном случае. Если здесь используется bufferred I/O, тогда размер входного буфера нужно брать из поля Parameters.DeviceIoControl.InputBufferLength в текущей позиции стека (которая определяется с помощью IoGetCurrentIrpStackLocation). Добавлено через 1 час 3 минуты Вам нужно где-то сохранить строку, которая передается драйверу в обработчике IRP_MJ_DEVICE_CONTROL. Можно завести глобальную переменную, но еще лучше использовать для этого структуру DEVICE_EXTENSION, пространство для которой резервируется при создании объекта устройства (см. параметры IoCreateDevice), а формат можно определить самому. Например:
Ваш обработчик IRP_MJ_DEVICE_CONTROL должен выглядеть примерно следующим образом:
И еще. Я не знаю архитектуру Вашего драйвера, но в реальных условиях обработчик IRP может вызываться параллельно, в разных потоках. Если архитектура предполагает, что IRP_MJ_DEVICE_CONTROL будет приходить однократно, то все будет в порядке, только не забудьте освободить выделенный буфер в обработчике IRP_MJ_CLOSE, иначе получите утечку такого ценного ресурса, как неподкачиваемый пул. Кстати, а почему в Вашем примере отсутствует обработчик IRP_MJ_CLEANUP ? Он тоже должен присутствовать. Если есть вероятность, что данный обработчик будет вызываться параллельно или более одного раза для одного объекта устройства, то Вы должны позаботиться о том, чтобы при выделении и установке в DEVICE_EXTENSION нового буфера со строкой старый удалялся, причем это должно быть потокобезопасно. Иначе будут сюрпризы, например один поток записал "свой" DEVICE_EXTENSION->pBuffer, а второй в это же время "свой" DEVICE_EXTENSION->BuffSize. Получится несогласованное состояние, которое может привести к падению системы. Добавлено через 2 минуты Кстати, вместо пула можете использовать RtlCreateUnicodeString.
0
|
0 / 0 / 0
Регистрация: 28.02.2013
Сообщений: 44
|
|
04.05.2013, 12:03 [ТС] | 9 |
Спасибо большое
Убежденный, Все получилось...Понял что у меня очень слабая теоретическая подготовка..Не могли бы посоветовать что почитать? Хочется связать свою будущую жизнь с системным программированием
0
|
Ушел с форума
|
|
04.05.2013, 12:33 | 10 |
Изучайте в первую очередь архитектуру Windows, лучше выбирать источники с
уклоном в низкоуровневое и системное программирование: Windows Internals ("Внутреннее устройство Microsoft Windows") от Руссиновича и Соломона. Издания, за исключением последнего, шестого, переведены на русский. "Системное программирование в Windows" (А. Побегайло) "Системное программирование в среде Windows" (Дж. Хардт). "Программирование на языке Visual C++" (Дж. Рихтер). По программированию драйверов лучшая книга на русском - "Использование Microsoft Windows Driver Model" (У. Они). Еще есть вот что: "Writing Windows WDM Device Driver" (C. Cant) "The Windows 2000 Device Driver Book" (A. Baker, J. Lozano) Еще в сети есть мануал под названием KmdTutRu, обязательно скачайте. Можете еще В. Солдатова прочесть ("Программирование драйверов Windows"). Первоисточники: MSDN, WHDC, OsrOnline, Intel и другие, там есть куча материала и всевозможных документов. Вот здесь я выкладывал сборку документации из последнего Windows Driver Kit (который для Windows 8): https://docs.google.com/file/d... sp=sharing Формат chm.
4
|
04.05.2013, 12:33 | |
04.05.2013, 12:33 | |
Помогаю со студенческими работами здесь
10
чему равняется сменная mon? Косинус 90 градусов равняется бреду Чему приближённо равняется высота дерева Чему равняется число 0.6 в троичной системе? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |