676 lines
14 KiB
C
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;
|
||
|
}
|