VOID HvlNotificationsWorkItem( _In_ PVOID Context, _In_ NDIS_HANDLE NdisIoWorkItemHandle ) { PHVL pHvl = NULL; LIST_ENTRY *pEntryNotif = NULL; PHVL_NOTIFICATION pNotification = NULL; UNREFERENCED_PARAMETER(NdisIoWorkItemHandle); pHvl = (PHVL) Context; HvlLock(pHvl); pEntryNotif = pHvl->NotificationsQueue.Flink; while (pEntryNotif != &pHvl->NotificationsQueue) { pNotification = CONTAINING_RECORD(pEntryNotif, HVL_NOTIFICATION, Link); RemoveEntryList (&pNotification->Link); HvlNotifyAllVNics(pHvl, pNotification->pvNotif); pEntryNotif = pEntryNotif->Flink; HvlFreeNotification(pNotification); } pHvl->fNotificationsWorkItemRunning = FALSE; pHvl->ulNumThreadsPending--; HvlUnlock(pHvl); }
NDIS_STATUS HvlQueueNotification( PHVL pHvl, PVOID pvNotif ) { NDIS_STATUS ndisStatus = NDIS_STATUS_SUCCESS; PHVL_NOTIFICATION pHvlNotif = NULL; PNOTIFICATION_DATA_HEADER pHdr = (PNOTIFICATION_DATA_HEADER)pvNotif; PVOID pVNicNotif = NULL; ASSERT(HvlIsLocked(pHvl)); do { ndisStatus = ALLOC_MEM(pHvl->MiniportAdapterHandle, sizeof(HVL_NOTIFICATION), &pHvlNotif); if (NDIS_STATUS_SUCCESS != ndisStatus) { MpTrace(COMP_HVL, DBG_SERIOUS, ("Failed to allocate memory for a HVL notification\n")); break; } ndisStatus = ALLOC_MEM(pHvl->MiniportAdapterHandle, pHdr->Size, &pVNicNotif); if (NDIS_STATUS_SUCCESS != ndisStatus) { MpTrace(COMP_HVL, DBG_SERIOUS, ("Failed to allocate memory for notification\n")); break; } NdisMoveMemory(pVNicNotif , pvNotif, pHdr->Size); pHvlNotif->pvNotif = pVNicNotif; InsertTailList(&pHvl->NotificationsQueue, &pHvlNotif->Link); } while (FALSE); if (NDIS_FAILURE(ndisStatus)) { HvlFreeNotification(pHvlNotif); } return ndisStatus; }