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

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

il
Offline Offline
Пол: Мужской
Бодрый птах


PCI
« Ответ #30 : 22-07-2003 18:23 » 

Ок - просто неудобно читать потом... а стирать каждый может свои сообщения.
Но это уже злостный оффтоп.
Записан

А птичку нашу прошу не обижать!!!
Juggernaut
Гость
PCI
« Ответ #31 : 23-07-2003 04:04 » 

Оффтоп оффтопом, но ничего кроме как изменить сообщение я не могу. Хотя хинт показывает что кнопка правка может и удалить сообщение. А вообще в форумах phpbb есть ещё и кнопочка "Удалить" Здесь я её не обнаружил. Так что как здесь удалять я не имею понятия.

PS: Это сообщение после прочтения можно снести. Однако кнопка и  добавлась. Видать удалять можно только тогда когда твое сообщение не забито другим.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


PCI
« Ответ #32 : 23-07-2003 07:58 » 

Глупости - кнопка крестик стоит всегда справаот кнопки правка...
Записан

А птичку нашу прошу не обижать!!!
Juggernaut
Гость
PCI
« Ответ #33 : 23-07-2003 11:48 » 

Те что скриншот кинуть? Ни хрена у меня не стоит ...  никакого креста.

Ладно замяли. Я тут вот что нашел:
http://asm.udm.ru/platforms/windows/wdm/chapter3.htm
Это по идее глава 3 от первого издания книги Walter Oney. На русском языке. Я бы сказал поточнее, но у меня не может загрузиться страница целиком. Такой уж интернет. Но содержаниее имеется полностью. Думаю это вообще книжка целиком. Думаю тебе эта ссылка пригодится как и многим другим, кто интересуется дровами.

Ну и вопрос.
Как выполнить запрос в драйвере и вернуть нечто приложению.
Например у меня в самом драйвере по DeviceID и VendorID ищется наличие PCI карты. Карта эти значения возвращает. Так вот такой вопрос.
Естиь функция
BOOL FindPCI(ULONG Vend, ULONG Device).
Из приложения я вызываю эту функцию через DeviceIoControl
..........
#define      IO_FIND_DEVICE            (ULONG) CTL_CODE(FILE_DEVICE_DOCREADER_DRIVER, 0x806, METHOD_NEITHER, FILE_ANY_ACCESS)
......
BOOL MainWindow::OnDeviceExists(ULONG dVendorID, ULONG dDeviceID)
{
   DWORD dwReturn;
   ULONG DeviceInfo=MAKELONG(dVendorID,dDeviceID);
   void* bExists;
   if(m_hDevice)
   {
      DeviceIoControl(
         m_hDevice,
         IO_FIND_DEVICE,
         (void*)DeviceInfo,
         sizeof(DeviceInfo),
         &bExists,
         sizeof(bExists),
         &dwReturn,
         NULL);

   }
   return Не понял??;
}
....
Вот. Что должен сделать драйвер вутри функции обработки IO_FIND_DEVICE
NTSTATUS DocReader_IoControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp )
{
   NTSTATUS               status = STATUS_SUCCESS;
   ULONG                  controlCode;
   PIO_STACK_LOCATION         irpStack;
   HANDLE                  hEvent;
   OBJECT_HANDLE_INFORMATION   objHandleInfo;
   LONG*                  outBuf;
   DWORD dInfo=0;
   irpStack = IoGetCurrentIrpStackLocation(Irp);
   controlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;
   
   switch(controlCode)
   {
.....
   case IO_FIND_DEVICE:
      DocReader_FindDevice(Не понялНе понялНе понялНе понялНе понял);
   break;
   default:
      break;
   }

   Irp->IoStatus.Status = STATUS_SUCCESS;
   Irp->IoStatus.Information = 0;
   IoCompleteRequest(Irp, IO_NO_INCREMENT);

   return status;
}
.............
NTSTATUS DocReader_FindDevice(Не понялНе понялНе понялНе понялНе понялНе понял??)
{
   BOOL bFind;
   PCI_IO PciIo;
   bFind=PciIo.FindDevice();
   return Не понялНе понялНе понял;
}

