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

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

ru
Offline Offline

« : 23-09-2005 07:15 » 

Драйвер карточки pci система виндовс.  Карточка использует порты ввода вывода. (16 байт)
Написал драйвер , с одной карточкой работает нормально, но как только вставить вторую такую же карточку, перезагружается при попытке установить драйвер.
В написании драйверов я новичок. Поэтому хочу выяснить несколько моментов:
1. Драйвер на одно устройство ставится и работает нормально . При попытке поставить его на второе устройство - (я выбираю установка из указанного места )  сначала спрашивает .inf , потом спрашивает .sys , а потом !!!! опять спрашивает sys. Мне показалось это странным .
2. Что происходит при установке драйвера на второе устройство Не понял Моя версия Улыбаюсь - система смотрит что такой драйвер уже загружет , следовательно второй экземпляр драйвера не загружается , шинный драйвер создает PDO,  вызывается AddDevice ( я так понял что это единственная функция , в которой различаются устройства  , то есть все остальные функции работают с функциональным объектом драйвера, следовательно если они работают с одной карточкой, должны работать и с двумя).
на всякий случай приведу код AddDevice.

Код:

NTSTATUS AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT pdo)
{ // AddDevice
PAGED_CODE();
KdPrint((DRIVERNAME " - Entering AddDevice: DriverObject %8.8lX, pdo %8.8lX\n", DriverObject, pdo));
       
 
NTSTATUS status=STATUS_SUCCESS;

// Create a function device object to represent the hardware we're managing.

PDEVICE_OBJECT fdo;

/*ULONG dxsize = (sizeof(DEVICE_EXTENSION) + 7) & ~7;
ULONG xsize = dxsize ; */

/*UNICODE_STRING numberstr;
RtlInitUnicodeString(&numberstr, L"XX");

RtlIntegerToUnicodeString(cardnumber, 0, &numberstr);  */

UNICODE_STRING devname;

if (cardnumber) RtlInitUnicodeString(&devname, L"\\DosDevices\\lir940pci1");
else RtlInitUnicodeString(&devname, L"\\DosDevices\\lir940pci0");

//RtlAppendUnicodeStringToString(&devname , &numberstr);
     


/* KdPrint(("Max Len =%d   Len = %d \n",devname.MaximumLength,devname.Length));
ANSI_STRING  ats;

RtlUnicodeStringToAnsiString(&ats , &devname, TRUE);

KdPrint((ats.Buffer));

RtlFreeAnsiString(&ats);
RtlFreeUnicodeString(&numberstr);*/

cardnumber++;
   

status = IoCreateDevice(DriverObject, sizeof(DEVICE_EXTENSION), &devname,
FILE_DEVICE_UNKNOWN, FILE_DEVICE_SECURE_OPEN, FALSE, &fdo);
if (!NT_SUCCESS(status))
{ // can't create device object
KdPrint((DRIVERNAME " - IoCreateDevice failed - %X\n", status));
return status;
} // can't create device object

PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo->DeviceExtension;

// From this point forward, any error will have side effects that need to
// be cleaned up.

do
{ // finish initialization
pdx->DeviceObject = fdo;
pdx->Pdo = pdo;

// Make a copy of the device name

pdx->devname.Buffer = (PWCHAR) ExAllocatePool(NonPagedPool, devname.MaximumLength);
if (!pdx->devname.Buffer)
{ // can't allocate buffer
status = STATUS_INSUFFICIENT_RESOURCES;
KdPrint((DRIVERNAME " - Unable to allocate %d bytes for copy of name\n", devname.MaximumLength));
break;;
} // can't allocate buffer
pdx->devname.MaximumLength = devname.MaximumLength;
RtlCopyUnicodeString(&pdx->devname, &devname);

// Declare the buffering method we'll use for read/write requests

fdo->Flags |= DO_BUFFERED_IO;

// Initialize DPC object



// Link our device object into the stack leading to the PDO

pdx->LowerDeviceObject = IoAttachDeviceToDeviceStack(fdo, pdo);
if (!pdx->LowerDeviceObject)
{ // can't attach
KdPrint((DRIVERNAME " - IoAttachDeviceToDeviceStack failed\n"));
status = STATUS_DEVICE_REMOVED;
break;
} // can't attach



// Clear the "initializing" flag so that we can get IRPs

fdo->Flags &= ~DO_DEVICE_INITIALIZING;
} // finish initialization
while (FALSE);

if (!NT_SUCCESS(status))
{ // need to cleanup

KdPrint(("Mike ^  Error on Init "));
if (pdx->devname.Buffer)
RtlFreeUnicodeString(&pdx->devname);
if (pdx->LowerDeviceObject)
IoDetachDevice(pdx->LowerDeviceObject);
IoDeleteDevice(fdo);
} // need to cleanup
// if (NT_SUCCESS(status)) KdPrint(("MIke :  AddDevice  is OK "));
    KdPrint((DRIVERNAME " - ADD DEVICE before status  %X\n", status));
   
return status;
} // AddDevice


заранее извиняюсь за комментарии .
« Последнее редактирование: 16-12-2007 18:47 от Алексей1153++ » Записан
Ochkarik
Модератор

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

« Ответ #1 : 26-09-2005 15:48 » 

по поводу 2 - все правильно...
первый раз sys - требует - вроде бы все нормально. он его открывает CreateFile() как девайс устройства,  если он уже загружен, второй раз тот же файл не подгрузится.
файлы, кстати, установленный и новый - совпадают?
в AddDevice вроде все нормально с первого взгляда.
попробуйте отключить все лишнее и запустить заново)))
Записан

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

ru
Offline Offline

« Ответ #2 : 27-09-2005 04:17 » 

Спасибо, разобрался сам Улыбаюсь
С момента создания первой версии драйвера , расплодилось столько инфов , что система, как я думаю , воспринимала второй драйвер, как другой, несовместимый с первым и заново загружала sys.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines