⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 global.c

📁 Vitual Ring Routing 管你知不知道
💻 C
字号:
// -*- mode: C++; tab-width: 4; indent-tabs-mode: nil -*- (for GNU Emacs)
//
// (c) Microsoft Corporation. All rights reserved. 
//
// This file is part of the Microsoft Virtual Ring Routing distribution.
// You should have received a copy of the Microsoft Research Shared Source
// license agreement (MSR-SSLA) for this software; see the file "license.txt".
// If not, please see http://research.microsoft.com/vrr/license.htm,
// or write to Microsoft Research, One Microsoft Way, Redmond, WA 98052-6399.
//

#include "headers.h"

VrrGlobalState VrrGlobal;

//* GlobalInit
//
//  Called by MiniportInitialize.
//  Initialize global params.
//
void GlobalInit(MiniportAdapter *VA)
{
    unsigned __int64 ns100PerDay = (unsigned __int64)MINUTE * 60 * 24;
    unsigned __int64 ns100Since1Jan1601;

#if DBG
    //
    // There exists a partial ordering between locks introduced for VRR.
    // The ordering is reflected here at the outset so that DriverVerifier
    // can be used to check that the ordering is preserved in later code
    // paths.
    //     PCache->Lock before RT->Lock
    //     PCache->Lock before NC->Lock
    //     RT->Lock before NC->Lock
    //     RT->Lock before NT->Lock
    //     MaintBuf->Lock before NC->Lock
    //
    KIRQL OldIrql;

    KeAcquireSpinLock(&VA->RT.Lock, &OldIrql);
    KeAcquireSpinLockAtDpcLevel(&VA->Lock);
    KeReleaseSpinLockFromDpcLevel(&VA->Lock);
    KeReleaseSpinLock(&VA->RT.Lock, OldIrql);

    KeAcquireSpinLock(&VA->NC.Lock, &OldIrql);
    KeAcquireSpinLockAtDpcLevel(&VA->Lock);
    KeReleaseSpinLockFromDpcLevel(&VA->Lock);
    KeReleaseSpinLock(&VA->NC.Lock, OldIrql);

    KeAcquireSpinLock(&VA->PCache.Lock, &OldIrql);
    KeAcquireSpinLockAtDpcLevel(&VA->RT.Lock);
    KeReleaseSpinLockFromDpcLevel(&VA->RT.Lock);
    KeReleaseSpinLock(&VA->PCache.Lock, OldIrql);
    
    KeAcquireSpinLock(&VA->PCache.Lock, &OldIrql);
    KeAcquireSpinLockAtDpcLevel(&VA->NC.Lock);
    KeReleaseSpinLockFromDpcLevel(&VA->NC.Lock);
    KeReleaseSpinLock(&VA->PCache.Lock, OldIrql);
    
    KeAcquireSpinLock(&VA->RT.Lock, &OldIrql);
    KeAcquireSpinLockAtDpcLevel(&VA->NC.Lock);
    KeReleaseSpinLockFromDpcLevel(&VA->NC.Lock);
    KeReleaseSpinLock(&VA->RT.Lock, OldIrql);

    KeAcquireSpinLock(&VA->RT.Lock, &OldIrql);
    KeAcquireSpinLockAtDpcLevel(&VA->NT.Lock);
    KeReleaseSpinLockFromDpcLevel(&VA->NT.Lock);
    KeReleaseSpinLock(&VA->RT.Lock, OldIrql);

#endif
    KdPrint(("VRR DriverBuildNumber: %s\n",VRR_BUILD_NUM));
    KdPrint(("VRR DriverBuildDate: %s\n",__DATE__));
    KdPrint(("VRR DriverBuildTime: %s\n",__TIME__));
    
    RtlZeroMemory(&VrrGlobal, sizeof(VrrGlobal));
    VrrGlobal.KdBreakPointOnAssert = FALSE;
    RtlCopyMemory(&VrrGlobal.DriverBuildNumber, VRR_BUILD_NUM, sizeof(VRR_BUILD_NUM));
    RtlCopyMemory(&VrrGlobal.DriverBuildDate, __DATE__, sizeof(__DATE__));
    RtlCopyMemory(&VrrGlobal.DriverBuildTime, __TIME__, sizeof(__TIME__));

    //
    // Some required relations over constants.
    //
    VRRASSERT(EtxAdmitMin < EtxEvictMin);
    VRRASSERT(RATE_EVICT_DEFAULT < RATE_ADMIT_DEFAULT);
    VRRASSERT(EtxEvictMin < DefaultWcettBroken);
    VRRASSERT(RSSI_EVICT_DEFAULT < RSSI_ADMIT_DEFAULT);

    //
    // Init milliseconds since midnight for log timestampts.
    // Calculate time since midnight today.
    //
    KeQuerySystemTime((PLARGE_INTEGER)&ns100Since1Jan1601);
    VrrGlobal.BootRelMidnight = (ns100Since1Jan1601 % ns100PerDay);

}

