VirtualBox

Ignore:
Timestamp:
Feb 19, 2016 3:18:15 PM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
105611
Message:

NetLwf/Win(bugref:7933): Log system error events on failures

Location:
trunk/src/VBox/HostDrivers/VBoxNetFlt/win/drv
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/win/drv/VBoxNetLwf-win.cpp

    r59653 r59742  
    227227static int vboxNetLwfWinFini();
    228228
     229/**
     230 * Logs an error to the system event log.
     231 *
     232 * @param   ErrCode        Error to report to event log.
     233 * @param   ReturnedStatus Error that was reported by the driver to the caller.
     234 * @param   uErrId         Unique error id representing the location in the driver.
     235 * @param   cbDumpData     Number of bytes at pDumpData.
     236 * @param   pDumpData      Pointer to data that will be added to the message (see 'details' tab).
     237 */
     238static void vboxNetLwfLogErrorEvent(NTSTATUS uErrCode, NTSTATUS uReturnedStatus, ULONG uErrId)
     239{
     240    /* Figure out how many modules are attached and if they are going to fit into the dump data. */
     241    unsigned cMaxModules = (ERROR_LOG_MAXIMUM_SIZE - FIELD_OFFSET(IO_ERROR_LOG_PACKET, DumpData)) / sizeof(RTMAC);
     242    unsigned cModules = 0;
     243    PVBOXNETLWF_MODULE pModuleCtx = NULL;
     244    NdisAcquireSpinLock(&g_VBoxNetLwfGlobals.Lock);
     245    RTListForEach(&g_VBoxNetLwfGlobals.listModules, pModuleCtx, VBOXNETLWF_MODULE, node)
     246        ++cModules;
     247    NdisReleaseSpinLock(&g_VBoxNetLwfGlobals.Lock);
     248    /* Prevent overflow */
     249    if (cModules > cMaxModules)
     250        cModules = cMaxModules;
     251
     252    /* DumpDataSize must be a multiple of sizeof(ULONG). */
     253    unsigned cbDumpData = (cModules * sizeof(RTMAC) + 3) & ~3;
     254    /* Prevent underflow */
     255    unsigned cbTotal = RT_MAX(FIELD_OFFSET(IO_ERROR_LOG_PACKET, DumpData) + cbDumpData,
     256                              sizeof(IO_ERROR_LOG_PACKET));
     257
     258    PIO_ERROR_LOG_PACKET pErrEntry;
     259    pErrEntry = (PIO_ERROR_LOG_PACKET)IoAllocateErrorLogEntry(g_VBoxNetLwfGlobals.pDevObj,
     260                                                              (UCHAR)cbTotal);
     261    if (pErrEntry)
     262    {
     263        PRTMAC pDump = (PRTMAC)pErrEntry->DumpData;
     264        /*
     265         * Initialize the whole structure with zeros in case we are suddenly short
     266         * of data because the list is empty or has become smaller.
     267         */
     268        memset(pErrEntry, 0, cbTotal);
     269
     270        NdisAcquireSpinLock(&g_VBoxNetLwfGlobals.Lock);
     271        RTListForEach(&g_VBoxNetLwfGlobals.listModules, pModuleCtx, VBOXNETLWF_MODULE, node)
     272        {
     273            /* The list could have been modified while we were allocating the entry, rely on cModules instead! */
     274            if (cModules-- == 0)
     275                break;
     276            *pDump++ = pModuleCtx->MacAddr;
     277        }
     278        NdisReleaseSpinLock(&g_VBoxNetLwfGlobals.Lock);
     279
     280        pErrEntry->DumpDataSize     = cbDumpData;
     281        pErrEntry->ErrorCode        = uErrCode;
     282        pErrEntry->UniqueErrorValue = uErrId;
     283        pErrEntry->FinalStatus      = uReturnedStatus;
     284        IoWriteErrorLogEntry(pErrEntry);
     285    }
     286    else
     287    {
     288        DbgPrint("Failed to allocate error log entry (cb=%u)\n", cbTotal);
     289    }
     290}
     291
    229292#ifdef DEBUG
    230293static const char *vboxNetLwfWinStatusToText(NDIS_STATUS code)
     
    779842
    780843    PVBOXNETLWFGLOBALS pGlobals = (PVBOXNETLWFGLOBALS)hDriverCtx;
    781     AssertReturn(pGlobals, NDIS_STATUS_FAILURE);
     844    if (!pGlobals)
     845    {
     846        vboxNetLwfLogErrorEvent(IO_ERR_INTERNAL_ERROR, NDIS_STATUS_FAILURE, 1);
     847        return NDIS_STATUS_FAILURE;
     848    }
    782849
    783850    ANSI_STRING strMiniportName;
     
    790857        LogError(("vboxNetLwfWinAttach: RtlUnicodeStringToAnsiString(%ls) failed with 0x%x\n",
    791858             pParameters->BaseMiniportName, rc));
     859        vboxNetLwfLogErrorEvent(IO_ERR_INTERNAL_ERROR, NDIS_STATUS_FAILURE, 2);
    792860        return NDIS_STATUS_FAILURE;
    793861    }
     
    804872        LogError(("vboxNetLwfWinAttach: Failed to allocate module context for %ls\n", pParameters->BaseMiniportName));
    805873        RtlFreeAnsiString(&strMiniportName);
     874        vboxNetLwfLogErrorEvent(IO_ERR_INSUFFICIENT_RESOURCES, NDIS_STATUS_RESOURCES, 3);
    806875        return NDIS_STATUS_RESOURCES;
    807876    }
     
    818887                pParameters->BaseMiniportName));
    819888        NdisFreeMemory(pModuleCtx, 0, 0);
     889        vboxNetLwfLogErrorEvent(IO_ERR_INSUFFICIENT_RESOURCES, NDIS_STATUS_RESOURCES, 4);
    820890        return NDIS_STATUS_RESOURCES;
    821891    }
     
    853923        NdisFreeIoWorkItem(pModuleCtx->hWorkItem);
    854924        NdisFreeMemory(pModuleCtx, 0, 0);
     925        vboxNetLwfLogErrorEvent(IO_ERR_INTERNAL_ERROR, NDIS_STATUS_RESOURCES, 5);
    855926        return NDIS_STATUS_RESOURCES;
    856927    }
     
    23912462    }
    23922463    NdisReleaseSpinLock(&g_VBoxNetLwfGlobals.Lock);
     2464    vboxNetLwfLogErrorEvent(IO_ERR_INTERNAL_ERROR, STATUS_SUCCESS, 6);
    23932465    LogFlow(("<==vboxNetFltOsInitInstance: return VERR_INTNET_FLT_IF_NOT_FOUND\n"));
    23942466    return VERR_INTNET_FLT_IF_NOT_FOUND;
  • trunk/src/VBox/HostDrivers/VBoxNetFlt/win/drv/VBoxNetLwf.inf

    r56293 r59742  
    4848
    4949[VBoxNetLwf.ndi.Services]
    50 AddService = VBoxNetLwf,, VBoxNetLwf.AddService
     50AddService = VBoxNetLwf,, VBoxNetLwf.AddService, VBoxNetLwf.AddEventLog
    5151
    5252[VBoxNetLwf.AddService]
     
    6060
    6161[VBoxNetLwf.AddService.AddReg]
     62
     63[VBoxNetLwf.AddEventLog]
     64AddReg         = VBoxNetLwf.AddEventLog.AddReg
     65
     66[VBoxNetLwf.AddEventLog.AddReg]
     67HKR,,EventMessageFile,0x00020000,"%%SystemRoot%%\System32\IoLogMsg.dll"
     68HKR,,TypesSupported,0x00010001,7
     69
    6270
    6371[SourceDisksNames]
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette