Bulat
Участник
Offline
|
|
« : 31-05-2010 04:48 » |
|
Пытаюсь скомпилировать библиотеку vdw_wdm.lib. Использую Compuware DriverStudio 3.2 и WINDDK 2600.1106. По умолчанию проект VdwLibs настроен на Win32 IA64 Free, я выбираю Win32 WDM Free, нажимаю окей и пытаюсь скомпилировать, при этом компилято упорно пишет: Compile and Link for IA64 и при этом еще ошибку выдает: cannot open input file 'objfre_wxp_IA64\ia64\k1394.obj'. Проект компилирую в VS6 с помощью встроенной панельки DS. Потом я повторно заглядываю в настройки проекта и там стоит вся таже настройка Win32 IA64 Free. Почему я не могу выбрать другую настройку? Заранее благодарен! P.S. Читал на вашем форуме темы, связанные с этим вопросом, но не встретил там обсуждения подобной проблемы (невозможность выбрать Win32 WDM Free)
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #1 : 31-05-2010 08:30 » |
|
из командной строки попробуйте... там по моему для этой цели батники были с ключами... или мейк-файл. в самой в папке нумеги.
PS а вообще забили бы вы на классы нумеги. они и раньше ерундой были, а теперь еще и умерли окончательно, лет пять-семь как назад. бесполезное занятие как бы....
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Bulat
Участник
Offline
|
|
« Ответ #2 : 31-05-2010 09:16 » |
|
Просто мне нужен нормальный USB-драйвер для моего девайса с двумя конечными точками и с буфером. А DriverStudio удобен тем, что там в диалоговом режиме скелет драйвера собирается. Во всех примерах, которые я видел по написанию драйвера используется или DS (Агуров) или же слишком простой драйвер с одной конечной точкой, к которому обращаются с помощью функции DeviceIoControl ( http://www.pcports.ru/articles/ddk2.php), используя при этом коды действия, а не спомощью функций read, writefile через отдельные хендлы для чтения и записи. Насколько я знаю, наиболее подходящий для меня драйвер - это bulkusb но я недостаточно хорошо понимаю его код и структуру - не знаю как реализовать там буфер. Может вы посоветует какой-нить готовый драйвер с буфером или же подробный пример по его созданию?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #3 : 31-05-2010 16:02 » |
|
сделайте то же самое... но на чистом си) там была такая опция. кстати а какая разница через read/write или через IOCTL? по мне так никакой.... в вашем случае по крайней мере.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Bulat
Участник
Offline
|
|
« Ответ #4 : 01-06-2010 04:11 » |
|
Если основываться на примере http://www.pcports.ru/articles/ddk2.php, то как там инициализировать 2 конечные точки, их направления и как определить размер буфера?) Просто пока это наиболее понятный для меня пример, хотелось бы от него оттолкнуться)
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #5 : 01-06-2010 08:04 » |
|
вы шутите? никак) приведенная вами ссылка не имеет никакого отношения к драйверу USB)))))))))))) это простейший драйвер общения с портами I/O. отталкиваться от него... проблематично)
возьмите либо DDK\6001.18001\src\usb\bulkusb\ либо генерите на DriverStudio 3.2 но только на чистом! Си, и разбирайте этот пример. рекомендую последнее.
или же вы хотите именно изучать драйвера и готовы потратить на это довольно большое количество времени?
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Bulat
Участник
Offline
|
|
« Ответ #6 : 01-06-2010 09:16 » |
|
Вы имеете в виду при создании проекта в Driver Wizard на шаге Project type поставить флажок "No Framework" в пункте "Chose a driver framework to use:"?
Добавлено через 1 час, 35 минут и 56 секунд: Создал проект с "No Framework". Скомпилировал в DDk2600.1106, при компиляции уже не требовал библиотеку vdw_wdm.lib) Драйвер установился и мой девайс определил, но не открывается) видимо драйвер еще не готов для работы?
|
|
« Последнее редактирование: 01-06-2010 10:52 от Bulat »
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #7 : 01-06-2010 20:25 » |
|
кто не открывается? там апликуха в комплекте идет. генерится одновременно с драйвером если галку поставить.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Bulat
Участник
Offline
|
|
« Ответ #8 : 02-06-2010 05:48 » |
|
Просто у Агурова прочитал, что после Driver Studio исходник драйвера надо дорабатывать, только у него не понятно, что именно там делать надо. А открывать драйвер я пытаюсь через свой проект через символическое имя: hDev = CreateFile( _T("\\\\.\\A5M1Device"), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0 ); Также, собирал драйвер, открывающийся через GUID, не помогает. На этапе выполнения ф-ии SetupDiEnumDeviceInterfaces останавливаюсь (если с гуидом работаю). Тоже самое было из bulkusb... Видимо драйвер как-то в ручную надо доделывать?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #9 : 02-06-2010 06:23 » |
|
попробуйте для начала запустить нумегой сгенереную апликуху. я давно я этим возился, но по моему сложностей у меня на этом этапе не было. если не заработает нумеговское приложение - посмотрим)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Bulat
Участник
Offline
|
|
« Ответ #10 : 02-06-2010 08:56 » |
|
По поводу работы с приложением, сгенерированным DS 3.2. Сначала скомпилировал файлы драйвера (в VS6), в результате появился файл с расширением sys, в папку с sys-файлом переписал inf-файл и установил драйвер. Девайс определился, появился в диспетчере устройств в разделе контроллеров USB. Далее пытаюсь запустить само приложение, сгенерированной DS для работы с драйвером. Сначало скомпилировал приложение в результате чего в папке с приложением появился файл A5M1App.exe, путь к которому я указал в свойствах дебаггера этого приложения (см. скриншоты), далее жму F5 и вылазит сообщение: A5M1App.exe does not contain debugging information. Далее жму ОК и выходит следующее сообщение: Could not execute: Bad executable format. Вот собственно на этом я и останавливаюсь) P.S.Прикрепил архив этапами создания драйвера и настройкой приложения.
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #11 : 02-06-2010 09:27 » |
|
Что-то подобное про VS было буквально недавно на форуме
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #12 : 02-06-2010 15:38 » |
|
у вас в настройках приложения в опциях линкера стоит флаг /dll посмотрите вкладку general - и измените в поле "configuration type" тип проекта с dll на exe)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Bulat
Участник
Offline
|
|
« Ответ #13 : 03-06-2010 05:20 » |
|
1.У меня в опциях линкера стоит флаг "Ignore all default libraries" 2.Во вкладке General у меня нет поля "configuration type" (см. прикрепленный файл) и нигде не смог найти его. Все это я смотрю в настройка проекта Project->Settings VS6.
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #14 : 03-06-2010 13:42 » |
|
1. это не при чем. 2. я давно VS6 видел... вкладка линкер->внизу RichEdit с подписью с General Options. попробуйте удалить флаг /dll ....или выложите файл vcproj проекта. аналогичная проблема была https://forum.shelek.ru/index.php/topic,23240.msg226008.html#msg226008чего именно там править, я честно говоря на вскидку плохо помню.
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Bulat
Участник
Offline
|
|
« Ответ #15 : 04-06-2010 05:06 » |
|
Что-то я не могу найти те поля, что вы мне описываете во вкладке линкера. Прикрепляю архив с проектом
|
A5M1.rar (108.66 Кб - загружено 2010 раз.)
|
« Последнее редактирование: 04-06-2010 07:01 от Алексей1153++ »
|
Записан
|
|
|
|
Bulat
Участник
Offline
|
|
« Ответ #16 : 04-06-2010 11:45 » |
|
я решил не мучиться с приложением, сгенерированным DS, а попытался открыть с помощью своего приложения, написанного в VS8(2005). Собрал другой драйвер, который открывается с помощью символического имени: TCHAR devNameOut[32]; strcpy( devNameOut, _T("\\\\.\\A5M2Device") ); strcat( devNameOut, _T( "\\PIPE01" ) ); TCHAR devNameIn[32]; strcpy( devNameIn, _T("\\\\.\\A5M2Device") ); strcat( devNameIn, _T( "\\PIPE00" ) ); PipeOut = CreateFile(devNameOut, GENERIC_WRITE, FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL,//FILE_FLAG_OVERLAPPED, NULL); //проверка результата if (PipeOut != INVALID_HANDLE_VALUE) init = 1; else init = 0;
PipeIn = CreateFile(devNameIn, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, NULL,//FILE_FLAG_OVERLAPPED, NULL); //проверка результата if (PipeIn != INVALID_HANDLE_VALUE) init = 1; else init = 0;
Драйвер открывается, создаются два хендла - для чтения и записи без ошибок. потом пытаюсь записать один байт Success = WriteFile(PipeOut, &buf, 1, &nBytes, NULL); //Синхронный режим записи
WriteFile возвращает 0 При создании драйвера я поставил галочку IRP_MJ_INTERNAL_DEVICE_CONTROL - это же не обязательно, если я буду пользоваться только функциями Writefile и Readfile? Из-за чего может не выполняться ф-ия writefile?
|
|
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #17 : 04-06-2010 14:27 » |
|
При создании драйвера я поставил галочку IRP_MJ_INTERNAL_DEVICE_CONTROL - это же не обязательно, если я буду пользоваться только функциями Writefile и Readfile?
Необязательно. Из-за чего может не выполняться ф-ия writefile?
Дык покажите как минимум обработку IRP_MJ_WRITE
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #18 : 04-06-2010 14:56 » |
|
resource, так весь проект выложен жеш) ЗЫ и обработчик Write там пустой. то есть там только заготовка. отвечает STATUS_SUCCESS только на запросы с нулевой длинной) и кстати IOCTRL тоже пустой
Bulat, те скрины что вы выкладывали... повторите шаг номер 7. только укажите что вы обслуживать собираетесь)
|
|
« Последнее редактирование: 04-06-2010 15:05 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #19 : 04-06-2010 15:03 » |
|
Извиняюсь, затупил. Думал почему-то, что это только юзермод. Наверное по своей привычке (я то в студии компилю только юзермодное).
ЗЫ кстати после того как АПИ функция возвращает статус ошибки, неплохо бы вызывать GetLastError. Очень часто это снимает вопросы.
|
|
« Последнее редактирование: 04-06-2010 15:07 от resource »
|
Записан
|
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #20 : 04-06-2010 15:12 » |
|
Глянул код. Так вот, толи я продолжаю тупить (пятница день тяжелый ) ), толи вся функция состоит в этом status = STATUS_NOT_IMPLEMENTED; Irp->IoStatus.Information = 0; Irp->IoStatus.Status = status; IoCompleteRequest (Irp, IO_NO_INCREMENT);
Так вот если я смотрю куда надо, то..... это какбэ болванка для функции.
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #21 : 04-06-2010 15:17 » |
|
Bulat, хм. проверить не могу, поэтому попробуйте у себя файл "A5M1App.dsp" изменить строку (там их две, для релиза и для дебага) # ADD LINK32 /nologo /dll /machine:I386 на # ADD LINK32 /nologo /subsystem:windows /machine:I386
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Bulat
Участник
Offline
|
|
« Ответ #22 : 05-06-2010 09:16 » |
|
Ochkarik, указав на седьмом шаге в полях Resource конечные точки, через которые нужно производить чтение и запись мое приложение с моим драйвером и с моим устройством окончательно заработало)) Спасибо Вам за это большое) Но, я не избавился от той проблемы, из-за которой и взялся за написание драйвера. Дело в том, что у меня был драйвер, разработанный ранее другим человеком в том же DS 3.2, недостаток этого драйвера заключался в том, что при работе на медленых машинах (типа PIV) скорость передачи данных моему девайсу, и с скорость чтения значительно снижаются (с 13900 до 11900 Байт\с по сравнению с Core 2Duo). Соответственно, на медленных машинах пропуски данных растут по экспоненте. Насколько я понимаю, я это зависит от драйвера, а точнее от наличия или же отсутствя буфера на запись и чтение в драйвере. Поэтому на шаге 7 я и выбрал в поле Buffer access метод "Buffered", а не "Direct", в надежде, что эта опция сформирует буфер в драйвере)) Но при этом, если в поле Resources выбраны конечные точки, то при выборе "Buffered" выскакивает сообщение "Only DIRECT method is alowed to be used with resource" и, соответственно, метод "Buffered" выбирается только при выборе в полях Resources "None". 1. Для чего тогда нужен метод "Buffered"? 2. Как можно самостоятельно добавить буфер в исходник драйвера, может есть примеры?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #23 : 05-06-2010 17:13 » |
|
1 этот метод для промежуточного буферизирования данных поступающих в/от драйвера по запросам IRP от приложения. используется чтобы голова не болела о своевременном выделении и освобождении памяти... посмотрите в MSDN там три метода было.
2. ммм... с этим немного сложнее. если у вас запись - то вам необходимо реализовать отправку нескольких пакетов URB в драйвере (они там по 2-4 кб помоему максимум) . из приложения отправляете сразу мегабайт(например)а в драйвере пытаетесь его побить на маленькие пакеты и отправлять по мере готовности.
если у вас потоковое чтение - тоже есть варинаты. либо по одному запросу чтения вы в драйвере делаете несколько(10-1000 запросов чтения) и возвращаете все приложению "за раз", либо делаете кольцевой буфер. (кольцевой буфер тут несколько раз уже обсуждался -поищите)
примеры... собственно какие тут примеры.. представьте, как бы вы решали эту задачу в обычном приложении с двумя нитями) подход точно такой же) функции только немного другие, но это мелочи)
основная потеря производительности происходит из за множества мелких запросов - вы теряете на синхронизации каждого. либо попробуйте использовать в приложении OVERLAPPED когда отправляете запрос чтения. отправляйте сразу несколько не дожидаясь их завершения... хм. правда драйвер должен это поддержать....
|
|
« Последнее редактирование: 05-06-2010 17:16 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #24 : 05-06-2010 17:57 » |
|
если у вас потоковое чтение - тоже есть варинаты. либо по одному запросу чтения вы в драйвере делаете несколько(10-1000 запросов чтения) и возвращаете все приложению "за раз", либо делаете кольцевой буфер. (кольцевой буфер тут несколько раз уже обсуждался -поищите)
Вот хотелось бы уточнить минусы обоих методов. В случае кольцевого буфера проблема в том, что нужно блокировать буфер целиком при чтении/записи из него/в него. Множественные порции данных связанные в список лишены этого недостатка, т.к. список блокируется только для извлечения из него элементов, а это весьма быстрая операция по сравнению с чтением всего объема свежих данных. Но тут есть другой минус, надо каждый раз, при получении данных, выделять память. Это конечно неприятный момент с одной стороны, но вот мне почему-то кажется (но не более того), что это всё таки быстрее чем чтение буфера размером хотя бы в несколько кило (не забываем, что буфер блокирован и в это время в него нельзя будет писать новые данные).
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #25 : 05-06-2010 19:24 » |
|
resource, необязательно. блокировка данных в этом случае кольцевого буфера может быть осуществлена одной переменной) переменная содержит число необработанных данных в буфере. драйвер проверяет и увеличивает, приложение проверяет и уменьшает. операция атомарна, поддержана на уровне архитектуры процессора. более эффективного (в плане средней скорости) способа - не существует. затраты минимальны. подчеркиваю - в данном случае, то есть случай однонаправленной передачи. размер буфера выбирается с запасом. это конечно минус но...)
а выделение памяти можно в случае списка можно немного выиграть используя LookasideList
PS хотя... вариантов всегда много) главное выбрать под задачу - что больше подходит)
|
|
« Последнее редактирование: 05-06-2010 19:42 от Ochkarik »
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #26 : 05-06-2010 19:55 » |
|
блокировка данных в этом случае кольцевого буфера может быть осуществлена одной переменной) переменная содержит число необработанных данных в буфере. драйвер проверяет и увеличивает, приложение проверяет и уменьшает. операция атомарна, поддержана на уровне архитектуры процессора.
Я как-то не слишком себе это все представляю. Уменьшать и увеличивать это понятно, но надо же чтобы, к примеру, когда приложение читает данные из общего буфера, драйвер не переписал эту часть, в момент когда она читается. Ну как я думаю.
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #27 : 05-06-2010 20:05 » |
|
resource, и что я этого необходимо?
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
resource
Молодой специалист
Offline
Пол:
|
|
« Ответ #28 : 05-06-2010 23:03 » |
|
Сложно сказать, смотря какая задача, какие данные. Иногда потерянные данные это лучше, чем "бредовые" данные. Непростой вопрос. Думаю зависит, от конкретной задачи (очень индивидуально). Если данные - сплошной поток, то общий буфер наверное будет лучше. Если данные структурированы, то будучи один раз затертыми, структура может потеряться навсегда.
|
|
|
Записан
|
|
|
|
Bulat
Участник
Offline
|
|
« Ответ #29 : 07-06-2010 12:02 » |
|
1. Получается с помощью Driver Wizard нельзя дополнить драйвер буфером для передаваемых через него данных? Я так понял там буфер и очередь только для запросов устанавливается? 2. В файле usb.c моего проекта ( https://forum.shelek.ru/index.php?action=dlattach;topic=24622.0;attach=4768) , в функции A5M2Pipe0Io() используется функция UsbBuildInterruptOrBulkTransferRequest(), которая, как я понимаю осуществляет передачу данных. Только я не нашел описание этой функции и откуда ее берут, поэтому не понятно где в этой функции ссылка на буфер и как собственно внедрить сюда мой кольцевой буфер) Если, конечно, я вообще мыслю в том направлении))
|
|
|
Записан
|
|
|
|
|