Другими словами. Я спрашиваю у драйвера через DeviceIoControl есть ли устройство с переданными VendorID и DeviceID. Драйвер в ответт вызывает свою внутреннюю функцию и отвечает приложению через переданный bExists есть или нет такое устройство. Я что то уже запарился и плохо соображаю. Во внутренних параметрах больно дофига всего и разобраться в этом не представляется возможным.
Вопрос как реализовать.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


PCI
« Ответ #34 : 23-07-2003 13:24 » 

Цитата

Те что скриншот кинуть? Ни хрена у меня не стоит ... никакого креста.

Я это проверю.
Записан

А птичку нашу прошу не обижать!!!
Juggernaut
Гость
PCI
« Ответ #35 : 24-07-2003 08:36 » 

Ну что никто не знает как сие реализовать?
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


PCI
« Ответ #36 : 24-07-2003 09:04 » 

Жди Славика из отпуска.
Записан

А птичку нашу прошу не обижать!!!
Juggernaut
Гость
PCI
« Ответ #37 : 25-07-2003 06:47 » 

Подождем. Пока сам  поковыряю.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


PCI
« Ответ #38 : 25-07-2003 07:38 » 

Ок- правда он обещал вернуться через 4 дня - надеюсь что на след. неделе он придет - просто я этого не знаю а остальные ленятся ...
Записан

А птичку нашу прошу не обижать!!!
SlavaI
Главный специалист

ru
Offline Offline

PCI
« Ответ #39 : 28-07-2003 19:28 » 

в общем я пришел. Подумаю над вопросом, я что-то не совсем въехал в него.
Записан
Juggernaut
Гость
PCI
« Ответ #40 : 29-07-2003 11:41 » 

Вопрос в следующем. Я путаюсь с входными/выходными буферами. Т.е. что надо передать через DeviceIoControl, как переданное выковырять и из чего внутри драйвера, обработать как надо, и вернуть обратно в программу.

Например.
Имеется железка. VendorID=5678 DeviceID=1234.
Она может находиться в компьютере а может и нет.
Как я понимаю внутри драйвера надо создать функцию, которая бы опрашивала все устройства установленные на шине на наличие именно таких идентификаторов. Кусок того, что по идее ищет устройство я нашел. Теперь требуется передать в драйвер требуемые номера(в данном случае VendorID=5678 DeviceID=1234) через DeviceIoControl а драйвер должен вернуть да или нет(торчит такая плата или нет).

Так вот что и как передавать, и что и как выковыривать из IRP в самом драйвере? Как эти параметры менять, и передавать обратно в программу?

Не знаю понятнее ли стало. Пытался объяснить каск мог.
Записан
Juggernaut
Гость
PCI
« Ответ #41 : 29-07-2003 11:45 » 

Придумал как спросить короче.
Как юзать DeviceIoControl и в проге и в драйвере?
Записан
SlavaI
Главный специалист

ru
Offline Offline

PCI
« Ответ #42 : 30-07-2003 19:38 » 

Цитата

Как юзать DeviceIoControl и в проге и в драйвере?


Почитай в W. Oney главу  9, она именно про это. Лучше него я все равно не расскажу. Как я понял по-английски ты читаешь свободно. Книга есть на этом сайте.
 Когда прочтешь - задавай вопросы, будем отвечать.
Записан
Juggernaut
Гость
PCI
« Ответ #43 : 31-07-2003 10:07 » 

Ок.

Кстати на этом сайте, по моему, прочитал что не советуют юзать Numega или WinDriver при разработке дров.
Думаю ничего подобного. При достаточном знании языка С++ довольно легко разбираться во внутренностях. Создаешь примитивный драйвер и начинаешь его по тихоньку ковырять. Я кстати почти разобрался при помощи NuMega.
Но главу все таки прочту. В случае чего задам дополнительный вопрос. Отлично
Записан
sss
Специалист

ru
Offline Offline

PCI
« Ответ #44 : 01-08-2003 08:46 » 

Кто скажет, если вызвать прерывание в 0 кольце что произойдет ?
(создаю новую тему)
Записан

