NT4/private/ntos/config/cmchek2.c
2020-09-30 17:12:29 +02:00

115 lines
2.9 KiB
C

/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
cmchek2.c
Abstract:
This module implements consistency checking for the registry.
Author:
Bryan M. Willman (bryanwi) 27-Jan-92
Environment:
Revision History:
--*/
#include "cmp.h"
#ifdef ALLOC_PRAGMA
#pragma alloc_text(PAGE,CmpValidateHiveSecurityDescriptors)
#endif
extern ULONG CmpUsedStorage;
BOOLEAN
CmpValidateHiveSecurityDescriptors(
IN PHHIVE Hive
)
/*++
Routine Description:
Walks the list of security descriptors present in the hive and passes
each security descriptor to RtlValidSecurityDescriptor.
Only applies to descriptors in Stable store. Those in Volatile store
cannot have come from disk and therefore do not need this treatment
anyway.
Arguments:
Hive - Supplies pointer to the hive control structure
Return Value:
TRUE - All security descriptors are valid
FALSE - At least one security descriptor is invalid
--*/
{
PCM_KEY_NODE RootNode;
PCM_KEY_SECURITY SecurityCell;
HCELL_INDEX ListAnchor;
HCELL_INDEX NextCell;
HCELL_INDEX LastCell;
CMLOG(CML_FLOW, CMS_SEC) {
KdPrint(("CmpValidateHiveSecurityDescriptor: Hive = %lx\n",(ULONG)Hive));
}
if (!HvIsCellAllocated(Hive,Hive->BaseBlock->RootCell)) {
//
// root cell HCELL_INDEX is bogus
//
return(FALSE);
}
RootNode = (PCM_KEY_NODE) HvGetCell(Hive, Hive->BaseBlock->RootCell);
ListAnchor = NextCell = RootNode->u1.s1.Security;
do {
if (!HvIsCellAllocated(Hive, NextCell)) {
CMLOG(CML_MAJOR, CMS_SEC) {
KdPrint(("CM: CmpValidateHiveSecurityDescriptors\n"));
KdPrint((" NextCell: %08lx is invalid HCELL_INDEX\n",NextCell));
}
return(FALSE);
}
SecurityCell = (PCM_KEY_SECURITY) HvGetCell(Hive, NextCell);
if (NextCell != ListAnchor) {
//
// Check to make sure that our Blink points to where we just
// came from.
//
if (SecurityCell->Blink != LastCell) {
CMLOG(CML_MAJOR, CMS_SEC) {
KdPrint((" Invalid Blink (%ld) on security cell %ld\n",SecurityCell->Blink, NextCell));
KdPrint((" should point to %ld\n", LastCell));
}
return(FALSE);
}
}
CMLOG(CML_MINOR, CMS_SEC) {
KdPrint(("CmpValidSD: SD shared by %d nodes\n",SecurityCell->ReferenceCount));
}
if (!SeValidSecurityDescriptor(SecurityCell->DescriptorLength, &SecurityCell->Descriptor)) {
CMLOG(CML_MAJOR, CMS_SEC) {
CmpDumpSecurityDescriptor(&SecurityCell->Descriptor,"INVALID DESCRIPTOR");
}
return(FALSE);
}
SetUsed(Hive, NextCell);
LastCell = NextCell;
NextCell = SecurityCell->Flink;
} while ( NextCell != ListAnchor );
return(TRUE);
}