Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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;
}