Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 [Все]   Вниз
  Печать  
Автор Тема: Не удается выставить настройки проекта VdwLibs для Win32 WDM Free  (Прочитано 25198 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Bulat
Участник

ru
Offline 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
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 31-05-2010 08:30 » 

из командной строки попробуйте... там по моему для этой цели батники были с ключами... или мейк-файл. в самой в папке нумеги.

PS а вообще забили бы вы на классы нумеги. они и раньше ерундой были, а теперь еще и умерли окончательно, лет пять-семь как назад. бесполезное занятие как бы....
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Bulat
Участник

ru
Offline Offline

« Ответ #2 : 31-05-2010 09:16 » 

Просто мне нужен  нормальный USB-драйвер для моего девайса с двумя конечными точками и с буфером. А DriverStudio удобен тем, что там в диалоговом режиме скелет драйвера собирается. Во всех примерах, которые я видел по написанию драйвера  используется или DS (Агуров) или же слишком простой драйвер с одной конечной точкой, к которому обращаются с помощью функции DeviceIoControl (http://www.pcports.ru/articles/ddk2.php), используя при этом коды действия, а не спомощью функций read, writefile через отдельные хендлы для чтения и записи. Насколько я знаю, наиболее подходящий для меня драйвер - это bulkusb но я недостаточно хорошо понимаю его код и структуру - не знаю как реализовать там буфер. Может вы посоветует какой-нить готовый драйвер с буфером или же подробный пример по его созданию?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 31-05-2010 16:02 » 

сделайте то же самое... но на чистом си) там была такая опция.
кстати а какая разница через read/write или через IOCTL? по мне так никакой....
в вашем случае по крайней мере.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Bulat
Участник

ru
Offline Offline

« Ответ #4 : 01-06-2010 04:11 » 

Если основываться на примере http://www.pcports.ru/articles/ddk2.php, то как там инициализировать 2 конечные точки, их направления и как определить размер буфера?) Просто пока это наиболее понятный для меня пример, хотелось бы от него оттолкнуться)
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 01-06-2010 08:04 » 

вы шутите? никак) приведенная вами ссылка не имеет никакого отношения к драйверу USB)))))))))))) это простейший драйвер общения с портами I/O. отталкиваться от него... проблематично)

возьмите либо DDK\6001.18001\src\usb\bulkusb\
либо генерите на DriverStudio 3.2 но только на чистом! Си, и разбирайте этот пример.
рекомендую последнее.

или же вы хотите именно изучать драйвера и готовы потратить на это довольно большое количество времени?
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Bulat
Участник

ru
Offline 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
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 01-06-2010 20:25 » 

кто не открывается?  Быть такого не может
там апликуха в комплекте идет. генерится одновременно с драйвером если галку поставить.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Bulat
Участник

ru
Offline 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
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 02-06-2010 06:23 » 

попробуйте для начала запустить  нумегой сгенереную апликуху. я давно я этим возился, но по моему сложностей у меня на этом этапе не было.
если не заработает нумеговское приложение - посмотрим)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Bulat
Участник

ru
Offline 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.Прикрепил архив этапами создания драйвера и настройкой приложения.

* скриншоты.zip (506.53 Кб - загружено 996 раз.)
Записан
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 02-06-2010 09:27 » 

Что-то подобное про VS было буквально недавно на форуме
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 02-06-2010 15:38 » 

у вас в настройках приложения в опциях линкера стоит флаг /dll
посмотрите вкладку general - и измените в поле "configuration type" тип проекта с dll на exe)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Bulat
Участник

ru
Offline Offline

« Ответ #13 : 03-06-2010 05:20 » 

1.У меня в опциях линкера стоит флаг "Ignore all default libraries"
2.Во вкладке General у меня нет поля "configuration type" (см. прикрепленный файл) и нигде не смог найти его.
Все это я смотрю в настройка проекта Project->Settings VS6.

* Настройки приложения_4.JPG (93.38 Кб - загружено 1045 раз.)
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #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 уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Bulat
Участник

ru
Offline Offline

« Ответ #15 : 04-06-2010 05:06 » 

Что-то я не могу найти те поля, что вы мне описываете во вкладке линкера. Прикрепляю архив с проектом