while (8==8)
Juggernaut
Гость
PCI
« Ответ #45 : 02-08-2003 13:01 » 

Ребят. По поводу Главы 9.
Что означает фраза
Цитата

IMPORTANT
Always switch on the full 32 bits of the I/O control code to prevent a user-mode program from sneaking past the access checks or causing the I/O Manager to prepare the parameters using the wrong buffering method.

Типа:
Всегда включайте все 32 бита управляющего кода ввода вывода, чтобы предотвратить приложения пользовательского режима от крадущейся предыдущей проверки доступа Не понял?? или заставлять менеджера управления вводом выводом (программу управления вводом выводом) подготавливать параметры, используя неверный метод буферизации.
-========================
Точнее что здесь может означать from sneaking past
Из крадущегося прошлого как-то ни к селу ни к городу. Я бы конечно плюнул, но все же инетресно. С окончание фразы все ясно а вто середина... :oops:
Написано что важно
Записан
SlavaI
Главный специалист

ru
Offline Offline

PCI
« Ответ #46 : 04-08-2003 06:02 » 

Цитата

IMPORTANT
Always switch on the full 32 bits of the I/O control code to prevent a user-mode program from sneaking past the access checks or causing the I/O Manager to prepare the parameters using the wrong buffering method.


А может имеется в виду необходимость проверки всего IOCTL кода, а не его отдельных полей? А sneaking past the access checks - обходить проверку?

А NuMega наверно лучше не использовать, а то многое остается непонятым при ее использовании, к тому же Microsoft готовит свою Framework для драйверов, только она будет для C, а не для C++.
Записан
Juggernaut
Гость
PCI
« Ответ #47 : 04-08-2003 06:52 » 

Кстати может быть. Тогда это может звучать так:
"Всегда включайте все 32 бита IOCTL кода, для обхода проверки доступа, или вынуждения I/O менеджера  подготавливать параметры, основываясь на неверном методе буферизации"

Кстати при прочтении некоторых кусков глав книжки(выборочно и именно кусками), порой попадаются "непереводимые фразы". Сидишь и голову ломаешь что бы это могло значить.
Так например в Win32API  handle в основном применяется как "дескриптор" а в этой книжке как "обрабатывать". Короче запутаться раз плюнуть.


Цитата

А NuMega наверно лучше не использовать,


Не меня прет. Была бы возможность протрейсить пошагово запуск драйвера или начало обработки им комманд, было бы просто шоколадно.
Я например так API учил. Сваял примитивную прогу на MFC, сделал из MFC "свою" статическую либу, подключил её к проекту, трейсил по шагам, и смотрел последовательность вызовов того или иного. Правда мусора много встречается, но в целом довольно быстро осваиваешь. Главное становится понятно что откуда и куда.
Например разобраться с тем же DeviceIoControl было бы легче, если заслать из приложения какие то данные, и посмотреть, где они всплывут в драйвере.

Как же запустить драйвер в режиме отладки из VC6 я понятия не имею. Знал бы, давно бы уже проблем не имел.

Ты кстати не знаешь как это можно сотворить?
Записан
SlavaI
Главный специалист

ru
Offline Offline

PCI
« Ответ #48 : 04-08-2003 07:21 » 

Цитата

Ты кстати не знаешь как это можно сотворить?


Или SoftIce поставить или стандартным отладчиком от Microsoft - WinDbg/i386kd.exe, только для майкрософтовских отладчиков вторая машина нужна.
Отладочное прерывание __asm int 3; прямо в коде можно написать или по шагам отлаживать на второй машине, или поставить BP в SoftIce.
Записан
Juggernaut
Гость
PCI
« Ответ #49 : 04-08-2003 11:45 » 

Ну вторая машина у меня есть. Соединены в 100 mb сеть.
А как это подключить и использовать, нигде статей нет?
Записан
SlavaI
Главный специалист

ru
Offline Offline

PCI
« Ответ #50 : 04-08-2003 12:36 » 

Или через сеть или через COM порт. В хелпе к WinDBG все написано.
Записан
sss
Специалист

ru
Offline Offline

