Доброго всем дня!
Проблема такая: пишу wdm драйвер устройства в DriverWorks.
На обычном компьютере PII-350, чипсет Intel, WinXP SP1 и на втором компьютере PIV-1,8G, чипсет Intel, WinXP SP1, связка драйвер+девайс работает нормально.
при попытке запустить девайс на промышленном компьютере Pentium M-1.8G, чипсет Intel Montara-GM+ i855GME, WinXP SP2, вылетает blue screen.
Вот фрагмент crash dump файла:
PNP_DETECTED_FATAL_ERROR (ca)
PnP encountered a severe error, either as a result of a problem in a driver or a problem in PnP itself. The first argument describes the nature of the problem, the second argument is the address of the PDO. The other arguments vary depending on argument 1.
Arguments:
Arg1: 00000002, Invalid PDO
An API which requires a PDO has been called with either an FDO, a PDO which hasn't been initialized yet (returned to PnP in a
QueryDeviceRelation/BusRelations), or some random piece of memory.
Arg2: 82384ce8, Purported PDO.
Arg3: 00000000, Driver object.
Arg4: 00000000
...
FAULTING_SOURCE_CODE:
216: inline BOOLEAN KDmaAdapter::Initialize(PDEVICE_DESCRIPTION pDesc, PDEVICE_OBJECT pPdo)
217: {
218: m_Description = *pDesc;
219: m_nMapRegisters = m_Description.MaximumLength/PAGE_SIZE + 1;
> 220: m_pAdapter = IoGetDmaAdapter(pPdo, &m_Description, &m_nMapRegisters);
221:
222: BOUNDS_CHECKER(CONSTRUCTED_DMA_ADAPTER, (this, pDesc, m_nMapRegisters ));
223:
224: return (m_pAdapter != NULL);
225: }
Подключение в драйвере осуществдяется так:
#define PAGE_SIZE 0x1000
#define MAX_DMA_LENGTH 0x40000 // 256K 0x100000 - 1 MB
// Initialize the device descriptor for the DMA object using the assigned resource
DEVICE_DESCRIPTION dd;
RtlZeroMemory(&dd, sizeof(dd));
dd.Version = DEVICE_DESCRIPTION_VERSION;
dd.Master = TRUE;
dd.ScatterGather = FALSE;
dd.DemandMode = TRUE;
dd.AutoInitialize = FALSE;
dd.Dma32BitAddresses = TRUE;
dd.IgnoreCount = FALSE;
dd.InterfaceType = PCIBus;
dd.DmaChannel = 0;
dd.DmaWidth = Width32Bits;
dd.DmaSpeed = Compatible;
dd.MaximumLength = MAX_DMA_LENGTH;
// Initialize the DMA adapter object
m_nMapRegisters = dd.MaximumLength/PAGE_SIZE + 1;
m_pAdapter = IoGetDmaAdapter(m_PDO, &dd, &m_nMapRegisters); // this is error point
Подскажите в какую сторону нужно копать? Спасибо.