* A5M1.rar (108.66 Кб - загружено 1928 раз.)
« Последнее редактирование: 04-06-2010 07:01 от Алексей1153++ » Записан
Bulat
Участник

ru
Offline 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
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #17 : 04-06-2010 14:27 » 

Цитата: Bulat
При создании драйвера я поставил галочку IRP_MJ_INTERNAL_DEVICE_CONTROL - это же не обязательно, если я буду пользоваться только функциями Writefile и Readfile?

Необязательно.

Цитата: Bulat
Из-за чего может не выполняться ф-ия writefile?

Дык покажите как минимум обработку IRP_MJ_WRITE
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #18 : 04-06-2010 14:56 » 

resource, так весь проект выложен жеш)
ЗЫ и обработчик Write там пустой. то есть там только заготовка. отвечает STATUS_SUCCESS только на запросы с нулевой длинной)
и кстати IOCTRL тоже пустой

Bulat, те скрины  что вы выкладывали... повторите шаг номер 7.
только укажите что вы обслуживать собираетесь)
« Последнее редактирование: 04-06-2010 15:05 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 04-06-2010 15:03 » 

Извиняюсь, затупил. Думал почему-то, что это только юзермод. Наверное по своей привычке (я то в студии компилю только юзермодное).

ЗЫ кстати после того как АПИ функция возвращает статус ошибки, неплохо бы вызывать GetLastError. Очень часто это снимает вопросы.
« Последнее редактирование: 04-06-2010 15:07 от resource » Записан
resource
Молодой специалист

ru
Offline 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
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #21 : 04-06-2010 15:17 » 

Bulat, хм. проверить не могу, поэтому попробуйте у себя
файл "A5M1App.dsp"
изменить строку (там их две, для релиза и для дебага)
# ADD LINK32 /nologo /dll /machine:I386
на
# ADD LINK32 /nologo /subsystem:windows /machine:I386
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Bulat
Участник

ru
Offline 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
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #23 : 05-06-2010 17:13 » 

1 этот метод для промежуточного буферизирования данных поступающих в/от драйвера по запросам IRP от приложения. используется чтобы голова не болела о своевременном выделении и освобождении памяти... посмотрите в MSDN там три метода было.

2. ммм... с этим немного сложнее.
если у вас запись - то вам необходимо реализовать отправку нескольких пакетов URB в драйвере (они там по 2-4 кб помоему максимум) . из приложения отправляете сразу мегабайт(например)а в драйвере пытаетесь его побить на маленькие пакеты и отправлять по мере готовности.

если у вас потоковое чтение - тоже есть варинаты. либо по одному запросу чтения вы в драйвере делаете несколько(10-1000 запросов чтения) и возвращаете все приложению "за раз", либо делаете кольцевой буфер. (кольцевой буфер тут несколько раз уже обсуждался -поищите)

примеры... собственно какие тут примеры.. представьте, как бы вы решали эту задачу в обычном приложении с двумя нитями) подход точно такой же) функции только немного другие, но это мелочи)

основная потеря производительности происходит из за множества мелких запросов - вы теряете на синхронизации каждого. либо попробуйте использовать в приложении OVERLAPPED когда отправляете запрос чтения. отправляйте сразу несколько не дожидаясь их завершения... хм. правда драйвер должен это поддержать....
« Последнее редактирование: 05-06-2010 17:16 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #24 : 05-06-2010 17:57 » 

Цитата: Ochkarik
если у вас потоковое чтение - тоже есть варинаты. либо по одному запросу чтения вы в драйвере делаете несколько(10-1000 запросов чтения) и возвращаете все приложению "за раз", либо делаете кольцевой буфер. (кольцевой буфер тут несколько раз уже обсуждался -поищите)

Вот хотелось бы уточнить минусы обоих методов. В случае кольцевого буфера проблема в том, что нужно блокировать буфер целиком при чтении/записи из него/в него. Множественные порции данных связанные в список лишены этого недостатка, т.к. список блокируется только для извлечения из него элементов, а это весьма быстрая операция по сравнению с чтением всего объема свежих данных. Но тут есть другой минус, надо каждый раз, при получении данных, выделять память. Это конечно неприятный момент с одной стороны, но вот мне почему-то кажется (но не более того), что это всё таки быстрее чем чтение буфера размером хотя бы в несколько кило (не забываем, что буфер блокирован и в это время в него нельзя будет писать новые данные).
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #25 : 05-06-2010 19:24 » 