PCI
« Ответ #51 : 05-08-2003 02:45 » 

// по пункту 3 вопроса
AX = B102h
CX = DeviceID
DX = VendorID
SI = 0..n                     // порядковый номер
int 1Ah
BH                             // номер шины
BL & 7                       // номер функции
BL & F8 >> 3             // номер устройства
AH                            // код возврата SUCCEFUL | BAD_VENDOR_ID | DEVICE_NOT_FOUND
CF                            // 0- ok 1 - fail
Записан

while (8==8)
SlavaI
Главный специалист

ru
Offline Offline

PCI
« Ответ #52 : 05-08-2003 05:10 » 

Цитата

AX = B102h
CX = DeviceID
DX = VendorID
SI = 0..n // порядковый номер
int 1Ah
BH // номер шины
BL & 7 // номер функции
BL & F8 >> 3 // номер устройства
AH // код возврата SUCCEFUL | BAD_VENDOR_ID | DEVICE_NOT_FOUND


Даже пробовать не буду- это прерывание реального режима. Система рухнет.
Записан
sss
Специалист

ru
Offline Offline

PCI
« Ответ #53 : 05-08-2003 08:28 » 

интересно, попробовал все-таки или нет ? Улыбаюсь  Я обязательно попробую ! DDK только доставлю ...
Записан

while (8==8)
SlavaI
Главный специалист

ru
Offline Offline

PCI
« Ответ #54 : 05-08-2003 10:03 » 

Цитата

интересно, попробовал все-таки или нет ?  Я обязательно попробую ! DDK только доставлю ..


Почитай мануалы на процессоры и посмотри на IDT в винде по записи 1A. Зачем пробовать если и так ясно что это неправильно. Это разные режимы работы процессоров. Ты хоть понимаешь что int 1A это для реального режима, а Windows переводит процессор в защищенный режим.
Записан
SlavaI
Главный специалист

ru
Offline Offline

PCI
« Ответ #55 : 05-08-2003 10:14 » 

Вот еще- в защищенном режиме прерывание 1A зарезервировано Intel и не должно использоваться. У винды там ловушки KiTrap0F.
Записан
Juggernaut
Гость
PCI
« Ответ #56 : 21-08-2003 09:52 » 

Цитата

Или через сеть или через COM порт. В хелпе к WinDBG все написано.

Что то я не нашел как через сеть.

Тут такая маза. Я поставил WmWare. Доставил туда XP. Основная система 2000. Вторая система убивается легко. Синий экран и все такое. Основная продолжает работать как ни в чем не бывало. По сети системы видят друг друга.

Так вот как настроить отладчик чтобы протрейсить драйвер. Хоть какую либо доку.
В спарвке или про посл. порты или через именованные каналы на той же машине.
Как по TCP IP???
Записан
maaaaaad
Гость
PCI
« Ответ #57 : 30-08-2003 05:58 » 

sss!!! не делай этого =))))))))))))))

int 1Ah не для protected mode. В оном надо через каталог шлюзов PCIBIOS32.
подробней в PCI BIOS spec PCI SIG

толька зачем? Улыбаюсь))

у мя есть написанная прога+vxd для чтения конфига PCI через шлюзы PCIBIOS32, правда под 9x.....по этому поводу сейчас статью пишу....кому интересно кину прогу на мыло

короче все это очень интересно, только все равно лучше брать хорошее PnP железо и работать с IRP_MN_START_DEVICE. С кривым повесится на крюке люстры можно....
Записан
maaaaaad
Гость
PCI
« Ответ #58 : 30-08-2003 06:00 » 

Да, кстати, а почему даты проставляются неправильно?
Уважаемый Гром! Проверьте пожалуйста системное время на вашом компе.
Записан
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline Offline
Пол: Мужской
Бодрый птах


PCI
« Ответ #59 : 30-08-2003 09:16 » 

CrashMaker, даты проставляются правильно - и все в порядке с сервером - проверяй настройки в профиле форума...

Насчет статьи - где она будет опубликована и можно ли заполучить ее на сайт :?:
Записан

А птичку нашу прошу не обижать!!!
Страниц: 1 [2] 3  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines