Драйвер карточки 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
заранее извиняюсь за комментарии .