/*********************************************************************** * GetExpandedNameW (KERNEL32.@) */ INT WINAPI GetExpandedNameW( LPWSTR in, LPWSTR out ) { INT ret; DWORD len = WideCharToMultiByte( CP_ACP, 0, in, -1, NULL, 0, NULL, NULL ); char *xin = HeapAlloc( GetProcessHeap(), 0, len ); char *xout = HeapAlloc( GetProcessHeap(), 0, len+3 ); WideCharToMultiByte( CP_ACP, 0, in, -1, xin, len, NULL, NULL ); if ((ret = GetExpandedNameA( xin, xout )) > 0) MultiByteToWideChar( CP_ACP, 0, xout, -1, out, strlenW(in)+4 ); HeapFree( GetProcessHeap(), 0, xin ); HeapFree( GetProcessHeap(), 0, xout ); return ret; }
/*********************************************************************** * GetExpandedNameW (KERNEL32.@) */ INT WINAPI GetExpandedNameW( LPWSTR in, LPWSTR out ) { INT ret; DWORD len; char *xin, *xout; len = WideCharToMultiByte( CP_ACP, 0, in, -1, NULL, 0, NULL, NULL ); xin = RtlAllocateHeap( RtlGetProcessHeap(), 0, len ); if (xin == NULL) return LZERROR_BADVALUE; xout = RtlAllocateHeap( RtlGetProcessHeap(), 0, len+3 ); if (xout == NULL) { RtlFreeHeap( RtlGetProcessHeap(), 0, xin ); return LZERROR_BADVALUE; } WideCharToMultiByte( CP_ACP, 0, in, -1, xin, len, NULL, NULL ); if ((ret = GetExpandedNameA( xin, xout )) > 0) MultiByteToWideChar( CP_ACP, 0, xout, -1, out, wcslen(in)+4 ); RtlFreeHeap( RtlGetProcessHeap(), 0, xin ); RtlFreeHeap( RtlGetProcessHeap(), 0, xout ); return ret; }
/*********************************************************************** * GetExpandedName (LZEXPAND.10) */ INT16 WINAPI GetExpandedName16( LPSTR in, LPSTR out ) { return (INT16)GetExpandedNameA( in, out ); }
int main(int argc, char *argv[]) { int ret = 0; char infile[MAX_PATH], outfile[MAX_PATH], actual_name[MAX_PATH]; char outfile_basename[MAX_PATH], *basename_index; UINT comp; if (argc < 3) { myprintf( "Usage:\n" ); myprintf( "\t%s infile outfile\n", argv[0] ); myprintf( "\t%s /r infile\n", argv[0] ); return 1; } if (argc == 3 && (option_equal(argv[1], "R") || option_equal(argv[1], "r"))) GetFullPathNameA( argv[2], sizeof(infile), infile, NULL ); else GetFullPathNameA( argv[1], sizeof(infile), infile, NULL ); if (!SetupGetFileCompressionInfoExA( infile, actual_name, sizeof(actual_name), NULL, NULL, NULL, &comp )) { myprintf( "%s: can't open input file %s\n", argv[0], infile ); return 1; } if (argc == 3 && (option_equal(argv[1], "R") || option_equal(argv[1], "r"))) { switch (comp) { case FILE_COMPRESSION_MSZIP: outfile_basename[0] = 0; if (!SetupIterateCabinetA( infile, 0, set_outfile, outfile_basename )) { myprintf( "%s: can't determine original name\n", argv[0] ); return 1; } GetFullPathNameA( infile, sizeof(outfile), outfile, &basename_index ); *basename_index = 0; strcat( outfile, outfile_basename ); break; case FILE_COMPRESSION_WINLZA: GetExpandedNameA( infile, outfile_basename ); break; default: myprintf( "%s: can't determine original\n", argv[0] ); return 1; } } else GetFullPathNameA( argv[2], sizeof(outfile), outfile, NULL ); if (!lstrcmpiA( infile, outfile )) { myprintf( "%s: can't expand file to itself\n", argv[0] ); return 1; } switch (comp) { case FILE_COMPRESSION_MSZIP: if (!SetupIterateCabinetA( infile, 0, extract_callback, outfile )) { myprintf( "%s: cabinet extraction failed\n", argv[0] ); return 1; } break; case FILE_COMPRESSION_WINLZA: { INT hin, hout; OFSTRUCT ofin, ofout; LONG error; if ((hin = LZOpenFileA( infile, &ofin, OF_READ )) < 0) { myprintf( "%s: can't open input file %s\n", argv[0], infile ); return 1; } if ((hout = LZOpenFileA( outfile, &ofout, OF_CREATE | OF_WRITE )) < 0) { LZClose( hin ); myprintf( "%s: can't open output file %s\n", argv[0], outfile ); return 1; } error = LZCopy( hin, hout ); LZClose( hin ); LZClose( hout ); if (error < 0) { myprintf( "%s: LZCopy failed, error is %d\n", argv[0], error ); return 1; } break; } default: if (!CopyFileA( infile, outfile, FALSE )) { myprintf( "%s: CopyFileA failed\n", argv[0] ); return 1; } break; } return ret; }