/*++ Copyright (c) 1998 Microsoft Corporation Module Name: ntcab.c Abstract: This is the source module for the nt cab file tool. This tool allows for the creation and modification of nt cab files. Author: Wesley Witt (wesw) 29-Sept-1998 Revision History: --*/ #include #include #include "ntcabapi.h" void Usage( void ) { printf( "\nMicrosoft (R) NT Cabinet Tool\n" ); printf( "Copyright (c) Microsoft Corp 1998. All rights reserved.\n\n" ); printf( "Usage: NTCAB [options] cabfile [@list] [files]\n\n" ); printf( "Options:\n" ); printf( " -c Create a new cab file\n" ); printf( " -a Add a file to the cabinet\n" ); printf( " -x Extract a file from the cabinet\n" ); } BOOL UserEnumFunc( const PNTCAB_ENUM_DATA EnumData, ULONG_PTR Context ) { printf( "%ws\n", EnumData->FileName ); return TRUE; } int __cdecl wmain( int argc, WCHAR *argv[] ) { PVOID hCab; ULONG i; HANDLE hFile; HANDLE hMap; PCHAR FileList; PCHAR s,e; WCHAR FileName[MAX_PATH]; BOOL CreateNewCab = FALSE; BOOL ExtractFile = FALSE; BOOL AddFile = FALSE; BOOL ListFile = FALSE; // // process any options // for (i=1; i<(ULONG)argc; i++) { if (argv[i][0] == L'/' || argv[i][0] == L'-') { switch (towlower(argv[i][1])) { case L'c': CreateNewCab = TRUE; break; case L'x': ExtractFile = TRUE; break; case L'a': AddFile = TRUE; break; case L'l': ListFile = TRUE; break; case L'?': Usage(); return 0; default: return -1; } } } if (ListFile) { hCab = NtCabInitialize(); if (hCab == NULL) { return -1; } if (!NtCabOpenCabFile( hCab, argv[2] )) { return -1; } NtCabEnumerateFiles( hCab, UserEnumFunc, 0 ); NtCabClose( hCab ); return 0; } if (ExtractFile) { hCab = NtCabInitialize(); if (hCab == NULL) { return -1; } if (!NtCabOpenCabFile( hCab, argv[2] )) { return -1; } if (!NtCabExtractOneFile( hCab, argv[3], NULL )) { return -1; } NtCabClose( hCab ); return 0; } if (AddFile) { hCab = NtCabInitialize(); if (hCab == NULL) { return -1; } if (!NtCabOpenCabFile( hCab, argv[2] )) { return -1; } if (!NtCabReplaceOneFile( hCab, argv[3] )) { return -1; } NtCabClose( hCab ); return 0; } if (CreateNewCab) { hCab = NtCabInitialize(); if (hCab == NULL) { return -1; } if (!NtCabCreateNewCabFile( hCab, argv[2] )) { return -1; } if (argv[3][0] == L'@') { // // use a response file for the file list // hFile = CreateFile( &argv[3][1], GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if (hFile == INVALID_HANDLE_VALUE) { return -1; } hMap = CreateFileMapping( hFile, NULL, PAGE_WRITECOPY, 0, 0, NULL ); if (hMap == NULL) { return -1; } FileList = MapViewOfFile( hMap, FILE_MAP_COPY, 0, 0, 0 ); if (FileList == NULL) { return -1; } s = FileList; while(1) { e = strchr(s,'\r'); if (e == NULL) { break; } *e = 0; MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED, s, -1, FileName, sizeof(FileName)/sizeof(WCHAR) ); NtCabCompressOneFile( hCab, FileName ); s = e + 2; } } else { // // use a file list off the command line // for (i=3; i<(ULONG)argc; i++) { NtCabCompressOneFile( hCab, argv[i] ); } } NtCabClose( hCab ); return 0; } return 0; }