📄 global.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 + -