resource, необязательно.  блокировка данных в этом случае кольцевого буфера может быть осуществлена одной переменной) переменная содержит число необработанных данных в буфере. драйвер проверяет и увеличивает, приложение проверяет и уменьшает. операция атомарна, поддержана на уровне архитектуры процессора.
более эффективного (в плане средней скорости) способа - не существует. затраты минимальны. подчеркиваю - в данном случае, то есть случай однонаправленной передачи. размер буфера выбирается с запасом. это конечно минус но...)

а выделение памяти можно в случае списка можно немного выиграть используя LookasideList

PS хотя... вариантов всегда много) главное выбрать под задачу - что больше подходит)
« Последнее редактирование: 05-06-2010 19:42 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #26 : 05-06-2010 19:55 » 

Цитата: Ochkarik
блокировка данных в этом случае кольцевого буфера может быть осуществлена одной переменной) переменная содержит число необработанных данных в буфере. драйвер проверяет и увеличивает, приложение проверяет и уменьшает. операция атомарна, поддержана на уровне архитектуры процессора.

Я как-то не слишком себе это все представляю. Уменьшать и увеличивать это понятно, но надо же чтобы, к примеру, когда приложение читает данные из общего буфера, драйвер не переписал эту часть, в момент когда она читается. Ну как я думаю.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #27 : 05-06-2010 20:05 » 

resource,  и что я этого  необходимо? Ага
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
resource
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #28 : 05-06-2010 23:03 » 

Сложно сказать, смотря какая задача, какие данные. Иногда потерянные данные это лучше, чем "бредовые" данные. Непростой вопрос. Думаю зависит, от конкретной задачи (очень индивидуально). Если данные - сплошной поток, то общий буфер наверное будет лучше. Если данные структурированы, то будучи один раз затертыми, структура может потеряться навсегда.
Записан
Bulat
Участник

ru
Offline 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(), которая, как я понимаю осуществляет передачу данных. Только я не нашел описание этой функции и откуда ее берут, поэтому не понятно где в этой функции ссылка на буфер и как собственно внедрить сюда мой кольцевой буфер) Если, конечно, я вообще мыслю в том направлении))
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #30 : 07-06-2010 19:10 » 

1. да
2. http://msdn.microsoft.com/en-us/library/ff538953(VS.85).aspx
в эту функцию целиком буфер внедрять не надо. в нее надо передавать кусочек этого вашего буфера)
допустим вы хотите читать. грубо говоря, для этого вам необходимо завести в драйвере нитку, в которой вы посылаете запросы чтения при помощи этой функции. а по возврату из нее то что она прочитала из железки - копировать в ваш буфер. чтобы потом бОльшими кусками вернуть все это приложению.

хм. а вобще для простоты можно попробовать (для начала) просто тупо повторять на один запрос от приложения допустим десять запросов чтения железки внутри драйвера) от лагов вы до конца не избавитесь, но будет немного понятнее)
« Последнее редактирование: 07-06-2010 19:18 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Bulat
Участник

ru
Offline Offline

« Ответ #31 : 14-06-2010 07:51 » 

Ochkarik, в моем случае используется буфер MDL.
Код:
   UsbBuildInterruptOrBulkTransferRequest(
            urb,
            sizeof(struct _URB_BULK_OR_INTERRUPT_TRANSFER),
            PipeInformation->PipeHandle,
            NULL,
            mdl,
            transferLength,
            USBD_TRANSFER_DIRECTION_IN | USBD_SHORT_TRANSFER_OK,
            NULL
            );
То есть, по этому запросу данные из конечной точки перепичываются в mdl. А уже оттуда по запросу IRP_MJ_READ (с помощью функции A5M2ReadDispatch()) данные переписываются в буфер моего приложения. И вот тут мне непонятно как происходит обращение к MDL (я его не нашел)?
 Таким образом, я не знаю как прикрутить свой буфер  к этим функциям((
Я думал так, нужно самостоятельно в свой буфер собирать данные из буфера MDL, а затем, при его наполнении, разрешать функции A5M2ReadDispatch() обращаться к моему буферу. Поэтому меня и интересовал пример использования кольцевого буфера именно в драйвере)
Записан
Страниц: 1 2 [Все]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines