// new DeviceInfo object, transfers ownership of strings, DeviceInfo *DeviceInfo::NewDevice(enum DevType aDevType, enum DevState aDevState, FILETIME aNow, wchar_t *aSerialnumber, wchar_t *aPortName, wchar_t *aFriendlyName, wchar_t *aHardwareId, int aPortNumber, wchar_t *aContainerId, unsigned aUsbHub, unsigned aUsbPort, BOOL aUsbValid, unsigned aScanId, DeviceInfo *aDevNext, BOOL aIsWinSerial, SerialType aSerialType) { DeviceInfo *newDev = NULL; // decide if new device should be DevArrived rather than DevPresent if ((aDevState == DevPresent) && !gdevTracker->CheckInitialScanFlag(aDevType)) { aDevState = DevArrived; } newDev = new DeviceInfo(aDevType, aDevState, aNow, aSerialnumber, aPortName, aPortNumber, aContainerId, aFriendlyName, aHardwareId, aUsbHub, aUsbPort, aUsbValid, aScanId, aDevNext, aIsWinSerial, aSerialType); if (newDev) { TCHAR buffer[20]; // update double linked list if (aDevNext) { aDevNext->devPrev = newDev; } gdevTracker->SetPortList(newDev); StringCbPrintf(buffer, sizeof(buffer), (newDev->DeviceState() == DevArrived) ? _T("%s 0min") : _T("%s"), newDev->StateName()); // display update shouldn't fail, but check anyway if (!gdevTracker->AddViewItem(newDev->DisplayName(), newDev->devImage, newDev->DevTypeName(), buffer, newDev->LocationString(), aSerialnumber, (LPARAM)newDev)) { newDev->Destroy(); newDev = NULL; } else { if ((aDevState == DevArrived) || (aDevState == DevPresent)) { // update count newDev->IncDeviceTypeCount(); } // update DeviceTracker counts, decide on notifications gdevTracker->DetermineArrivalNotifications(aDevType, aDevState); } } return newDev; }