windows-nt/Source/XPSP1/NT/base/pnp/setupapi/tools/cabprep/cabprep.c

330 lines
12 KiB
C
Raw Permalink Normal View History

2020-09-26 03:20:57 -05:00
/*
Utility to do some processing in generation of the driver cab file
This tool takes a sorted list of files and checks and strips duplicates.
In addition, given a set of destination directories it will strip out files that don't exist in
any one of these directories. The preference is specified in the order that they are listed.
Author:
Vijesh Shetty (vijeshs) 29-Sep-1998
Revision History:
*/
#include "cabprep.h"
#define MAX_LOCATIONS 10
#define MAX_SETS 10
int _cdecl main ( int argc, char *argv[] );
int _cdecl main ( int argc, char *argv[] )
{
PTCHAR i,c;
TCHAR PreviousFile[MAX_PATH], FileNam[MAX_PATH], Path[MAX_SETS][MAX_LOCATIONS][MAX_PATH], DriverList[MAX_SETS][MAX_PATH];
TCHAR CompressedPath[MAX_PATH], Buffer[512], Section[MAX_SETS][MAX_PATH];
TCHAR CompPrependStr[MAX_PATH];
FILE *Read_File, *Error_File, *Index_File, *Write_File, *Make_File;
TCHAR Ddf_name[MAX_PATH];
struct _tfinddata_t c_file;
intptr_t h;
int StrLen,rem,e,count,Found,num_path[MAX_SETS],num_sets=0,count2;
if (argc < 2){
_tprintf( TEXT("CABPREP /s:SortedFile,CabName,[SourceLocation1],[SourceLocation2..] /s:[..]\n"));
_tprintf( TEXT("\n\nUtility to do some processing in generation of driver cab files.\n"));
_tprintf( TEXT("This tool takes a sorted list of files and checks and strips duplicates.\n"));
_tprintf( TEXT("In addition, given a set of destination directories it will strip out files\n"));
_tprintf( TEXT("that don't exist in any one of these directories. The Source location preference follows\n"));
_tprintf( TEXT("the order that they are specified in. Th tool checks for compressed files first\n"));
_tprintf( TEXT("and then the real name. Errors reported in cabprep.err and the index file\n"));
_tprintf( TEXT("created is drvindex.inf. Multiple sets can be given to create a single inf for many cabs.\n"));
_tprintf( TEXT("Don't use any spaces between parameters for a given set.\n"));
return 0;
}
if( argc >= 2 ){
num_sets = argc - 1;
for( count=0; count<num_sets; count++){
num_path[count] = 0;
#ifdef UNICODE
StrLen = MultiByteToWideChar(CP_ACP,
MB_PRECOMPOSED,
argv[count+1],
-1,
Buffer,
sizeof(Buffer)/sizeof(WCHAR)
);
if( !StrLen ){
_tprintf( TEXT("ERROR: Invalid Argument"));
return -1;
}
#else // !UNICODE
lstrcpy( Buffer, argv[count+1] );
#endif //UNICODE
Buffer[2] = L'\0';
if( lstrcmpi( Buffer, TEXT("/S"))){
_tprintf( TEXT("ERROR: Invalid Argument"));
return -1;
}
else{
i = Buffer + 3;
StrLen = lstrlen(i);
for( count2=0; count2 < StrLen; count2++ ){
if( i[count2] == L',' ){
i[count2] = L'\0';
num_path[count]++;
}
}
num_path[count] = num_path[count] - 1;
lstrcpy( DriverList[count], i );
if( !DriverList[count] ){
_tprintf( TEXT("ERROR: Invalid Source File"));
return -1;
}
i = i + lstrlen( i ) + 1;
lstrcpy( Section[count], i );
if( !Section[count] ){
_tprintf( TEXT("ERROR: Invalid Section Name"));
return -1;
}
i = i + lstrlen( i ) + 1;
if( num_path[count] > (MAX_LOCATIONS) ){
_tprintf( TEXT("ERROR: Exceeded maximum no. of paths"));
return( -1 );
}
for( count2=0;count2 < num_path[count]; count2++ ){
lstrcpy( Path[count][count2], i );
if( !Path[count][count2] ){
_tprintf( TEXT("ERROR: Invalid Path"));
return -1;
}
i = i + lstrlen( i ) + 1;
}
}
}
}
Index_File = _tfopen( TEXT("drvindex.inf"), TEXT("w") );
Make_File = _tfopen( TEXT("makefil0"), TEXT("w") );
_ftprintf( Index_File, TEXT("[Version]\n"));
_ftprintf( Index_File, TEXT("signature=\"$Windows NT$\"\n"));
_ftprintf( Index_File, TEXT("CabFiles=%s"), Section[0]);
_ftprintf( Make_File, TEXT("#*****Automatically generated file by cabprep.exe for the build proces************\n\n\n") );
_ftprintf( Make_File, TEXT("all: %s%s.cab"), Path[0][0], Section[0] );
for( count=1; count < num_sets; count++ ){
_ftprintf( Index_File, TEXT(",%s"), Section[count]);
_ftprintf( Make_File, TEXT(" disk1\\%s.cab"), Section[count] );
}
_ftprintf( Make_File, TEXT("\n\n\n") );
Error_File = _tfopen( TEXT("cabprep.err"), TEXT("w") );
for( count2=0; count2 < num_sets; count2++ ){
if( num_sets > 1)
wsprintf( Ddf_name, TEXT("Out%d.ddf"), count2); //use postfix digit for more than one cab
else
lstrcpy( Ddf_name, TEXT("Out.ddf") );
Write_File = _tfopen( Ddf_name, TEXT("w") );
_ftprintf( Write_File, TEXT(";*****Automatically generated file by cabprep.exe for Diamond************\n\n\n") );
_ftprintf( Index_File, TEXT("\n\n\n[%s]\n"), Section[count2]);
_ftprintf( Make_File, TEXT("\n%s%s.cab: "), Path[count2][0], Section[count2] );
_ftprintf( Write_File, TEXT(".New Cabinet\n") );
_ftprintf( Write_File, TEXT(".Set CabinetName%d=%s.cab\n"), (count2+1), Section[count2] );
_ftprintf( Write_File, TEXT(".Set MaxDiskSize=CDROM\n") );
_ftprintf( Write_File, TEXT(".Set CompressionType=LZX\n") );
_ftprintf( Write_File, TEXT(".Set CompressionMemory=21\n") );
_ftprintf( Write_File, TEXT(".Set CompressionLevel=1\n") );
_ftprintf( Write_File, TEXT(".Set Compress=ON\n") );
_ftprintf( Write_File, TEXT(".Set Cabinet=ON\n") );
_ftprintf( Write_File, TEXT(".Set UniqueFiles=ON\n") );
_ftprintf( Write_File, TEXT(".Set FolderSizeThreshold=1000000\n") );
_ftprintf( Write_File, TEXT(".Set MaxErrors=300\n\n\n\n") );
Read_File = _tfopen( DriverList[count2], TEXT("r") );
lstrcpy( PreviousFile, TEXT("$$$.#$$") );
if (Read_File) {
while( 1 ){
// HAck because of bug that doesn't allow the use of _TEOF. Bcoz of the bug
// fscanf returns EOF but fwscanf returns 0 when it should return 0xffff. So _TEOF
// is useless and causes us to loop.
#ifdef UNICODE
if( (_ftscanf( Read_File, TEXT("%s"), FileNam )) == 0 )
#else //UNICODE
if( (_ftscanf( Read_File, TEXT("%s"), FileNam )) == _TEOF )
#endif //UNICODE
break;
for( i = FileNam; i < FileNam + lstrlen( FileNam ); i++ ) {
*i = (TCHAR)towlower( *i );
}
if( lstrcmp( PreviousFile, FileNam )){
if(!num_path[count2]){
_ftprintf( Write_File, TEXT("%s\n"), FileNam );
_ftprintf( Make_File, TEXT("\\\n\t%s "), FileNam );
_ftprintf( Index_File, TEXT("%s\n"), FileNam );
}else{
//
//Do the cross checking only if we specify source paths. Otherwise ignore Path information.
//
Found = 0;
// Try for each path that was given to us first with the compressed name and then uncompressed
for( count=0; count<num_path[count2]; count++){
//
//Construct the compressed full pathname
//
lstrcpy( CompPrependStr, Path[count2][count] );
lstrcat( CompPrependStr, FileNam );
c = _tcsrchr( CompPrependStr, L'.' );
e = lstrlen(CompPrependStr);
rem = (int)(CompPrependStr + e - c - 1);
if( rem < 3 ){
CompPrependStr[e] = '_';
CompPrependStr[e+1] = '\0';
}
else
CompPrependStr[e-1] = '_';
//Look for the compressed file
h=_tfindfirst(CompPrependStr,&c_file);
if(h != -1){
_ftprintf( Write_File, TEXT("%s\n"), CompPrependStr );
_ftprintf( Make_File, TEXT("\\\n\t%s "), CompPrependStr );
_ftprintf( Index_File, TEXT("%s\n"), FileNam );
_findclose(h);
Found=1;
break;
}
else{
// Then the uncompressed path
_ftprintf( Error_File, TEXT("%s not found in %s \n"), CompPrependStr, Path[count2][count] );
lstrcpy( CompPrependStr, Path[count2][count] );
lstrcat( CompPrependStr, FileNam );
h=_tfindfirst(CompPrependStr,&c_file);
if(h != -1){
Found = 1;
_ftprintf( Write_File, TEXT("%s\n"), CompPrependStr );
_ftprintf( Make_File, TEXT("\\\n\t%s "), CompPrependStr );
_ftprintf( Index_File, TEXT("%s\n"), FileNam );
_findclose(h);
break;
}
_ftprintf( Error_File, TEXT("%s not found in %s \n"), CompPrependStr, Path[count2][count] );
}
}
if( !Found )
_ftprintf( Error_File, TEXT("%s missing from all locations \n"), CompPrependStr );
}
}
else
_ftprintf( Error_File, TEXT("Duplicate found - Removing %s\n"), FileNam );
lstrcpy( PreviousFile, FileNam );
}
}
clearerr(Read_File);
fflush(Read_File);
fclose(Read_File);
_ftprintf( Write_File, TEXT("\n\n\n\n") );
fclose(Write_File);
// The line below will try to run recab to find timestamp diffs only for the first sourcepath
_ftprintf( Make_File, TEXT("\n\trecab .\\drvindex.inf %s.cab %s delta.lst"),Section[count2], Path[count2][0] );
_ftprintf( Make_File, TEXT("\n\n"));
// Below lines are not needed with incremental cabs being available. Build process takes care of it
/*_ftprintf( Make_File, TEXT("\n\tdiamond /f %s"), Ddf_name );
_ftprintf( Make_File, TEXT("\n\tcopy /y disk1\\%s.cab %s%s.cab"),Section[count2], Path[count2][0], Section[count2] );
_ftprintf( Make_File, TEXT("\n\tdel /q disk1\\%s.cab\n\n\n\n"),Section[count2] );*/
}//For (count2)
_ftprintf( Index_File, TEXT("\n\n\n[Cabs]\n"));
for( count=0; count < num_sets; count++ ){
_ftprintf( Index_File, TEXT("%s=%s.cab\n"), Section[count],Section[count]);
}
_flushall();
_fcloseall();
return 0;
}