//* TimeSinceMidnight
//
//  Returns time since mignight today in units of 100ns. 
//
Time
TimeSinceMidnight()
{
    unsigned __int64 ns100PerDay = (unsigned __int64)MINUTE * 60 * 24;
    Time Now = KeQueryInterruptTime();
    Time Boot = VrrGlobal.BootRelMidnight;

    return ((Now + Boot) % ns100PerDay);
}

//* TimeoutInterval
//
//  Choose a random timeout interval within given bounds.
//
Time TimeoutInterval(Time MinTime, Time MaxTime)
{
    VRRASSERT(MaxTime >= MinTime);
    return MinTime + MS_TO_TIME(GetRandomNumber(TIME_TO_MS(MaxTime) - TIME_TO_MS(MinTime)));
}

//* CopyInternalOption
//
//
InternalOption *
CopyInternalOption(
    MiniportAdapter *VA,
    InternalOption *Original)
{
    uint OptSize;
    InternalOption *New = NULL;
    
    OptSize = sizeof(InternalOption)
              + Original->Opt.optDataLen;

    if ((New=ExAllocatePool(NonPagedPool, OptSize)) != NULL) {

        VrrMsgPrefix *MsgPrefix;
        
        RtlCopyMemory(New, Original, OptSize);
        New->Next = NULL;

        MsgPrefix = (VrrMsgPrefix *)&New->Opt;

        if (MsgPrefix->OptionType == VRR_OPTION_TYPE_SETUP ||
            MsgPrefix->OptionType == VRR_OPTION_TYPE_TEARDOWN) {
            RtlCopyMemory(MsgPrefix->Source, VA->Address, sizeof(VirtualAddress));
        }
    }

    return New;

}


//* PrintfNdisStatus
//
//  Diag helper.
void PrintfNdisStatus(
    char *msg,
    NDIS_STATUS NdisStatus,
    boolint PrintSuccess)
{
    char *decode;
    if (NdisStatus == NDIS_STATUS_SUCCESS &&
        PrintSuccess == FALSE)
        return;

    if (NdisStatus == NDIS_STATUS_SUCCESS)
        decode = "NDIS_STATUS_SUCCESS\n";
    else if (NdisStatus == NDIS_STATUS_PENDING)
        decode = "NDIS_STATUS_PENDING\n";
    else if (NdisStatus == NDIS_STATUS_INVALID_OID)
        decode = "NDIS_STATUS_INVALID_OID\n";
    else if (NdisStatus == NDIS_STATUS_INVALID_LENGTH)
        decode = "NDIS_STATUS_INVALID_LENGTH\n";
    else if (NdisStatus == NDIS_STATUS_BUFFER_TOO_SHORT)
        decode = "NDIS_STATUS_BUFFER_TOO_SHORT\n";
    else if (NdisStatus == NDIS_STATUS_INVALID_DATA)
        decode = "NDIS_STATUS_INVALID_DATA\n";
    else if (NdisStatus == NDIS_STATUS_NOT_SUPPORTED)
        decode = "NDIS_STATUS_NOT_SUPPORTED\n";
    else if (NdisStatus == NDIS_STATUS_NOT_RECOGNIZED)
        decode = "NDIS_STATUS_NOT_RECOGNIZED\n";
    else if (NdisStatus == NDIS_STATUS_RESOURCES)
        decode = "NDIS_STATUS_RESOURCES\n";
    else if (NdisStatus == NDIS_STATUS_NOT_ACCEPTED)
        decode = "NDIS_STATUS_NOT_ACCEPTED\n";
    else if (NdisStatus == NDIS_STATUS_CLOSING)
        decode = "NDIS_STATUS_CLOSING\n";
    else if (NdisStatus == NDIS_STATUS_CLOSING_INDICATING)
        decode = "NDIS_STATUS_CLOSING_INDICATING\n";
    else if (NdisStatus == NDIS_STATUS_RESET_IN_PROGRESS)
        decode = "NDIS_STATUS_RESET_IN_PROGRESS\n";
    else if (NdisStatus == NDIS_STATUS_FAILURE)
        decode = "NDIS_STATUS_FAILURE\n";
    else if (NdisStatus == NDIS_STATUS_NO_CABLE)
        decode = "NDIS_STATUS_NO_CABLE\n";
    else if (NdisStatus != NDIS_STATUS_SUCCESS)
        decode = "SomethingUnexpected\n";

    KdPrint(("%s NDIS_STATUS=0x%8x=%s\n",msg,NdisStatus,decode));

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -