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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2  Все   Вниз
  Печать  
Автор Тема: Не удается выставить настройки проекта VdwLibs для Win32 WDM Free  (Прочитано 24976 раз)
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 Кб - загружено 989 раз.)
Записан
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 Кб - загружено 1039 раз.)
Записан
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 Кб - загружено 1914 раз.)
« Последнее редактирование: 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(), которая, как я понимаю осуществляет передачу данных. Только я не нашел описание этой функции и откуда ее берут, поэтому не понятно где в этой функции ссылка на буфер и как собственно внедрить сюда мой кольцевой буфер) Если, конечно, я вообще мыслю в том направлении))
Записан
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines