mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
229 lines
5.3 KiB
229 lines
5.3 KiB
/*++
|
|
|
|
Copyright (c) 1996 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
tstpoint.c
|
|
|
|
Abstract:
|
|
|
|
Implementation of cluster test points
|
|
|
|
Author:
|
|
|
|
John Vert (jvert) 11/25/1996
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
#include "initp.h"
|
|
|
|
#ifdef CLUSTER_TESTPOINT
|
|
|
|
PTESTPOINT_ENTRY TestArray=NULL;
|
|
HANDLE gTestPtFileMapping;
|
|
|
|
extern DWORD CsTestPoint;
|
|
extern DWORD CsTestTrigger;
|
|
extern DWORD CsTestAction;
|
|
|
|
TESTPOINT_NAME TestPointNames[TestpointMax]={
|
|
L"JoinFailPetition", //0
|
|
L"FailNmJoinCluster", //1
|
|
L"FailRegisterIntraClusterRpc", //2
|
|
L"FailJoinCreateBindings", //3
|
|
L"FailJoinPetitionForMembership", //4
|
|
L"FailNmJoin", //5
|
|
L"FailDmJoin", //6
|
|
L"FailApiInitPhase1", //7
|
|
L"FailFmJoinPhase1", //8
|
|
L"FailDmUpdateJoinCluster", //9
|
|
L"FailEvInitialize", //10
|
|
L"FailNmJoinComplete", //11
|
|
L"FailApiInitPhase2", //12
|
|
L"FailFmJoinPhase2", //13
|
|
L"FailLogCommitSize", //14
|
|
L"FailClusterShutdown", //15
|
|
L"FailLocalXsaction", //16
|
|
L"FailOnlineResource", //17
|
|
L"FailSecurityInit", //18
|
|
L"FailOmInit", //19
|
|
L"FailEpInit", //20
|
|
L"FailDmInit", //21
|
|
L"FailNmInit", //22
|
|
L"FailGumInit", //23
|
|
L"FailFmInit", //24
|
|
L"FailLmInit", //25
|
|
L"FailCpInit", //26
|
|
L"FailNmPauseNode", //27
|
|
L"FailNmResumeNode", //28
|
|
L"FailNmEvictNodeAbort", //29
|
|
L"FailNmEvictNodeHalt", //30
|
|
L"FailNmCreateNetwork", //31
|
|
L"FailNmSetNetworkPriorityOrder", //32
|
|
L"FailNmSetNetworkPriorityOrder2", //33
|
|
L"FailNmSetNetworkCommonProperties", //34
|
|
L"FailNmSetInterfaceInfoAbort", //35
|
|
L"FailNmSetInterfaceInfoHalt", //36
|
|
L"FailPreMoveWithNodeDown", //37
|
|
L"FailPostMoveWithNodeDown", //38
|
|
L"FailFormNewCluster" //39
|
|
};
|
|
|
|
|
|
VOID
|
|
TestpointInit(
|
|
VOID
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Initializes the testpoint code.
|
|
|
|
Arguments:
|
|
|
|
None
|
|
|
|
Return Value:
|
|
|
|
None
|
|
|
|
--*/
|
|
|
|
{
|
|
DWORD ArraySize;
|
|
DWORD i;
|
|
|
|
//
|
|
// Create the array of testpoint entries in named shared memory.
|
|
//
|
|
ArraySize = sizeof(TESTPOINT_ENTRY)*TestpointMax;
|
|
gTestPtFileMapping = CreateFileMapping((HANDLE)-1,
|
|
NULL,
|
|
PAGE_READWRITE,
|
|
0,
|
|
ArraySize,
|
|
L"Cluster_Testpoints");
|
|
if (gTestPtFileMapping == NULL) {
|
|
CL_UNEXPECTED_ERROR( GetLastError() );
|
|
return;
|
|
}
|
|
|
|
TestArray = MapViewOfFile(gTestPtFileMapping,
|
|
FILE_MAP_READ | FILE_MAP_WRITE,
|
|
0,0,
|
|
ArraySize);
|
|
if (TestArray == NULL) {
|
|
CL_UNEXPECTED_ERROR( GetLastError() );
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Initialize test point array
|
|
//
|
|
for (i=0; i<TestpointMax; i++) {
|
|
lstrcpyW(TestArray[i].TestPointName,TestPointNames[i]);
|
|
if ( i == CsTestPoint ) {
|
|
TestArray[i].Trigger = CsTestTrigger;
|
|
TestArray[i].Action = CsTestAction;
|
|
} else {
|
|
TestArray[i].Trigger = TestTriggerNever;
|
|
TestArray[i].Action = TestActionTrue;
|
|
}
|
|
TestArray[i].HitCount = 0;
|
|
TestArray[i].TargetCount = 0;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
void TestpointDeInit()
|
|
{
|
|
|
|
if (TestArray) UnmapViewOfFile(TestArray);
|
|
if (gTestPtFileMapping) CloseHandle(gTestPtFileMapping);
|
|
return;
|
|
}
|
|
|
|
|
|
|
|
BOOL
|
|
TestpointCheck(
|
|
IN TESTPOINT Testpoint
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Checks a testpoint to see if it should fire.
|
|
|
|
Arguments:
|
|
|
|
Testpoint - Supplies the testpoint number.
|
|
|
|
Return Value:
|
|
|
|
TRUE if the testpoint has fired.
|
|
|
|
FALSE otherwise
|
|
|
|
--*/
|
|
|
|
{
|
|
PTESTPOINT_ENTRY Entry;
|
|
|
|
if (TestArray == NULL) {
|
|
return(FALSE);
|
|
}
|
|
Entry = &TestArray[Testpoint];
|
|
Entry->HitCount += 1;
|
|
|
|
switch (Entry->Trigger) {
|
|
case TestTriggerNever:
|
|
return(FALSE);
|
|
|
|
case TestTriggerAlways:
|
|
break;
|
|
|
|
case TestTriggerOnce:
|
|
Entry->Trigger = TestTriggerNever;
|
|
break;
|
|
|
|
case TestTriggerTargetCount:
|
|
if (Entry->HitCount == Entry->TargetCount) {
|
|
Entry->HitCount = 0;
|
|
break;
|
|
} else {
|
|
return(FALSE);
|
|
}
|
|
|
|
default:
|
|
CL_UNEXPECTED_ERROR( Entry->Trigger );
|
|
|
|
}
|
|
|
|
CsDbgPrint(LOG_CRITICAL,
|
|
"[TP] Testpoint %1!ws! being executed.\n",
|
|
TestPointNames[Testpoint] );
|
|
|
|
//
|
|
// The testpoint has fired, figure out what we are supposed to do.
|
|
//
|
|
switch (Entry->Action) {
|
|
case TestActionTrue:
|
|
return(TRUE);
|
|
case TestActionExit:
|
|
ExitProcess(Testpoint);
|
|
break;
|
|
|
|
case TestActionDebugBreak:
|
|
DebugBreak();
|
|
break;
|
|
|
|
}
|
|
return(FALSE);
|
|
}
|
|
|
|
#endif
|