226 lines
4.3 KiB
C
226 lines
4.3 KiB
C
|
/******************************************************************************
|
||
|
*
|
||
|
* Copyright (c) 1999 Microsoft Corporation
|
||
|
*
|
||
|
* Module Name:
|
||
|
* blob.c
|
||
|
*
|
||
|
* Abstract:
|
||
|
* This file contains the implementation for r0 blob functions.
|
||
|
*
|
||
|
* Revision History:
|
||
|
* Kanwaljit S Marok ( kmarok ) 05/17/99
|
||
|
* created
|
||
|
*
|
||
|
*****************************************************************************/
|
||
|
|
||
|
#define RING3
|
||
|
|
||
|
#include "common.h"
|
||
|
#include "pathtree.h"
|
||
|
|
||
|
static char * blobTypArr[] = {
|
||
|
"BLOB_TYPE_CONFIG",
|
||
|
"BLOB_TYPE_PATHTREE",
|
||
|
"BLOB_TYPE_HASHLIST",
|
||
|
"BLOB_TYPE_CONTAINER"
|
||
|
};
|
||
|
|
||
|
#define PRINT_BLOB_HEADER( pBlob ) \
|
||
|
printf( "\nBlob: %s, Size: %ld, Version: %ld, Entries: %ld \n",\
|
||
|
blobTypArr[((BlobHeader *)pBlob)->m_dwBlbType], \
|
||
|
((BlobHeader *)pBlob)->m_dwMaxSize, \
|
||
|
((BlobHeader *)pBlob)->m_dwVersion, \
|
||
|
((BlobHeader *)pBlob)->m_dwEntries)
|
||
|
|
||
|
#define COMMON_FILE_HANDLE HANDLE
|
||
|
|
||
|
static __inline COMMON_FILE_HANDLE
|
||
|
COMMON_FILE_OPEN_READ (
|
||
|
PCHAR szFileName
|
||
|
)
|
||
|
{
|
||
|
COMMON_FILE_HANDLE handle;
|
||
|
|
||
|
handle = CreateFile( szFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
|
||
|
|
||
|
if( handle != INVALID_HANDLE_VALUE )
|
||
|
return handle;
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static __inline COMMON_FILE_HANDLE
|
||
|
COMMON_FILE_OPEN_WRITE (
|
||
|
PCHAR szFileName
|
||
|
)
|
||
|
{
|
||
|
COMMON_FILE_HANDLE handle;
|
||
|
|
||
|
handle = CreateFile( szFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
|
||
|
|
||
|
if( handle != INVALID_HANDLE_VALUE )
|
||
|
return handle;
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
static __inline VOID
|
||
|
COMMON_FILE_CLOSE (
|
||
|
COMMON_FILE_HANDLE fh)
|
||
|
{
|
||
|
if ( fh )
|
||
|
CloseHandle( fh );
|
||
|
}
|
||
|
|
||
|
static __inline DWORD
|
||
|
COMMON_FILE_READ (
|
||
|
COMMON_FILE_HANDLE fh,
|
||
|
DWORD offset,
|
||
|
VOID *buffer,
|
||
|
DWORD dwBytes
|
||
|
)
|
||
|
{
|
||
|
DWORD dwBytesRead = 0;
|
||
|
|
||
|
ReadFile( fh, buffer, dwBytes, &dwBytesRead, NULL );
|
||
|
|
||
|
return dwBytesRead;
|
||
|
}
|
||
|
|
||
|
static __inline DWORD
|
||
|
COMMON_FILE_WRITE (
|
||
|
COMMON_FILE_HANDLE fh,
|
||
|
DWORD offset,
|
||
|
VOID *buffer,
|
||
|
DWORD dwBytes
|
||
|
)
|
||
|
{
|
||
|
DWORD dwBytesWrite = 0;
|
||
|
|
||
|
WriteFile( fh, buffer, dwBytes, &dwBytesWrite, NULL );
|
||
|
|
||
|
return dwBytesWrite;
|
||
|
}
|
||
|
|
||
|
PBYTE
|
||
|
CreateBlobFromFile(
|
||
|
PCHAR pszBlob );
|
||
|
|
||
|
DWORD
|
||
|
CreateCfgBlob(
|
||
|
PCHAR pszBlob,
|
||
|
PCHAR pszTree,
|
||
|
PCHAR pszList );
|
||
|
|
||
|
PBYTE
|
||
|
ReadCfgBlob(
|
||
|
PCHAR pszBlob,
|
||
|
PBYTE * pTree,
|
||
|
PBYTE * pList,
|
||
|
DWORD * pdwDefaultType);
|
||
|
|
||
|
//
|
||
|
// WriteBlobToFile : Writes the given memory blob into the file.
|
||
|
//
|
||
|
|
||
|
DWORD
|
||
|
WriteBlobToFile (
|
||
|
PCHAR pszBlob,
|
||
|
PBYTE pBlob
|
||
|
)
|
||
|
{
|
||
|
COMMON_FILE_HANDLE fh;
|
||
|
BlobHeader * pBlobHeader = (BlobHeader *)pBlob;
|
||
|
|
||
|
fh = COMMON_FILE_OPEN_WRITE( pszBlob ) ;
|
||
|
|
||
|
if ( fh )
|
||
|
{
|
||
|
COMMON_FILE_WRITE( fh, 0, pBlob, pBlobHeader->m_dwMaxSize );
|
||
|
COMMON_FILE_CLOSE( fh );
|
||
|
return BLOB_MAXSIZE( pBlob );
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// CreateBlobFromFile: This function reads a given file into memory as
|
||
|
// a blob.
|
||
|
//
|
||
|
|
||
|
PBYTE
|
||
|
CreateBlobFromFile(
|
||
|
PCHAR szBlobFile
|
||
|
)
|
||
|
{
|
||
|
BYTE * pBlob = NULL ;
|
||
|
COMMON_FILE_HANDLE fh;
|
||
|
BlobHeader blobHeader;
|
||
|
|
||
|
fh = COMMON_FILE_OPEN_READ( szBlobFile );
|
||
|
|
||
|
//
|
||
|
// TODO : Need to do sanity checking on the dat file.
|
||
|
//
|
||
|
|
||
|
if( fh )
|
||
|
{
|
||
|
if( COMMON_FILE_READ( fh, 0, &blobHeader, sizeof(blobHeader) ) )
|
||
|
{
|
||
|
pBlob = ALLOCATE( blobHeader.m_dwMaxSize );
|
||
|
|
||
|
#ifdef RING3
|
||
|
//
|
||
|
// BUGBUG : need to reset file pointer
|
||
|
//
|
||
|
|
||
|
COMMON_FILE_CLOSE( fh );
|
||
|
fh = COMMON_FILE_OPEN_READ( szBlobFile );
|
||
|
#endif
|
||
|
|
||
|
if(pBlob)
|
||
|
{
|
||
|
COMMON_FILE_READ( fh, 0, pBlob, blobHeader.m_dwMaxSize );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
COMMON_FILE_CLOSE(fh);
|
||
|
}
|
||
|
|
||
|
return pBlob;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// ReadCfgBlob: Reads the given file a returns pointers to the
|
||
|
// Incl/Excl tree blob and the hashed list of extensions.
|
||
|
//
|
||
|
|
||
|
|
||
|
BYTE *
|
||
|
ReadCfgBlob(
|
||
|
PCHAR pszBlob,
|
||
|
PBYTE * pTree,
|
||
|
PBYTE * pList,
|
||
|
DWORD * pdwDefaultType
|
||
|
)
|
||
|
{
|
||
|
BYTE * pBlob = NULL;
|
||
|
|
||
|
if( !pszBlob || !pTree || !pList || !pdwDefaultType )
|
||
|
return NULL;
|
||
|
|
||
|
*pTree = *pList = NULL;
|
||
|
|
||
|
if( pBlob = CreateBlobFromFile( pszBlob ) )
|
||
|
{
|
||
|
*pTree = pBlob + sizeof(BlobHeader);
|
||
|
*pList = *pTree + BLOB_MAXSIZE( *pTree );
|
||
|
|
||
|
*pdwDefaultType = TREE_HEADER((*pTree))->m_dwDefault;
|
||
|
}
|
||
|
|
||
|
return pBlob;
|
||
|
}
|