windows-nt/Source/XPSP1/NT/admin/pchealth/sr/tools/fldump/fldump.c
2020-09-26 16:20:57 +08:00

676 lines
14 KiB
C

/*++
Copyright (c) 1998-1999 Microsoft Corporation
Module Name:
fldump.c
Abstract:
this file dumps the contents of the dat file in readable form
Author:
Kanwaljit Marok (kmarok) 01-May-2000
Revision History:
--*/
#define RING3
#include "common.h"
#include "pathtree.h"
#include "hashlist.h"
//
// INCLUDE the common source files from kernel directory
//
#define _PRECOMP_H_ // don't include the sr\kernel precomp header
#include "ptree.c"
#include "hlist.c"
#include "blob.c"
#include "verifyBlob.c"
static char * nodeTypArr[] = {
"UNKNOWN",
"INCLUDE",
"EXCLUDE",
};
//
// GetNodeTypeStr : Returns node type string
//
PCHAR
GetNodeTypeStr(
INT iNodeType
)
{
return nodeTypArr[ iNodeType ];
}
//
// Ring 3 test code routines begin here
//
VOID
PrintList(
PBYTE pList,
INT iNode,
INT levelIn
)
{
while ( iNode )
{
ListEntry * node = LIST_NODEPTR(pList, iNode);
INT cbChars = (*(wchar_t*)( pList + node->m_dwData ) - 2)/2;
INT level = levelIn;
while( level-- )
printf(" ");
printf(" - %*.*S (%d, %d, %8.8s)\n",
cbChars, cbChars,
pList + node->m_dwData + sizeof(wchar_t),
iNode,
*(wchar_t*)( pList + node->m_dwData ),
GetNodeTypeStr(node->m_dwType));
iNode = node->m_iNext;
}
}
//
// This functions formats and prints the list
//
VOID
PrintListFormatted(
PBYTE pList,
INT level
)
{
if( pList )
{
INT i;
for( i=0; i<(INT)LIST_HEADER(pList)->m_iHashBuckets; i++ )
{
INT iNode;
if( (iNode = HASH_BUCKET(pList, i) ) == 0 )
continue;
PrintList( pList, iNode, level );
}
}
}
//
// PrintNode: Prints out a node in proper format depending on level.
//
VOID
PrintNode(
PBYTE pTree,
INT iNode,
INT levelIn
)
{
TreeNode * node = TREE_NODEPTR(pTree, iNode);
INT cbChars = (*(wchar_t*)( pTree + node->m_dwData ) - sizeof(wchar_t))/sizeof(wchar_t);
INT level = levelIn;
while( level-- )
printf(" ");
printf("%*.*S (%d, %d, %8.8s, 0x%8.8X)\n",
cbChars, cbChars,
pTree + node->m_dwData + sizeof(wchar_t),
iNode,
*(wchar_t*)( pTree + node->m_dwData ),
GetNodeTypeStr(node->m_dwType),
node->m_dwFlags
);
if( node->m_dwFileList )
PrintListFormatted( pTree + node->m_dwFileList, levelIn );
}
//
// PrintTreeFormatted: prints out the tree blod in readable form
//
VOID PrintTreeFormatted(
PBYTE pTree,
INT iNode,
INT *pLevel )
{
TreeNode * node = TREE_NODEPTR(pTree, iNode);
PrintNode( pTree, iNode, *pLevel );
(*pLevel)++;
if(node->m_iSon)
{
TreeNode * son = TREE_NODEPTR(pTree, node->m_iSon);
INT iSonSibling = son->m_iSibling;
PrintTreeFormatted(pTree, node->m_iSon, pLevel);
while(iSonSibling)
{
TreeNode * sonSibling = TREE_NODEPTR(pTree, iSonSibling);
PrintTreeFormatted(pTree, iSonSibling, pLevel);
iSonSibling = sonSibling->m_iSibling;
}
}
(*pLevel)--;
}
//
// TestLookup : This function tests a sample lookup
//
VOID TestLookup(
PBYTE pTree,
PBYTE pList
)
{
INT i = 0;
INT iNode = -1;
INT iType = 0;
INT iLevel = 0;
INT iDrive = DRIVE_INDEX(L'C');
BOOL fFileMatch = FALSE;
BYTE pPathTmp[ MAX_PPATH_SIZE ];
LPWSTR pLookupStr = NULL;
PUNICODE_STRING pUStr = NULL;
if ( !pTree )
{
goto Exit;
}
printf("\n\nTesting some sample lookups in the tree.\n\n\n" );
pLookupStr = L"\\device\\harddiskVolume1\\Winnt\\system32";
if ( ConvertToParsedPath(
pLookupStr,
(USHORT)lstrlenW(pLookupStr),
pPathTmp,
sizeof(pPathTmp)) )
{
printf("Looking up : %S\n\t", pLookupStr);
if( MatchPrefix(
pTree,
TREE_ROOT_NODE,
((path_t)pPathTmp)->pp_elements,
&iNode,
&iLevel,
&iType,
NULL,
&fFileMatch) )
{
printf("Found. N:%d L:%d T:%d\n", iNode, iLevel, iType);
}
else
{
printf("Not found .\n");
}
}
else
{
printf( "ConvertToParsedPath Not found\n");
}
iLevel = iType= 0;
//
// Test File match
//
pLookupStr = L"\\device\\harddiskVolume1\\Winnt\\system32\\mshtml.tlb";
if ( ConvertToParsedPath(
pLookupStr,
(USHORT)lstrlenW(pLookupStr),
pPathTmp,
sizeof(pPathTmp)) )
{
printf("Looking up : %S\n\t", pLookupStr);
if( MatchPrefix(
pTree,
TREE_ROOT_NODE,
((path_t)pPathTmp)->pp_elements,
&iNode,
&iLevel,
&iType,
NULL,
&fFileMatch) )
{
printf("Found. N:%d L:%d T:%d\n", iNode, iLevel, iType);
}
else
{
printf("Not Found.\n");
}
}
else
{
printf( "ConvertToParsedPath Not found\n");
}
iLevel = iType= 0;
//
// Test File match
//
pLookupStr = L"\\??\\d:\\sr-wstress\\RF_0_7742.dll";
if ( ConvertToParsedPath(
pLookupStr,
(USHORT)lstrlenW(pLookupStr),
pPathTmp,
sizeof(pPathTmp)) )
{
printf("Looking up : %S\n\t", pLookupStr);
if( MatchPrefix(
pTree,
TREE_ROOT_NODE,
((path_t)pPathTmp)->pp_elements,
&iNode,
&iLevel,
&iType,
NULL,
&fFileMatch) )
{
printf("Found. N:%d L:%d T:%d\n", iNode, iLevel, iType);
}
else
{
printf("Not Found.\n");
}
}
else
{
printf( "ConvertToParsedPath Not found\n");
}
iLevel = iType= 0;
//
// Test a wildcard in the path
//
pLookupStr = L"\\device\\harddiskVolume1\\wildcards\\kmarok\\xyz";
if ( ConvertToParsedPath(
pLookupStr,
(USHORT)lstrlenW(pLookupStr),
pPathTmp,
sizeof(pPathTmp)) )
{
printf("Looking up : %S\n\t", pLookupStr);
if( MatchPrefix(
pTree,
TREE_ROOT_NODE,
((path_t)pPathTmp)->pp_elements,
&iNode,
&iLevel,
&iType,
NULL,
&fFileMatch) )
{
printf("Found. N:%d L:%d T:%d\n", iNode, iLevel, iType);
}
else
{
printf("Not Found .\n");
}
}
else
{
printf( "ConvertToParsedPath Not found\n");
}
//
// Test a wildcard in the path
//
pLookupStr = L"\\device\\harddiskVolume1\\wildcards\\kmarok";
if ( ConvertToParsedPath(
pLookupStr,
(USHORT)lstrlenW(pLookupStr),
pPathTmp,
sizeof(pPathTmp)) )
{
printf("Looking up : %S\n\t", pLookupStr);
if( MatchPrefix(
pTree,
TREE_ROOT_NODE,
((path_t)pPathTmp)->pp_elements,
&iNode,
&iLevel,
&iType,
NULL,
&fFileMatch) )
{
printf("Found. N:%d L:%d T:%d\n", iNode, iLevel, iType);
}
else
{
printf("Not Found .\n");
}
}
else
{
printf( "ConvertToParsedPath Not found\n");
}
iLevel = iType= 0;
//
// Test a wildcard in the path
//
pLookupStr = L"\\device\\harddiskVolume1\\wildcards\\kmarok\\abc";
if ( ConvertToParsedPath(
pLookupStr,
(USHORT)lstrlenW(pLookupStr),
pPathTmp,
sizeof(pPathTmp)) )
{
printf("Looking up : %S\n\t", pLookupStr);
if( MatchPrefix(
pTree,
TREE_ROOT_NODE,
((path_t)pPathTmp)->pp_elements,
&iNode,
&iLevel,
&iType,
NULL,
&fFileMatch) )
{
printf("Found. N:%d L:%d T:%d\n", iNode, iLevel, iType);
}
else
{
printf("Not Found .\n");
}
}
else
{
printf( "ConvertToParsedPath Not found\n");
}
iLevel = iType= 0;
//
// Test a root level path
//
pLookupStr = L"\\device\\harddiskVolume1\\boot.ini";
if ( ConvertToParsedPath(
pLookupStr,
(USHORT)lstrlenW(pLookupStr),
pPathTmp,
sizeof(pPathTmp)) )
{
printf("Looking up : %S\n\t", pLookupStr);
if( MatchPrefix(
pTree,
TREE_ROOT_NODE,
((path_t)pPathTmp)->pp_elements,
&iNode,
&iLevel,
&iType,
NULL,
&fFileMatch) )
{
printf("Found. N:%d L:%d T:%d\n", iNode, iLevel, iType);
}
else
{
printf("Not found .\n");
}
}
else
{
printf( "ConvertToParsedPath Not found\n");
}
//
// test a failure
//
iLevel = iType= 0;
pLookupStr = L"\\device\\harddiskVolume1\\Winnt\\system320";
if ( ConvertToParsedPath(
pLookupStr,
(USHORT)lstrlenW(pLookupStr),
pPathTmp,
sizeof(pPathTmp)) )
{
printf("Looking up : %S\n\t", pLookupStr);
if( MatchPrefix(
pTree,
TREE_ROOT_NODE,
((path_t)pPathTmp)->pp_elements,
&iNode,
&iLevel,
&iType,
NULL,
&fFileMatch) )
{
printf("Found. N:%d L:%d T:%d\n", iNode, iLevel, iType);
}
else
{
printf("Not found .\n");
}
}
else
{
printf( "ConvertToParsedPath Not found\n");
}
//
// Test extension match
//
pLookupStr = L"PWERPNT.INI";
pUStr = (PUNICODE_STRING)pPathTmp;
pUStr->Buffer = (PWCHAR)(pUStr + 1);
pUStr->Length = (USHORT)(lstrlenW(pLookupStr) * sizeof(WCHAR));
pUStr->MaximumLength = pUStr->Length;
RtlCopyMemory( pUStr->Buffer, pLookupStr, pUStr->Length );
pUStr->Buffer[lstrlenW(pLookupStr)] = UNICODE_NULL;
{
printf("Looking up : %S\n\t", pLookupStr);
if( MatchExtension(
pList,
pUStr,
&iType,
&fFileMatch ) )
{
printf("Found. T:%d, HasExtension :%d\n", iType, fFileMatch);
}
else
{
printf("Not found .\n");
}
}
//
// Test extension match
//
pLookupStr = L"PWERPNT.ini";
pUStr = (PUNICODE_STRING)pPathTmp;
pUStr->Buffer = (PWCHAR)(pUStr + 1);
pUStr->Length = (USHORT)(lstrlenW(pLookupStr) * sizeof(WCHAR));
pUStr->MaximumLength = pUStr->Length;
RtlCopyMemory( pUStr->Buffer, pLookupStr, pUStr->Length );
pUStr->Buffer[lstrlenW(pLookupStr)] = UNICODE_NULL;
{
printf("Looking up : %S\n\t", pLookupStr);
if( MatchExtension(
pList,
pUStr,
&iType,
&fFileMatch ) )
{
printf("Found. T:%d, HasExtension :%d\n", iType, fFileMatch);
}
else
{
printf("Not found .\n");
}
}
//
// Test extension match
//
pLookupStr = L"PWERPNT";
pUStr = (PUNICODE_STRING)pPathTmp;
pUStr->Buffer = (PWCHAR)(pUStr + 1);
pUStr->Length = (USHORT)(lstrlenW(pLookupStr) * sizeof(WCHAR));
pUStr->MaximumLength = pUStr->Length;
RtlCopyMemory( pUStr->Buffer, pLookupStr, pUStr->Length );
pUStr->Buffer[lstrlenW(pLookupStr)] = UNICODE_NULL;
{
printf("Looking up : %S\n\t", pLookupStr);
if( MatchExtension(
pList,
pUStr,
&iType,
&fFileMatch ) )
{
printf("Found. T:%d, HasExtension :%d\n", iType, fFileMatch);
}
else
{
printf("Not found .\n");
}
}
Exit:
return;
}
//
// Main function
//
int __cdecl
main(
int argc,
char * argv[]
)
{
BYTE *pBlob, *pTree=NULL, *pList=NULL;
BOOL fFound = FALSE;
PCHAR pszFileName = "filelist.dat";
DWORD dwDefaultType = NODE_TYPE_UNKNOWN;
if( argc != 1 )
{
if( argc >= 2 && !strcmp( argv[1], "-t" ))
{
fFound = TRUE;
}
if( argc == 2 )
{
if( !fFound )
pszFileName = argv[1];
goto cont;
}
if( argc == 3 && fFound )
{
pszFileName = argv[2];
goto cont;
}
printf("USAGE: %s [-t] [filename] \n\n ", argv[0]);
return 0;
}
cont:
if( pBlob = ReadCfgBlob( pszFileName, &pTree, &pList, &dwDefaultType ) )
{
if (!VerifyBlob((DWORD_PTR)pBlob)) {
printf("BLOB validation failed\n");
return 1;
}
PRINT_BLOB_HEADER(pBlob);
printf("Default NodeType : %s\n", GetNodeTypeStr(dwDefaultType) );
if( pTree )
{
INT level = 0;
PRINT_BLOB_HEADER ( pTree );
PrintTreeFormatted( pTree, 0, &level );
}
if( pList )
{
INT level = 0;
PRINT_BLOB_HEADER ( pList );
PrintListFormatted( pList, 0 );
}
}
else
printf( "Error: Not found to load the %s.\n", pszFileName );
if (fFound && pTree && pList)
{
TestLookup( pTree, pList );
}
return 0;
}