243 lines
4.8 KiB
C
243 lines
4.8 KiB
C
/*++
|
|
|
|
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 <windows.h>
|
|
#include <stdio.h>
|
|
#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;
|
|
}
|