#include #include "textmode.h" #include "spcab.h" const PRTL_ALLOCATE_STRING_ROUTINE RtlAllocateStringRoutine = SpMemAlloc; const PRTL_FREE_STRING_ROUTINE RtlFreeStringRoutine = SpMemFree; WCHAR TemporaryBuffer[16384]; PWSTR SpCabDupStringW(PCWSTR s) { if (s == NULL) return NULL; else { PWSTR q = (PWSTR)RtlAllocateHeap(RtlProcessHeap(), 0, (wcslen(s) + 1) * sizeof(*q)); if (q) wcscpy(q, s); return q; } } PVOID SpMemAlloc(SIZE_T n) { return RtlAllocateHeap(RtlProcessHeap(), 0, n); } VOID SpMemFree(PVOID p) { RtlFreeHeap(RtlProcessHeap(), 0, p); } PVOID SpMemRealloc( IN PVOID Block, IN SIZE_T NewSize ) { return RtlReAllocateHeap(RtlProcessHeap(), 0, Block, NewSize); } int g_argi = 0; void CabTestCreateW(int argc, wchar_t** argv) { CCABHANDLE CabHandle; wchar_t** LocalArgv = argv + g_argi; CabHandle = SpCabCreateCabinetW(LocalArgv[1], (LocalArgv[1][0] != 0) ? LocalArgv[2] : NULL, (LocalArgv[3][0] != 0) ? LocalArgv[3] : NULL, 0); SpCabAddFileToCabinetW(CabHandle, LocalArgv[4], (LocalArgv[5] != NULL && LocalArgv[5][0] != 0) ? LocalArgv[5] : LocalArgv[4]); SpCabFlushAndCloseCabinetEx(CabHandle, NULL, NULL, NULL, NULL); g_argi += 4; g_argi += (LocalArgv[5] != NULL); /* SpCabCreateCabinetExW(0,0); SpCabOpenCabinetW(0); SpCabExtractAllFilesExW(0,0,0); SpCabCloseCabinetW(0); SpCabCreateCabinetA(0,0,0,0); SpCabCreateCabinetExA(0,0); SpCabOpenCabinetA(0); SpCabExtractAllFilesExA(0,0,0); SpCabCloseCabinetA(0); */ } BOOL CabTestExtractFileCallbackW(PCWSTR File) { printf("extracting %ls\n", File); return TRUE; } BOOL CabTestExtractFileCallbackA(PCSTR File) { printf("extracting %s\n", File); return TRUE; } void CabTestExtractW(int argc, wchar_t** argv) { CCABHANDLE CabHandle; wchar_t** LocalArgv = argv + g_argi; CabHandle = SpCabOpenCabinetW(LocalArgv[1]); SpCabExtractAllFilesExW(CabHandle, LocalArgv[2], CabTestExtractFileCallbackW); SpCabCloseCabinet(CabHandle); g_argi += 2; } void CabTestExtractA(int argc, char** argv) { CCABHANDLE CabHandle; char** LocalArgv = argv + g_argi; CabHandle = SpCabOpenCabinetA(LocalArgv[1]); SpCabExtractAllFilesExA(CabHandle, LocalArgv[2], CabTestExtractFileCallbackA); SpCabCloseCabinet(CabHandle); g_argi += 2; } void CabTestCreateA(int argc, char** argv) { CCABHANDLE CabHandle; char** LocalArgv = argv + g_argi; CabHandle = SpCabCreateCabinetA(LocalArgv[1], (LocalArgv[1][0] != 0) ? LocalArgv[2] : NULL, (LocalArgv[3][0] != 0) ? LocalArgv[3] : NULL, 0); SpCabAddFileToCabinetA(CabHandle, LocalArgv[4], (LocalArgv[5] != NULL && LocalArgv[5][0] != 0) ? LocalArgv[5] : LocalArgv[4]); SpCabFlushAndCloseCabinetEx(CabHandle, NULL, NULL, NULL, NULL); g_argi += 4; g_argi += (LocalArgv[5] != NULL); } void MainA(int argc, char** argv) { argv[1] += (argv[1][0] == '-'); if (_stricmp(argv[1], "create") == 0) CabTestCreateA(argc - 1, argv + 1); else if (_stricmp(argv[1], "extract") == 0) CabTestExtractA(argc - 1, argv + 1); } void MainW(int argc, wchar_t** argv) { argv[1] += (argv[1][0] == '-'); if (_wcsicmp(argv[1], L"create") == 0) CabTestCreateW(argc - 1, argv + 1); else if (_wcsicmp(argv[1], L"extract") == 0) CabTestExtractW(argc - 1, argv + 1); } int __cdecl wmain(int argc, wchar_t** argv) { MainW(argc, argv); return 0; } void __cdecl wmainCRTStartup(void); int __cdecl main(int argc, char** argv) { MainA(argc, argv); wmainCRTStartup(); // trick to get A and W coverage in a single binary, this call doesn't return return 0; }