//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 2000 // // File: main.cpp // //-------------------------------------------------------------------------- #include "pch.h" #pragma hdrstop #include #include "util.h" #include "cscpin.h" #include "console.h" #include "exitcode.h" void ShowUsage( void ) { fwprintf(stderr, L"\aUsage: cscpin -p | -u | -f [-v] [-l ]\n\n"); fwprintf(stderr, L"\t-p = Pin files.\n"); fwprintf(stderr, L"\t-u = Unpin files.\n"); fwprintf(stderr, L"\t-f = Process paths in .\n"); fwprintf(stderr, L"\t-l = Log results to .\n"); fwprintf(stderr, L"\t-v = Verbose mode.\n"); fwprintf(stderr, L"\t = name of file or folder to pin/unpin.\n\n"); fwprintf(stderr, L"Examples:\n\n"); fwprintf(stderr, L"\tcscpin -v -p \\\\server\\share\\dir\n\n"); fwprintf(stderr, L"\tcscpin -u \\\\server\\share2\\dir\\foo.txt\n\n"); fwprintf(stderr, L"\tcscpin -f pinthese.txt -l cscpin.log\n\n"); } int __cdecl wmain( int argc, WCHAR **argv ) { const WCHAR CH_DASH = '-'; const WCHAR CH_SLASH = '/'; CSCPIN_INFO info; ZeroMemory(&info, sizeof(info)); const DWORD OPTION_PIN_OR_UNPIN = 0x00000001; const DWORD OPTION_VERBOSE = 0x00000002; const DWORD OPTION_INPUTFILE = 0x00000004; const DWORD OPTION_LOGFILE = 0x00000008; const DWORD OPTION_ALL = (OPTION_PIN_OR_UNPIN | OPTION_VERBOSE | OPTION_LOGFILE | OPTION_INPUTFILE); DWORD dwOptions = 0; bool bShowUsage = false; for (int i = 1; i < argc && !bShowUsage && (OPTION_ALL != dwOptions); i++) { if (CH_DASH == argv[i][0] || CH_SLASH == argv[i][0]) { switch(argv[i][1]) { case L'U': case L'u': if (0 == (OPTION_PIN_OR_UNPIN & dwOptions)) { info.bPin = FALSE; info.bPinDefaultSet = TRUE; dwOptions |= OPTION_PIN_OR_UNPIN; } else { fwprintf(stderr, L"Only one [-u] or [-p] allowed.\n\n"); bShowUsage = true; } break; case L'P': case L'p': if (0 == (OPTION_PIN_OR_UNPIN & dwOptions)) { info.bPin = TRUE; info.bPinDefaultSet = TRUE; dwOptions |= OPTION_PIN_OR_UNPIN; } else { fwprintf(stderr, L"Only one [-u] or [-p] allowed.\n\n"); bShowUsage = true; } break; case L'V': case L'v': info.bVerbose = TRUE; dwOptions |= OPTION_VERBOSE; break; case L'F': case L'f': if (0 == (OPTION_INPUTFILE & dwOptions)) { if (++i < argc) { if (NULL == info.pszFile) { info.pszFile = argv[i]; info.bUseListFile = TRUE; dwOptions |= OPTION_INPUTFILE; } else { fwprintf(stderr, L"Specify a list file using -F or a single file, not both.\n\n"); bShowUsage = true; } } else { fwprintf(stderr, L" expected following -F\n\n"); bShowUsage = true; } } else { fwprintf(stderr, L"Multiple input files specified.\n\n"); bShowUsage = true; } break; case L'L': case L'l': if (0 == (OPTION_LOGFILE & dwOptions)) { if (++i < argc) { info.pszLogFile = argv[i]; dwOptions |= OPTION_LOGFILE; } else { fwprintf(stderr, L" expected following -L\n\n"); bShowUsage = true; } } else { fwprintf(stderr, L"Multiple -L options specified.\n\n"); bShowUsage = true; } break; default: fwprintf(stderr, L"Unknown option '%c' specified.\n\n", argv[i][1]); SetExitCode(CSCPIN_EXIT_INVALID_PARAMETER); bShowUsage = true; } } else if (NULL == info.pszFile && 0 == (OPTION_INPUTFILE & dwOptions)) { // // Assume a file path without a cmd line switch is a single // file to be pinned or unpinned. // info.pszFile = argv[i]; info.bUseListFile = FALSE; dwOptions |= OPTION_INPUTFILE; } else { fwprintf(stderr, L"Multiple input files specified.\n\n"); bShowUsage = true; } } // // Now validate what the user entered. // if (0 == (OPTION_INPUTFILE & dwOptions)) { fwprintf(stderr, L" or -f argument required.\n\n"); bShowUsage = true; } else { if (!info.bUseListFile) { if (!info.bPinDefaultSet) { // // Not providing a listing file and didn't indicate // 'pin' or 'unpin' on the command line. // fwprintf(stderr, L"-p or -u argument required.\n\n"); bShowUsage = true; } } } if (bShowUsage) { // // User input is not 100% valid. // SetExitCode(CSCPIN_EXIT_INVALID_PARAMETER); ShowUsage(); } else { // // User input is valid. // ConsoleInitialize(); HRESULT hr = CoInitialize(NULL); if (SUCCEEDED(hr)) { CCscPin cscpin(info); cscpin.Run(); CoUninitialize(); } if (ConsoleHasCtrlEventOccured()) { SetExitCode(CSCPIN_EXIT_APPLICATION_ABORT); } ConsoleUninitialize(); } #if DBG fwprintf(stderr, L"Exit code = %d\n", GetExitCode()); #endif return GetExitCode(); }