/*++ 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; }