Сейчас на форуме: rmn, Magister Yoda, vasilevradislav, tyns777, zombi-vadim (+5 невидимых) |
![]() |
eXeL@B —› Программирование —› Работа с занятыми файлами. |
Посл.ответ | Сообщение |
|
Создано: 05 сентября 2008 14:21 · Личное сообщение · #1 ![]() Исаев сделал пробу на своем коме с другой прогой , она через Code:
копирует файл тоже, странно то что файл у меня скопировался , но на другом компе скопировался файл с 0 байтами. У кого какое мнение ? ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 05 сентября 2008 14:30 · Личное сообщение · #2 mak пишет: Текстовый файл , лежит в скрытом режиме Этот текстовый файл отрывается следующим образом: Code:
тут наверное всё что нужно знать для того, чтобы получить к нему доступ ----- z+Dw7uLu5+jqLCDq7vLu8PvpIPHs7uMh ![]() |
|
Создано: 05 сентября 2008 18:14 · Личное сообщение · #3 |
|
Создано: 05 сентября 2008 20:40 · Поправил: mak · Личное сообщение · #4 ![]() Code:
addr usDeviceName эта переменная дается с ехе программы через иоктл , я точно не уверен но наверное причина в том что поданная сточка не соотвествует любимому формату драйверов.После попадания в драйвер делается RtlInitUnicodeString где addr usDeviceName это уникод строка а последний праметр это адрес нахождения пути до файла которого надо копировать. Поэтому дровина отрабатывает создавая вариант пустого файла но не записывающего данные ибо путь то не был верен. Если я пишу строку Code:
в месте InitializeObjectAttributes addr oa,$CCOUNTED_UNICODE_STRING("\SystemRoot"),OBJ_CASE_INSENSITIVE + OBJ_KERNEL_HANDLE, NULL, NULL то тогда копируется все на ура. Это означает что я неправильно подаю данные в драйвер или чего то еще не хватает. В приложении скомпиленная прога с дровиной. В папке сам должнасоздать копию сам с именем ver. То есть это вариант без $CCOUNTED_UNICODE_STRING. Вопрос ? Как передать правильно строку в драйвер в понятном для него формате динамически , разблокируемый файл может быть каждый раз разный. ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 05 сентября 2008 20:46 · Личное сообщение · #5 файл ![]() ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 05 сентября 2008 21:03 · Личное сообщение · #6 Вот еще забыл момент с буфером Code:
в SystemBuffer будет лежать моя строка или адрес строки которые пришли с приложения? ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 05 сентября 2008 21:34 · Личное сообщение · #7 |
|
Создано: 05 сентября 2008 22:56 · Поправил: MACKLIA · Личное сообщение · #8 |
|
Создано: 05 сентября 2008 22:57 · Личное сообщение · #9 Archer спсб хороший метод , все верно в функцию идет адрес файла которого потом проходит RtlInitUnicodeString переводит и потом даже крит файл открывает все супер , а падение было вот тут Code:
на коде invoke ExAllocatePool, PagedPool, cb вернуло 0 ну а потом естественно пишет в файл 0 байт но создает его . Самое интеерсное что при строке $CCOUNTED_UNICODE_STRING работает а с динамическим адресом не работает. Какая может быть разница ? ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 05 сентября 2008 23:01 · Личное сообщение · #10 MACKLIA не не , там ничего не киляет , у меня пока не было такого с этим кодом что тут. Было синий экран с другой версией , но там ясно было не так адреса выделяллись. Тут же я проверял с $CCOUNTED_UNICODE_STRING копирует , а без нее просто пустой файл создает. Извиняюсь за такое последствие ![]() ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 05 сентября 2008 23:08 · Личное сообщение · #11 |
|
Создано: 05 сентября 2008 23:25 · Поправил: mak · Личное сообщение · #12 =) нашел ошибку всетаки точную , память не выделяется потому что имя файла подается не правильно ,в IOCTL передается строка адрес файла , далее в драйвере берется буфер проверил в софтайсе , с правильным адресом файла , но адрес не сформирован как строка DW нужная для драйвера , в свою очередь я видел в дровине работы с реестром , там адреса не имеют формата DWно делают RtlInitUnicodeString. В итоге ошибка тут , как ее решить честно не знаю .. Code:
где uszDeviceName адрес на буфер с адресом файла в виде например C:\windows\xxx\ а далее в InitializeObjectAttributes параметр addr usDeviceName идет уже готовая уникод строка , но как получается как раз она и неверная. ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 06 сентября 2008 12:28 · Личное сообщение · #13 |
|
Создано: 06 сентября 2008 17:19 · Поправил: mak · Личное сообщение · #14 имя файла обыкновенный путь вида С:\tmpDrv.sys требуется вот что .. Code:
Перевести строку динамически drvname в drvnameW , естественно оба буфера будут пустые до перевода и поиска файла P.S это уже сделал , оказалось просто Code:
теперь у драйвера есть уникод строка .... ноооо опять же есть ошибка , вариант такой по моему мнению я 2слэша не сделал в пути вместо одного. Значит после получения пути нужно парсить и вставлять второй флэш ?! Может есть апи упрощающая действие ? ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 08 сентября 2008 10:25 · Поправил: requiem4 · Личное сообщение · #15 |
|
Создано: 08 сентября 2008 10:53 · Поправил: LazzY · Личное сообщение · #16 |
|
Создано: 08 сентября 2008 13:13 · Личное сообщение · #17 |
|
Создано: 08 сентября 2008 22:27 · Личное сообщение · #18 ![]() Code:
сработает ли InitializeObjectAttributes , когда подаешь динамически строку ? в edx Адрес правильной строки в юникод формате , но при ZwCreateFile в еах с0000033 ошибка А вот ее код STATUS_OBJECT_NAME_INVALID = $C0000033 , значит ошибка в InitializeObjectAttributes. Проверял правильность адресов в софтайсе поставив инт3 в код драйвера перед Пуш едх и колл адрес где в едх адрес уникод строки. ![]() ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 09 сентября 2008 08:48 · Личное сообщение · #19 InitializeObjectAttributes это очень простенькая функция #define InitializeObjectAttributes(p,n,a,r,s) do { (p)->Length = sizeof(OBJECT_ATTRIBUTES); (p)->RootDirectory = r; (p)->Attributes = a; (p)->ObjectName = n; (p)->SecurityDescriptor = s; (p)->SecurityQualityOfService = NULL; } while (0) Непонятно в последнем примере что именно ты пытаешься открыть: файл или драйвер? Если драйвер, то код будет таким RtlInitUnicodeString(&uDriver,L"\\DosDevices\\DriverName"); InitializeObjectAttributes(&ObjectAttributes, &uDriver, OBJ_CASE_INSENSITIVE|OBJ_KERNEL_HANDLE , NULL, NULL); Скидывай исходник или кусок его, чтобы вопросов было меньше. ![]() |
|
Создано: 09 сентября 2008 11:47 · Поправил: mak · Личное сообщение · #20 Как заполняется эта структура? есть пример ? Я писал уже что не играет роли драйвер это или файл , в приложенной проге идет работа только с файлом соответсвенно и строка готовится к иоктл для файла а не драйвера. Если есть разница заполнения InitializeObjectAttributes с драйверами то какая ? По выше приведенному коду я показл участок где макрос вроде бы не выполняет своих функций , как можно инициализировать то чего нету. С другой стороны в коде дровины инициализация присуствует. Но судя по всему она неверная. PS . я щас побегал по даресам структур , и понял что строки моей передаваемой уже подавно , нету ![]() mov edx, [esi].AssociatedIrp.SystemBuffer assume edx:ptr DWORD далее идет invoke RtlInitUnicodeString, addr usDeviceName,edx RtlInitUnicodeString вроде заполняет структуру в usDeviceName где последний параметр должен быть адрес на строку мою, но во первых там нету почему то адреса а во вторых по адресу в едх который я запомнил уже нет более моей строки , а если в структуру пишется только указатель на едх это значит что кто то стер мою строку и это RtlInitUnicodeString ! далее InitializeObjectAttributes addr oa,addr usDeviceName, OBJ_CASE_INSENSITIVE + OBJ_KERNEL_HANDLE, NULL, NULL где опять же лажовый адрес без имени моего и звКритфайл говорит неправильно емя. Странно .. А вот прототипы структур Code:
----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 09 сентября 2008 13:43 · Личное сообщение · #21 > Если есть разница заполнения InitializeObjectAttributes с драйверами то какая ? Сравни мои 2 поста и заметишь. > код таким не будет , потому что строка в ртлинит неизвестная на момент инициализации Какая разница то? RtlInitUnicodeString(&str,buffer); Наверное ты запутался в указателях на выделяемую память. можно тебе поможет с опцией выделением памяти RtlAnsiStringToUnicodeString Но лучше показывай текущее свое творение ![]() |
![]() |
eXeL@B —› Программирование —› Работа с занятыми файлами. |