/*++ Copyright (c) 1994 Microsoft Corporation Module Name: apitest.c Abstract: Program to test CSC apis. Author: Shishir Pardikar (shishirp) 4-24-97 Environment: User Mode - Win32 Revision History: --*/ #ifdef CSC_ON_NT #include #include #include #else typedef const char * LPCSTR; #endif #include #include #include #include #include #include #include "lmcons.h" #include "lmuse.h" //#include //================================================================================= #define MAX_COMMAND_ARGS 32 #define DEFAULT_BUFFER_SIZE 1024 // 1k //================================================================================= // The order of these must match the order in GlobalCommandInfo[] typedef enum _COMMAND_CODE { CmdCSCPinFile, CmdCSCUnPinFile, CmdCSCQueryFileStatus, CmdCSCEnum, CmdCSCDelete, CmdCSCFill, CmdCSCMerge, CmdCSCCopyReplica, CmdTimeLog, CmdCheckCSC, CmdDbCheckCSC, CmdCSCEnumForStats, CmdCSCDoLocalRename, CmdCSCDoEnableDisable, CmdShowTime, CmdEncryptDecrypt, CmdDoRandomWrites, CmdHelp, CmdQuit, UnknownCommand } COMMAND_CODE, *LPCOMMAND_CODE; typedef struct _COMMAND_INFO { LPSTR CommandName; LPSTR CommandParams; COMMAND_CODE CommandCode; } COMMAND_INFO, *LPCOMMAND_INFO; typedef VOID (*PRINTPROC)(LPSTR); #ifndef CSC_ON_NT typedef BOOL (*CHECKCSCEX)(LPSTR, LPCSCPROCA, DWORD, DWORD); #else typedef BOOL (*CHECKCSCEX)(LPSTR, LPCSCPROCW, DWORD, DWORD); #endif // If Count is not already aligned, then // round Count up to an even multiple of "Pow2". "Pow2" must be a power of 2. // // DWORD // ROUND_UP_COUNT( // IN DWORD Count, // IN DWORD Pow2 // ); #define ROUND_UP_COUNT(Count,Pow2) \ ( ((Count)+(Pow2)-1) & (~((Pow2)-1)) ) #define ALIGN_WCHAR sizeof(WCHAR) //================================================================================= FILE *UncList = NULL; LPSTR g_lpWriteFileBuf = NULL; FILE *DumpUncList = NULL; DWORD cCommands = 0; DWORD cFails = 0; DWORD g_dwNumIterations = 1; DWORD g_dwIteration = 0; DWORD g_dwNumCmdIterations = 1; DWORD g_dwCmdIteration = 0; DWORD g_dwFileSize = 0; DWORD g_dwDiskCache = 0; BOOL g_bWriteFile = FALSE; BOOL g_bQuietMode = FALSE; BOOL g_bPerfMode = FALSE; BOOL g_bUseFile = FALSE; char szDefaultTimeLogFile[] = "c:\\debug\\kd.log"; char vszFile[] = "C:\\WINNT\\private\\ntos\\rdr2\\csc\\usermode\\reint\\foo"; WCHAR vwzFileName[] = L"\\\\shishir1\\public\\foo.txt"; COMMAND_INFO GlobalCommandInfo[] = { {"pin", "UNCName", CmdCSCPinFile}, {"unpin", "UNCName", CmdCSCUnPinFile}, {"query", "UNCName", CmdCSCQueryFileStatus}, {"Enum", "UNCName or nothing", CmdCSCEnum}, {"Del", "UNCName", CmdCSCDelete}, {"Fill", "UNCName", CmdCSCFill}, {"Merge", "\\\\Server\\Share", CmdCSCMerge}, {"Move", "UNCNAME", CmdCSCCopyReplica}, {"tlog", "logfile", CmdTimeLog}, {"check", "\\\\Server\\Share", CmdCheckCSC}, {"dbcheck", "dbdir <0 (verify) or 1 (fix)>", CmdDbCheckCSC}, {"stats", "" , CmdCSCEnumForStats}, {"Ren", "ren src containing_dst_dir [1:-replace files]", CmdCSCDoLocalRename}, {"EnDis", "0 (disable) or 1 enable", CmdCSCDoEnableDisable}, {"ShowTime", "HHHHHHHH LLLLLLLL (Hex HighDateTime and LowDateTime)", CmdShowTime}, {"EncDec", "U (decrypt) anything else=> encrypt", CmdEncryptDecrypt}, {"RandW", "Randw filename", CmdDoRandomWrites}, {"Help", "", CmdHelp}, {"Quit", "", CmdQuit} }; LPSTR rgszNameArray[] = { "EditRecordEx", "AddFileRecordFR", "DeleteFileRecFromInode", "FindFileRecord", "UpdateFileRecordFR", "AddPriQRecord", "DeletePriQRecord", "FindPriQRecordInternal", "SetPriorityForInode", "CreateShadowInternal", "GetShadow", "GetShadowInfo", "SetShadowInfoInternal", "ChangePriEntryStatusHSHADOW", "MRxSmbCscCreateShadowFromPath", "MRxSmbGetFileInfoFromServer", "EditRecordEx_OpenFileLocal", "EditRecordEx_Lookup", "KeAttachProcess_R0Open", "IoCreateFile_R0Open", "KeDetachProcess_R0Open", "KeAttachProcess_R0Read", "R0ReadWrite", "KeDetachProcess_R0Read", "FindQRecordInsertionPoint_Addq", "LinkQRecord_Addq", "UnlinkQRecord_Addq", "FindQRecordInsertionPoint_Addq_dir", "EditRecordEx_Validate", "EditRecordEx_dat" }; typedef struct tagCSCSTATS{ DWORD dwTotal; DWORD dwTotalFiles; DWORD dwTotalDirs; DWORD dwSparseFiles; DWORD dwDirtyFiles; DWORD dwPinned; DWORD dwPinnedAndSparse; DWORD dwMismatched; } CSCSTATS, *LPCSCSTATS; DWORD WINAPIV Format_String(LPSTR *plpsz, LPSTR lpszFmt, ...); DWORD WINAPI Format_Error(DWORD dwErr, LPSTR *plpsz); DWORD WINAPI Format_StringV(LPSTR *plpsz, LPCSTR lpszFmt, va_list *vArgs); DWORD WINAPI Format_MessageV(DWORD dwFlags, DWORD dwErr, LPSTR *plpsz, LPCSTR lpszFmt, va_list *vArgs); VOID PrintBuffer( LPSTR lpszBuff ); BOOL WINAPI CheckCSC(LPSTR lpszDataBaseLocation, BOOL fFix); BOOL DoPinningA( LPSTR lpszName, DWORD dwHintFlags, BOOL fRecurse ); BOOL DoPinningW( LPWSTR lpwzName, DWORD dwHintFlags, BOOL fRecurse ); DWORD ProcessShowTime ( DWORD argc, LPSTR *argv ); DWORD ProcessEncryptDecrypt( DWORD argc, LPSTR *argv ); //================================================================================= DWORD ProcessCommandCode ( DWORD CommandCode, DWORD CommandArgc, LPSTR *CommandArgv ); DWORD GetLeafLenFromPath( LPSTR lpszPath ); BOOL GetStreamInformation( LPCSTR lpExistingFileName, LPVOID *lpStreamInformation ); //================================================================================= #if DBG #define TestDbgAssert(Predicate) \ { \ if (!(Predicate)) \ TestDbgAssertFailed( #Predicate, __FILE__, __LINE__, NULL ); \ } VOID TestDbgAssertFailed( LPSTR FailedAssertion, LPSTR FileName, DWORD LineNumber, LPSTR Message ) /*++ Routine Description: Assertion failed. Arguments: FailedAssertion : FileName : LineNumber : Message : Return Value: none. --*/ { printf("Assert @ %s \n", FailedAssertion ); printf("Assert Filename, %s \n", FileName ); printf("Line Num. = %ld.\n", LineNumber ); printf("Message is %s\n", Message ); DebugBreak(); } #else #define TestDbgAssert(_x_) #endif // DBG //================================================================================= VOID ParseArguments( LPSTR InBuffer, LPSTR *CArgv, LPDWORD CArgc ) { LPSTR CurrentPtr = InBuffer; DWORD i = 0; DWORD Cnt = 0; for ( ;; ) { // // skip blanks. // while( *CurrentPtr == ' ' ) { CurrentPtr++; } if( *CurrentPtr == '\0' ) { break; } CArgv[i++] = CurrentPtr; // // go to next space. // while( (*CurrentPtr != '\0') && (*CurrentPtr != '\n') ) { if( *CurrentPtr == '"' ) { // Deal with simple quoted args if( Cnt == 0 ) CArgv[i-1] = ++CurrentPtr; // Set arg to after quote else *CurrentPtr = '\0'; // Remove end quote Cnt = !Cnt; } if( (Cnt == 0) && (*CurrentPtr == ' ') || // If we hit a space and no quotes yet we are done with this arg (*CurrentPtr == '\0') ) break; CurrentPtr++; } if( *CurrentPtr == '\0' ) { break; } *CurrentPtr++ = '\0'; } *CArgc = i; return; } #ifdef MAYBE //================================================================================= LPSTR GetUncFromFile () { if (!UncList) { UncList = fopen ("Unclist", "r"); if (UncList == NULL) return NULL; } if (fgets( UncBuffer, DEFAULT_BUFFER_SIZE, UncList)) { UncBuffer[strlen(UncBuffer) -1] = '\0'; //kill line feed for no param cmds return UncBuffer; } else { fclose (UncList); UncList = NULL; return GetUncFromFile(); } } #endif //================================================================================= COMMAND_CODE DecodeCommand( LPSTR CommandName ) { DWORD i; DWORD NumCommands; NumCommands = sizeof(GlobalCommandInfo) / sizeof(COMMAND_INFO); TestDbgAssert( NumCommands <= UnknownCommand ); for( i = 0; i < NumCommands; i++) { if(( lstrcmpi( CommandName, GlobalCommandInfo[i].CommandName ) == 0 )){ return( GlobalCommandInfo[i].CommandCode ); } } return( UnknownCommand ); } //================================================================================= VOID PrintCommands( VOID ) { DWORD i; DWORD NumCommands; NumCommands = sizeof(GlobalCommandInfo) / sizeof(COMMAND_INFO); TestDbgAssert( NumCommands <= UnknownCommand ); for( i = 0; i < NumCommands; i++) { fprintf(stderr, " %s (%s)\n", GlobalCommandInfo[i].CommandName, GlobalCommandInfo[i].CommandParams ); } } //================================================================================= VOID DisplayUsage( VOID ) { fprintf(stderr, "Usage: command \n" ); fprintf(stderr, "Commands : \n"); PrintCommands(); return; } //================================================================================= FILETIME GetGmtTime( VOID ) { SYSTEMTIME SystemTime; FILETIME Time; GetSystemTime( &SystemTime ); SystemTimeToFileTime( &SystemTime, &Time ); return( Time ); } //================================================================================= LPSTR ConvertGmtTimeToString( FILETIME Time, LPSTR OutputBuffer ) { SYSTEMTIME SystemTime; FILETIME LocalTime; static FILETIME ftNone = {0, 0}; if (!memcmp (&Time, &ftNone, sizeof(FILETIME))) sprintf (OutputBuffer, ""); else { FileTimeToLocalFileTime( &Time , &LocalTime ); FileTimeToSystemTime( &LocalTime, &SystemTime ); sprintf( OutputBuffer, "%02u/%02u/%04u %02u:%02u:%02u ", SystemTime.wMonth, SystemTime.wDay, SystemTime.wYear, SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond ); } return( OutputBuffer ); } void PrintCSCEntryInfo( WIN32_FIND_DATA *lpFind32, DWORD dwStatus, DWORD dwPinCount, DWORD dwHintFlags, FILETIME *lpftOrgTime ) { char buff[128]; fprintf(stderr, "\n"); if (lpFind32) { fprintf(stderr, "LFN: %s\n", lpFind32->cFileName); fprintf(stderr, "SFN: %s\n", lpFind32->cAlternateFileName); fprintf(stderr, "Attr: %x\n", lpFind32->dwFileAttributes); fprintf(stderr, "Size: %d %d\n", lpFind32->nFileSizeHigh, lpFind32->nFileSizeLow); ConvertGmtTimeToString(lpFind32->ftLastWriteTime, buff); fprintf(stderr, "LastWriteTime: %s\n", buff); } if (lpftOrgTime) { ConvertGmtTimeToString(*lpftOrgTime, buff); fprintf(stderr, "ORGTime: %s\n", buff); } fprintf(stderr, "Status: %x\n", dwStatus); fprintf(stderr, "PinCount: %x\n", dwPinCount); fprintf(stderr, "PinFlags: %x\n", dwHintFlags); fprintf(stderr, "\n"); } void PrintCSCEntryInfoW( WIN32_FIND_DATAW *lpFind32, DWORD dwStatus, DWORD dwPinCount, DWORD dwHintFlags, FILETIME *lpftOrgTime ) { WIN32_FIND_DATA *lpFind32P = NULL; fprintf(stderr, "\n"); if (lpFind32) { WIN32_FIND_DATA sFind32; lpFind32P = &sFind32; memset(&sFind32, 0, sizeof(WIN32_FIND_DATAA)); memcpy(&sFind32, lpFind32, sizeof(WIN32_FIND_DATAA)-sizeof(sFind32.cFileName)-sizeof(sFind32.cAlternateFileName)); WideCharToMultiByte(CP_ACP, 0, lpFind32->cFileName, wcslen(lpFind32->cFileName), sFind32.cFileName, sizeof(sFind32.cFileName), NULL, NULL); WideCharToMultiByte(CP_OEMCP, 0, lpFind32->cAlternateFileName, wcslen(lpFind32->cAlternateFileName), sFind32.cAlternateFileName, sizeof(sFind32.cAlternateFileName), NULL, NULL); } PrintCSCEntryInfo( lpFind32P, dwStatus, dwPinCount, dwHintFlags, lpftOrgTime ); } DWORD MyCSCProc( const char *lpszFullPath, DWORD dwStatus, DWORD dwHintFlags, DWORD dwPinCount, WIN32_FIND_DATAA *lpFind32, DWORD dwReason, DWORD dwParam1, DWORD dwParam2, DWORD dwContext ) { if (dwReason==CSCPROC_REASON_BEGIN) { printf("CSCPROC:Name=%s Status=0x%x HintFlags=0x%x PinCount=%d Reason=%d Param1=%d Param2=%d\r\n", (lpszFullPath)?lpszFullPath:"None", dwStatus, dwHintFlags, dwPinCount, dwReason, dwParam1, dwParam2 ); } else if (dwReason==CSCPROC_REASON_MORE_DATA) { printf("."); } else { printf("\r\n"); if (dwParam2==ERROR_SUCCESS) { printf("Succeeded\r\n"); } else { printf("Error=%d \r\n", dwParam2); } } return (CSCPROC_RETURN_CONTINUE); } DWORD MyCSCProcW( const unsigned short *lpszFullPath, DWORD dwStatus, DWORD dwHintFlags, DWORD dwPinCount, WIN32_FIND_DATAW *lpFind32, DWORD dwReason, DWORD dwParam1, DWORD dwParam2, DWORD dwContext ) { if (dwReason==CSCPROC_REASON_BEGIN) { printf("CSCPROC:Name=%ls Status=0x%x HintFlags=0x%x PinCount=%d Reason=%d Param1=%d Param2=%d\r\n", (lpszFullPath)?lpszFullPath:L"None", dwStatus, dwHintFlags, dwPinCount, dwReason, dwParam1, dwParam2 ); } else if (dwReason==CSCPROC_REASON_MORE_DATA) { printf("."); } else { printf("\r\n"); if (dwParam2==ERROR_SUCCESS) { printf("Succeeded\r\n"); } else { printf("Error=%d \r\n", dwParam2); } } return (CSCPROC_RETURN_CONTINUE); } DWORD MyCSCEnumForStatsProc( const char *lpszFullPath, DWORD dwStatus, DWORD dwHintFlags, DWORD dwPinCount, WIN32_FIND_DATAA *lpFind32, DWORD dwReason, DWORD dwParam1, DWORD dwParam2, DWORD dwContext ) { LPCSCSTATS lpStats = (LPCSCSTATS)dwContext; lpStats->dwTotal++; if(dwParam1) { lpStats->dwTotalFiles++; if (dwStatus & FLAG_CSC_COPY_STATUS_SPARSE) { lpStats->dwSparseFiles++; } if (dwStatus & FLAG_CSC_COPY_STATUS_DATA_LOCALLY_MODIFIED) { lpStats->dwDirtyFiles++; } if ((dwHintFlags & (FLAG_CSC_HINT_PIN_USER|FLAG_CSC_HINT_PIN_SYSTEM))||dwPinCount) { lpStats->dwPinned++; if (dwStatus & FLAG_CSC_COPY_STATUS_SPARSE) { lpStats->dwPinnedAndSparse++; } } } else { lpStats->dwTotalDirs++; } return (CSCPROC_RETURN_CONTINUE); } DWORD MyCSCEnumForStatsProcW( const unsigned short *lpszFullPath, DWORD dwStatus, DWORD dwHintFlags, DWORD dwPinCount, WIN32_FIND_DATAW *lpFind32, DWORD dwReason, DWORD dwParam1, DWORD dwParam2, DWORD dwContext ) { LPCSCSTATS lpStats = (LPCSCSTATS)dwContext; lpStats->dwTotal++; if(dwParam1) { lpStats->dwTotalFiles++; if (dwStatus & FLAG_CSC_COPY_STATUS_SPARSE) { lpStats->dwSparseFiles++; } if (dwStatus & FLAG_CSC_COPY_STATUS_DATA_LOCALLY_MODIFIED) { lpStats->dwDirtyFiles++; } if ((dwHintFlags & (FLAG_CSC_HINT_PIN_USER|FLAG_CSC_HINT_PIN_SYSTEM))||dwPinCount) { lpStats->dwPinned++; if (dwStatus & FLAG_CSC_COPY_STATUS_SPARSE) { lpStats->dwPinnedAndSparse++; } } } else { lpStats->dwTotalDirs++; } return (CSCPROC_RETURN_CONTINUE); } DWORD MyCSCCheckExProc( const char *lpszFullPath, DWORD dwStatus, DWORD dwHintFlags, DWORD dwPinCount, WIN32_FIND_DATAA *lpFind32, DWORD dwReason, DWORD dwParam1, DWORD dwParam2, DWORD dwContext ) { LPCSCSTATS lpStats = (LPCSCSTATS)dwContext; if (dwReason == CSCPROC_REASON_BEGIN) { if (lpFind32) { printf("%s size=%d\r\n", lpszFullPath, lpFind32->nFileSizeLow); lpStats->dwTotal++; lpStats->dwTotalFiles++; } else { printf("%s\r\n", lpszFullPath); } } else if (dwReason == CSCPROC_REASON_END) { if (dwParam2 != NO_ERROR) { if (dwParam2 == ERROR_INVALID_DATA) { printf("Mismatched, press any key to continue...\r\n", dwParam2); } else { printf("Error in comparing Errcode=%d, press any key to continue...\r\n", dwParam2); } getchar(); lpStats->dwMismatched++; } } return (CSCPROC_RETURN_CONTINUE); } DWORD MyCSCCheckExProcW( const unsigned short *lpszFullPath, DWORD dwStatus, DWORD dwHintFlags, DWORD dwPinCount, WIN32_FIND_DATAW *lpFind32, DWORD dwReason, DWORD dwParam1, DWORD dwParam2, DWORD dwContext ) { LPCSCSTATS lpStats = (LPCSCSTATS)dwContext; if (dwReason == CSCPROC_REASON_BEGIN) { if (lpFind32) { printf("%ls size=%d\r\n", lpszFullPath, lpFind32->nFileSizeLow); lpStats->dwTotal++; lpStats->dwTotalFiles++; } else { printf("%s\r\n", lpszFullPath); } } else if (dwReason == CSCPROC_REASON_END) { if (dwParam2 != NO_ERROR) { if (dwParam2 == ERROR_INVALID_DATA) { printf("Mismatched, press any key to continue...\r\n", dwParam2); } else { printf("Error in comparing Errcode=%d, press any key to continue...\r\n", dwParam2); } getchar(); lpStats->dwMismatched++; } } return (CSCPROC_RETURN_CONTINUE); } DWORD ProcessCSCPinFile( DWORD argc, LPSTR *argv ) { DWORD dwError=ERROR_SUCCESS, dwHintFlags=0; BOOL fRecurse = FALSE, fRet=FALSE; #ifdef CSC_ON_NT unsigned short uBuff[MAX_PATH]; #endif if (argc < 1) { printf("CSCPinFile: must provide a UNC path \r\n"); } else { if (argc > 1) { if ((*argv[1] == 'u')||(*argv[1] == 'U')) { dwHintFlags |= FLAG_CSC_HINT_PIN_USER; } else if ((*argv[1] == 's')||(*argv[1] == 'S')) { dwHintFlags |= FLAG_CSC_HINT_PIN_SYSTEM; } else if (*argv[1] == 'i') { dwHintFlags |= FLAG_CSC_HINT_PIN_INHERIT_USER; } else if (*argv[1] == 'I') { dwHintFlags |= FLAG_CSC_HINT_PIN_INHERIT_SYSTEM; } else if (*argv[1] == 'T') { fRecurse = TRUE; } } #ifndef CSC_ON_NT fRet = DoPinningA(argv[0], dwHintFlags, fRecurse); #else memset(uBuff, 0, sizeof(uBuff)); MultiByteToWideChar(CP_ACP, 0, argv[0], strlen(argv[0]), uBuff, MAX_PATH*sizeof(unsigned short)); fRet = DoPinningW(uBuff, dwHintFlags, fRecurse); #endif } if (!fRet) { dwError = GetLastError(); } return (dwError); } DWORD ProcessCSCUnPinFile( DWORD argc, LPSTR *argv ) { DWORD dwStatus, dwError=ERROR_SUCCESS, dwPinCount, dwHintFlags=0; #ifdef CSC_ON_NT unsigned short uBuff[MAX_PATH]; #endif if (argc < 1) { printf("CSCUnPinFile: must provide a UNC path \r\n"); } else { if (argc > 1) { if ((*argv[1] == 'u')||(*argv[1] == 'U')) { dwHintFlags |= FLAG_CSC_HINT_PIN_USER; } else if ((*argv[1] == 's')||(*argv[1] == 'S')) { dwHintFlags |= FLAG_CSC_HINT_PIN_SYSTEM; } else if (*argv[1] == 'i') { dwHintFlags |= FLAG_CSC_HINT_PIN_INHERIT_USER; } else if (*argv[1] == 'I') { dwHintFlags |= FLAG_CSC_HINT_PIN_INHERIT_SYSTEM; } } #ifndef CSC_ON_NT if (!CSCUnpinFileA(argv[0], dwHintFlags, &dwStatus, &dwPinCount, &dwHintFlags)) { dwError = GetLastError(); } else { PrintCSCEntryInfo(NULL, dwStatus, dwPinCount, dwHintFlags, NULL); } #else memset(uBuff, 0, sizeof(uBuff)); MultiByteToWideChar(CP_ACP, 0, argv[0], strlen(argv[0]), uBuff, MAX_PATH*sizeof(unsigned short)); if (!CSCUnpinFileW(uBuff, dwHintFlags, &dwStatus, &dwPinCount, &dwHintFlags)) { dwError = GetLastError(); } else { PrintCSCEntryInfo(NULL, dwStatus, dwPinCount, dwHintFlags, NULL); } #endif } return (dwError); } DWORD ProcessCSCQueryFileStatus( DWORD argc, LPSTR *argv ) { DWORD dwStatus, dwError=ERROR_SUCCESS, dwPinCount, dwHintFlags; #ifdef CSC_ON_NT unsigned short uBuff[MAX_PATH]; #endif if (argc < 1) { printf("CSCQueryFileStatusA: must provide a UNC path \r\n"); } else { #ifndef CSC_ON_NT if (!CSCQueryFileStatusA(argv[0], &dwStatus, &dwPinCount, &dwHintFlags)) { dwError = GetLastError(); } else { PrintCSCEntryInfo(NULL, dwStatus, dwPinCount, dwHintFlags, NULL); } #else memset(uBuff, 0, sizeof(uBuff)); MultiByteToWideChar(CP_ACP, 0, argv[0], strlen(argv[0]), uBuff, MAX_PATH*sizeof(unsigned short)); if (!CSCQueryFileStatusW(uBuff, &dwStatus, &dwPinCount, &dwHintFlags)) { dwError = GetLastError(); } else { PrintCSCEntryInfo(NULL, dwStatus, dwPinCount, dwHintFlags, NULL); } #endif } return (dwError); } DWORD ProcessCSCEnum( DWORD argc, LPSTR *argv ) { HANDLE hFind; DWORD dwError = ERROR_SUCCESS, dwStatus, dwPinCount, dwHintFlags; FILETIME ftOrgTime; #ifndef CSC_ON_NT WIN32_FIND_DATAA sFind32; #else WIN32_FIND_DATAW sFind32; unsigned short uBuff[MAX_PATH]; #endif #ifndef CSC_ON_NT hFind = CSCFindFirstFileA((argc<1)?NULL:argv[0], &sFind32, &dwStatus, &dwPinCount, &dwHintFlags, &ftOrgTime); if (hFind != INVALID_HANDLE_VALUE) { PrintCSCEntryInfo(&sFind32, dwStatus, dwPinCount, dwHintFlags, &ftOrgTime); while (CSCFindNextFileA(hFind, &sFind32, &dwStatus, &dwPinCount, &dwHintFlags, &ftOrgTime)) { PrintCSCEntryInfo(&sFind32, dwStatus, dwPinCount, dwHintFlags, &ftOrgTime); } CSCFindClose(hFind); } else { dwError = GetLastError(); } #else memset(uBuff, 0, sizeof(uBuff)); MultiByteToWideChar(CP_ACP, 0, argv[0], strlen(argv[0]), uBuff, MAX_PATH*sizeof(unsigned short)); hFind = CSCFindFirstFileW(uBuff, &sFind32, &dwStatus, &dwPinCount, &dwHintFlags, &ftOrgTime); if (hFind != INVALID_HANDLE_VALUE) { PrintCSCEntryInfoW(&sFind32, dwStatus, dwPinCount, dwHintFlags, &ftOrgTime); while (CSCFindNextFileW(hFind, &sFind32, &dwStatus, &dwPinCount, &dwHintFlags, &ftOrgTime)) { PrintCSCEntryInfoW(&sFind32, dwStatus, dwPinCount, dwHintFlags, &ftOrgTime); } CSCFindClose(hFind); } else { dwError = GetLastError(); } #endif return (dwError); } DWORD ProcessCSCDelete( DWORD argc, LPSTR *argv ) { DWORD dwError=ERROR_SUCCESS; #ifdef CSC_ON_NT unsigned short uBuff[MAX_PATH]; #endif if (argc < 1) { printf("CSCQueryFileStatusA: must provide a UNC path \r\n"); } else { #ifndef CSC_ON_NT if (!CSCDeleteA(argv[0])) { dwError = GetLastError(); } #else memset(uBuff, 0, sizeof(uBuff)); MultiByteToWideChar(CP_ACP, 0, argv[0], strlen(argv[0]), uBuff, MAX_PATH*sizeof(unsigned short)); if (!CSCDeleteW(uBuff)) { dwError = GetLastError(); } #endif } return (dwError); } DWORD ProcessTimeLog( DWORD argc, LPSTR *argv ) { DWORD dwError=ERROR_SUCCESS; LPSTR lpszLogFile; FILE *fp= (FILE *)NULL; char buff[256]; int indx = 0; LONGLONG llTime = 0; DWORD dwMin, dwSec, dwMSec; if (argc < 1) { printf("No file specified assuming %s\r\n", szDefaultTimeLogFile); lpszLogFile = szDefaultTimeLogFile; } else { lpszLogFile = argv[0]; } if (fp = fopen(lpszLogFile, "rb")){ printf("Total time spent by routine \r\n"); while(fgets(buff, sizeof(buff), fp) != NULL) { if (sscanf(buff, "%x %x", (DWORD *)&llTime, (DWORD *)(((BYTE *)&llTime)+sizeof(DWORD)))==2) { dwMin = (DWORD)((llTime/10000000)/60); dwSec = (DWORD)((llTime/10000000)%60); if (!dwMin && !dwSec) { dwMSec = (DWORD)(llTime/10000); printf("%d msecs: %s\r\n", dwMSec, rgszNameArray[indx]); } else { printf("%d min %d sec: %s \r\n", dwMin, dwSec, rgszNameArray[indx]); } } ++indx; } fclose(fp); } return (dwError); } DWORD ProcessCheckCSC( DWORD argc, LPSTR *argv ) { CHECKCSCEX lpCheckCscEx; HANDLE hLib; CSCSTATS sCscStats; DWORD dwError=ERROR_SUCCESS; BOOL fRet = TRUE; if (hLib = LoadLibraryA("cscdll.dll")) { if (lpCheckCscEx = (CHECKCSCEX)GetProcAddress(hLib, "CheckCSCEx")) { memset(&sCscStats, 0, sizeof(sCscStats)); #ifndef CSC_ON_NT fRet = lpCheckCscEx(argv[0], MyCSCCheckExProc, (DWORD)&sCscStats, 0); // verify #else fRet = lpCheckCscEx(argv[0], MyCSCCheckExProcW, (DWORD)&sCscStats, 0); // verify #endif } else { printf("Older version of cscdll \r\n"); fRet = FALSE; } FreeLibrary(hLib); } if (!fRet) { dwError = GetLastError(); } return dwError; } DWORD ProcessDbCheckCSC( DWORD argc, LPSTR *argv ) { DWORD dwError=ERROR_SUCCESS; DWORD dwLevel=0; BOOL fRet = TRUE; PRINTPROC lpfnPrintProc = NULL; #if 0 PFILE_STREAM_INFORMATION pStream = NULL, pstreamT; char buff[1024]; if (GetStreamInformation((LPCSTR)vszFile, (LPVOID *)&pStream)) { pstreamT = pStream; do { memset(buff, 0, sizeof(buff)); wcstombs(buff, pstreamT->StreamName, pstreamT->StreamNameLength); printf("%s\r\n", buff); if (!pstreamT->NextEntryOffset) { break; } pstreamT = (PFILE_STREAM_INFORMATION)((LPBYTE)pstreamT + pstreamT->NextEntryOffset); } while (TRUE); LocalFree(pStream); } #endif if (argc < 1) { printf("Usage: check cscdir level{0 for verify, 1 for rebuild}\r\n"); return (ERROR_INVALID_PARAMETER); } else if (argc>1) { dwLevel = *argv[1] - '0'; } if (dwLevel > 1) { printf("Usage: check cscdir level{0 for verify, 1 for rebuild}\r\n"); return (ERROR_INVALID_PARAMETER); } printf("Calling CheckCSC with cscdir=%s level=%d \r\n", argv[0], dwLevel); switch (dwLevel) { case 0: fRet = CheckCSC(argv[0], FALSE); // don't fix break; case 1: fRet = CheckCSC(argv[0], TRUE); // fix break; default: break; } if (!fRet) { dwError = GetLastError(); } return dwError; } DWORD ProcessCSCFill( DWORD argc, LPSTR *argv ) { DWORD dwError=ERROR_FILE_NOT_FOUND; #ifdef CSC_ON_NT unsigned short uBuff[MAX_PATH]; #endif if (argc>=1) { #ifndef CSC_ON_NT if (!CSCFillSparseFilesA((const char *)argv[0], FALSE, MyCSCProc, 0)) { dwError = GetLastError(); } else { dwError = ERROR_SUCCESS; } #else memset(uBuff, 0, sizeof(uBuff)); MultiByteToWideChar(CP_ACP, 0, argv[0], strlen(argv[0]), uBuff, MAX_PATH*sizeof(unsigned short)); if (!CSCFillSparseFilesW((const unsigned short *)uBuff, FALSE, MyCSCProcW, 0)) { dwError = GetLastError(); } else { dwError = ERROR_SUCCESS; } #endif } return dwError; } DWORD ProcessCSCMerge( DWORD argc, LPSTR *argv ) { DWORD dwError=ERROR_FILE_NOT_FOUND; #ifdef CSC_ON_NT unsigned short uBuff[MAX_PATH]; #endif if (argc>=1) { #ifndef CSC_ON_NT if (!CSCMergeShareA((const char *)(argv[0]), MyCSCProc, 0)) { dwError = GetLastError(); } else { dwError = ERROR_SUCCESS; } #else memset(uBuff, 0, sizeof(uBuff)); MultiByteToWideChar(CP_ACP, 0, argv[0], strlen(argv[0]), uBuff, MAX_PATH*sizeof(unsigned short)); if (!CSCMergeShareW((const unsigned short *)uBuff, MyCSCProcW, 0)) { dwError = GetLastError(); } else { dwError = ERROR_SUCCESS; } CSCTransitionServerOnlineW((const unsigned short *)uBuff); #endif } return dwError; } DWORD ProcessCSCCopyReplica( DWORD argc, LPSTR *argv ) { DWORD dwError=ERROR_FILE_NOT_FOUND; #ifdef CSC_ON_NT LPWSTR lpszTempName = NULL; unsigned short uBuff[MAX_PATH]; #else LPSTR lpszTempName = NULL; #endif if (argc>=1) { #ifndef CSC_ON_NT if (!CSCCopyReplicaA((const char *)argv[0], &lpszTempName)) { dwError = GetLastError(); } else { dwError = ERROR_SUCCESS; } #else memset(uBuff, 0, sizeof(uBuff)); MultiByteToWideChar(CP_ACP, 0, argv[0], strlen(argv[0]), uBuff, MAX_PATH*sizeof(unsigned short)); if (!CSCCopyReplicaW((const unsigned short *)uBuff, &lpszTempName)) { dwError = GetLastError(); } else { dwError = ERROR_SUCCESS; } #endif } if (dwError == ERROR_SUCCESS) { #ifdef CSC_ON_NT OutputDebugStringW(lpszTempName); OutputDebugStringW(L"\r\n"); #else OutputDebugStringA(lpszTempName); OutputDebugStringA("\r\n"); #endif } return dwError; } DWORD ProcessCSCEnumForStats( DWORD argc, LPSTR *argv ) { DWORD dwError=ERROR_FILE_NOT_FOUND; CSCSTATS sStats; #ifdef CSC_ON_NT unsigned short uBuff[MAX_PATH]; #endif memset(&sStats, 0, sizeof(sStats)); #ifndef CSC_ON_NT if (!CSCEnumForStatsA((argc >=1)?(const char *)(argv[0]):NULL, MyCSCEnumForStatsProc, (DWORD)&sStats)) { dwError = GetLastError(); } else { dwError = ERROR_SUCCESS; } #else if (argc >= 1) { memset(uBuff, 0, sizeof(uBuff)); MultiByteToWideChar(CP_ACP, 0, argv[0], strlen(argv[0]), uBuff, MAX_PATH*sizeof(unsigned short)); } if (!CSCEnumForStatsW((argc>=1)?(const unsigned short *)uBuff:NULL, MyCSCEnumForStatsProcW, (DWORD)&sStats)) { dwError = GetLastError(); } else { dwError = ERROR_SUCCESS; } #if 0 if (argc < 1) { DWORD dwMaxSpaceHigh, dwMaxSpaceLow, dwCurrentSpaceHigh, dwCurrentSpaceLow, cntTotalFiles, cntTotalDirs; if(CSCGetSpaceUsageW(uBuff, sizeof(uBuff), &dwMaxSpaceHigh, &dwMaxSpaceLow, &dwCurrentSpaceHigh, &dwCurrentSpaceLow, &cntTotalFiles, &cntTotalDirs)) { printf("\r\n Space Stats \r\n"); printf("CSC directory location: %ls \r\n", uBuff); printf("MaxSpace=%d, CurrentSpaceUsed=%d, Fnles=%d Dirs=%d \r\n", dwMaxSpaceLow, dwCurrentSpaceLow, cntTotalFiles, cntTotalDirs); } else { printf("Error=%d in CSCGetSpaceUsage\r\n", GetLastError()); } } #endif #endif if (dwError == ERROR_SUCCESS) { printf("Stats\n"); printf("Total = %d, files=%d dirs=%d sparse=%d dirty=%d pinned=%d pinnedAndSparse=%d\r\n", sStats.dwTotal, sStats.dwTotalFiles, sStats.dwTotalDirs, sStats.dwSparseFiles, sStats.dwDirtyFiles, sStats.dwPinned, sStats.dwPinnedAndSparse ); } return dwError; } DWORD ProcessCSCDoLocalRename( DWORD argc, LPSTR *argv ) { DWORD dwError=ERROR_FILE_NOT_FOUND; #ifdef CSC_ON_NT unsigned short uBuffSrc[MAX_PATH], uBuffDst[MAX_PATH]; #endif if (argc<2) { printf("Usage: ren source_name dest_dir [optional character to indicate replace]\r\n"); return ERROR_INVALID_PARAMETER; } #ifndef CSC_ON_NT dwError = ERROR_CALL_NOT_IMPLEMENTED; #else memset(uBuffSrc, 0, sizeof(uBuffSrc)); MultiByteToWideChar(CP_ACP, 0, argv[0], strlen(argv[0]), uBuffSrc, MAX_PATH*sizeof(unsigned short)); memset(uBuffDst, 0, sizeof(uBuffDst)); MultiByteToWideChar(CP_ACP, 0, argv[1], strlen(argv[1]), uBuffDst, MAX_PATH*sizeof(unsigned short)); if (!CSCDoLocalRenameW(uBuffSrc, uBuffDst, (argc > 2))) { dwError = GetLastError(); } else { dwError = ERROR_SUCCESS; } #endif return dwError; } DWORD ProcessCSCDoEnableDisable( DWORD argc, LPSTR *argv ) { DWORD dwError=ERROR_FILE_NOT_FOUND; if (argc<1) { printf("Usage: endis fEnable\r\n"); return ERROR_INVALID_PARAMETER; } #ifndef CSC_ON_NT dwError = ERROR_CALL_NOT_IMPLEMENTED; #else if (!CSCDoEnableDisable(*argv[0]!='0')) { dwError = GetLastError(); } else { dwError = ERROR_SUCCESS; } #endif return dwError; } DWORD ProcessDoRandomWrites( DWORD argc, LPSTR *argv ) { DWORD dwError=ERROR_SUCCESS, dwFileSize, dwOffset, dwOffsetHigh; unsigned short uBuff[MAX_PATH]; unsigned char uchData; HANDLE hFile = INVALID_HANDLE_VALUE; int i, count; if (argc>=1) { memset(uBuff, 0, sizeof(uBuff)); MultiByteToWideChar(CP_ACP, 0, argv[0], strlen(argv[0]), uBuff, MAX_PATH*sizeof(unsigned short)); hFile = CreateFileW( uBuff, // name GENERIC_READ|GENERIC_WRITE, // access mode FILE_SHARE_READ|FILE_SHARE_WRITE, // share mode NULL, // security descriptor OPEN_EXISTING, // create disposition 0, // file statributes if created NULL); // template handle #if LARGE_FILE hFile = CreateFileW( uBuff, // name GENERIC_READ|GENERIC_WRITE, // access mode FILE_SHARE_READ|FILE_SHARE_WRITE, // share mode NULL, // security descriptor OPEN_ALWAYS, // create disposition 0, // file statributes if created NULL); // template handle #endif if (hFile != INVALID_HANDLE_VALUE) { dwFileSize = GetFileSize(hFile, NULL); if (dwFileSize == -1) { dwError = GetLastError(); goto bailout; } if (dwFileSize == 0) { printf("0 sized file \n"); goto bailout; } srand( (unsigned)time( NULL ) ); // count = rand() % 100; count = 2; printf("writing %d times \n", count); for (i=0; i< count; ++i) { DWORD dwReturn; dwOffset = rand() % dwFileSize; uchData = (unsigned char)rand(); if (SetFilePointer(hFile, dwOffset, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER) { dwError = GetLastError(); printf("Failed SetFilePointer %d \n", dwError); goto bailout; } printf("writing %c at %d \n", uchData, dwOffset); if (!WriteFile(hFile, &uchData, 1, &dwReturn, NULL)) { dwError = GetLastError(); printf("Failed write with error %d \n", dwError); goto bailout; } } } #if LARGE_FILE dwOffsetHigh = 1; if (SetFilePointer(hFile, 0x400000, &dwOffsetHigh, FILE_BEGIN) == INVALID_SET_FILE_POINTER) { dwError = GetLastError(); printf("Failed SetFilePointer %d \n", dwError); goto bailout; } if (!SetEndOfFile(hFile)) { dwError = GetLastError(); printf("Failed SetEof %d \n", dwError); goto bailout; } #endif } bailout: if (hFile != INVALID_HANDLE_VALUE) { CloseHandle(hFile); } return dwError; } VOID PrintBuffer( LPSTR lpszBuff ) { printf(lpszBuff); } //================================================================================= DWORD ProcessCommandCode ( DWORD CommandCode, DWORD CommandArgc, LPSTR *CommandArgv ) { DWORD Error = ERROR_SUCCESS; switch( CommandCode ) { case CmdCSCPinFile: Error = ProcessCSCPinFile(CommandArgc, CommandArgv); break; case CmdCSCUnPinFile: Error = ProcessCSCUnPinFile(CommandArgc, CommandArgv); break; case CmdCSCQueryFileStatus: Error = ProcessCSCQueryFileStatus(CommandArgc, CommandArgv); break; case CmdCSCEnum: Error = ProcessCSCEnum(CommandArgc, CommandArgv); break; case CmdCSCDelete: Error = ProcessCSCDelete(CommandArgc, CommandArgv); break; case CmdHelp: DisplayUsage(); break; case CmdTimeLog: Error = ProcessTimeLog(CommandArgc, CommandArgv); break; case CmdCheckCSC: Error = ProcessCheckCSC(CommandArgc, CommandArgv); break; case CmdDbCheckCSC: Error = ProcessDbCheckCSC(CommandArgc, CommandArgv); break; case CmdCSCFill: Error = ProcessCSCFill(CommandArgc, CommandArgv); break; case CmdCSCMerge: Error = ProcessCSCMerge(CommandArgc, CommandArgv); break; case CmdCSCCopyReplica: Error = ProcessCSCCopyReplica(CommandArgc, CommandArgv); break; case CmdCSCEnumForStats: Error = ProcessCSCEnumForStats(CommandArgc, CommandArgv); break; case CmdCSCDoLocalRename: Error = ProcessCSCDoLocalRename(CommandArgc, CommandArgv); break; case CmdCSCDoEnableDisable: Error = ProcessCSCDoEnableDisable(CommandArgc, CommandArgv); break; case CmdShowTime: Error = ProcessShowTime( CommandArgc, CommandArgv ); break; case CmdEncryptDecrypt: Error = ProcessEncryptDecrypt(CommandArgc, CommandArgv ); break; case CmdDoRandomWrites: Error = ProcessDoRandomWrites(CommandArgc, CommandArgv ); break; case CmdQuit : exit (0); default: TestDbgAssert( FALSE ); fprintf(stderr, "Unknown Command Specified.\n"); DisplayUsage(); break; } cCommands++; if( Error != ERROR_SUCCESS ) { LPSTR lpstr; cFails++; Format_Error(Error, &lpstr); printf("FAILED (%s), %ld-%s.\n", GlobalCommandInfo[CommandCode].CommandName, Error, lpstr ); LocalFree(lpstr); } else { if(!g_bQuietMode) printf("Command (%s) successfully completed.\n", GlobalCommandInfo[CommandCode].CommandName ); } return Error; } //================================================================================= VOID __cdecl main( int argc, char *argv[] ) { DWORD Error; COMMAND_CODE CommandCode; CHAR InBuffer[DEFAULT_BUFFER_SIZE]; DWORD CArgc; LPSTR CArgv[MAX_COMMAND_ARGS]; unsigned u1 = 1, u2 = 0xffffffff; DWORD CommandArgc; LPSTR *CommandArgv; printf("u1=0x%x u2=0x%x, (int)(u1-u2)=%d, (u1-u2)=0x%x \r\n", u1, u2, (int)(u1-u2), (u1-u2)); /* must check for batch mode. if there are command line parms, assume batch mode */ if (argc > 1) { //this means that the arguments translate directly into CommandArgc.... CommandCode = DecodeCommand( argv[1] ); if( CommandCode == UnknownCommand ) { printf("Unknown Command Specified.\n"); return; } CommandArgc = argc - 2; CommandArgv = &argv[2]; Error = ProcessCommandCode (CommandCode,CommandArgc,CommandArgv); if (DumpUncList) fclose(DumpUncList); if (UncList) fclose(UncList); return; } DisplayUsage(); for(;;) { fprintf(stderr, "Command : " ); gets( InBuffer ); CArgc = 0; ParseArguments( InBuffer, CArgv, &CArgc ); if( CArgc < 1 ) { continue; } // // decode command. // CommandCode = DecodeCommand( CArgv[0] ); if( CommandCode == UnknownCommand ) { fprintf(stderr, "Unknown Command Specified.\n"); continue; } CommandArgc = CArgc - 1; CommandArgv = &CArgv[1]; Error = ProcessCommandCode (CommandCode,CommandArgc,CommandArgv); } return; } //================================================================================= DWORD GetLeafLenFromPath( LPSTR lpszPath ) { DWORD len; LPSTR lpT; if(!lpszPath) return(0); len = lstrlen(lpszPath); if (len == 0) { return (len); } lpT = lpszPath+len-1; if (*lpT =='\\') { --lpT; } for (; lpT >= lpszPath; --lpT) { if (*lpT == '\\') { break; } } return (lstrlen(lpT)); } //================================================================================= DWORD WINAPIV Format_String(LPSTR *plpsz, LPSTR lpszFmt, ...) { const char c_Func_Name[] = "[Format_String] "; DWORD dwRet; va_list vArgs; va_start (vArgs, lpszFmt); dwRet = Format_StringV(plpsz, lpszFmt, &vArgs); va_end (vArgs); return(dwRet); } //================================================================================= DWORD WINAPI Format_Error(DWORD dwErr, LPSTR *plpsz) { DWORD dwRet; if(dwErr != ERROR_SUCCESS) { dwRet = Format_MessageV(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, dwErr, plpsz, NULL, NULL); } else { const char szMsg[] = "No Error"; Format_String(plpsz, (LPSTR)szMsg); dwRet = lstrlen(szMsg); } return(dwRet); } //================================================================================= DWORD WINAPI Format_StringV(LPSTR *plpsz, LPCSTR lpszFmt, va_list *vArgs) { return(Format_MessageV(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_STRING, 0, plpsz, lpszFmt, vArgs)); } // *************************************************************************** DWORD WINAPI Format_MessageV(DWORD dwFlags, DWORD dwErr, LPSTR *plpsz, LPCSTR lpszFmt, va_list *vArgs) { const char c_Func_Name[] = "[Format_MessageV]"; DWORD dwRet; DWORD dwGLE; *plpsz = NULL; dwRet = FormatMessage(dwFlags, lpszFmt, dwErr, 0, (LPSTR) plpsz, 0, vArgs); if (!dwRet || !*plpsz) { dwGLE = GetLastError(); printf("%s FormatMessage Failed: %s. dwRet: %#lx!. *plpsz:%#lx! GLE:%d\r\n", c_Func_Name, lpszFmt, dwRet, *plpsz, dwGLE); if (*plpsz) LocalFree ((HLOCAL) *plpsz); *plpsz = NULL; return 0; } return(dwRet); } #if 0 BOOL GetStreamInformation( LPCSTR lpExistingFileName, LPVOID *lpStreamInformation ) { HANDLE SourceFile = INVALID_HANDLE_VALUE; PFILE_STREAM_INFORMATION StreamInfoBase = NULL; ULONG StreamInfoSize; IO_STATUS_BLOCK IoStatus; BOOL fRet = FALSE; DWORD Status; *lpStreamInformation = NULL; SourceFile = CreateFile( lpExistingFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL ); if (SourceFile == INVALID_HANDLE_VALUE) { return FALSE; } // // Obtain the full set of streams we have to copy. Since the Io subsystem does // not provide us a way to find out how much space this information will take, // we must iterate the call, doubling the buffer size upon each failure. // // If the underlying file system does not support stream enumeration, we end up // with a NULL buffer. This is acceptable since we have at least a default // data stream, // StreamInfoSize = 4096; do { StreamInfoBase = LocalAlloc(LPTR, StreamInfoSize ); if ( !StreamInfoBase ) { SetLastError( STATUS_NO_MEMORY ); goto bailout; } Status = NtQueryInformationFile( SourceFile, &IoStatus, (PVOID) StreamInfoBase, StreamInfoSize, FileStreamInformation ); if (Status != STATUS_SUCCESS) { // // We failed the call. Free up the previous buffer and set up // for another pass with a buffer twice as large // LocalFree(StreamInfoBase); StreamInfoBase = NULL; StreamInfoSize *= 2; } } while ( Status == STATUS_BUFFER_OVERFLOW || Status == STATUS_BUFFER_TOO_SMALL ); if (Status == STATUS_SUCCESS) { fRet = TRUE; } bailout: if (SourceFile != INVALID_HANDLE_VALUE) { CloseHandle(SourceFile); } *lpStreamInformation = StreamInfoBase; return fRet; } #endif #ifdef CSC_ON_NT BOOL DoPinningW( LPWSTR lpwzName, DWORD dwHintFlags, BOOL fRecurse ) { unsigned short uBuff[MAX_PATH]; WIN32_FIND_DATAW sFind32W; HANDLE hFind = NULL; BOOL fRet = TRUE; DWORD lenName, dwStatus, dwPinCount, dwError; lenName = lstrlenW(lpwzName); if (lenName < 5) { return FALSE; } lstrcpyW(uBuff, lpwzName); if (uBuff[lenName-1] == (USHORT)'\\') { uBuff[lenName-1] = 0; --lenName; if (lenName < 5) { return FALSE; } } hFind = FindFirstFileW(uBuff, &sFind32W); if (hFind==INVALID_HANDLE_VALUE) { lstrcatW(uBuff, L"\\*"); hFind = FindFirstFileW(uBuff, &sFind32W); uBuff[lenName] = 0; if (hFind==INVALID_HANDLE_VALUE) { return FALSE; } } else if (sFind32W.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { FindClose(hFind); lstrcatW(uBuff, L"\\*"); hFind = FindFirstFileW(uBuff, &sFind32W); uBuff[lenName] = 0; if (hFind==INVALID_HANDLE_VALUE) { return FALSE; } } do { if (!CSCPinFileW(uBuff, dwHintFlags, &dwStatus, &dwPinCount, &dwHintFlags)) { dwError = GetLastError(); } else { PrintCSCEntryInfo(NULL, dwStatus, dwPinCount, dwHintFlags, NULL); } if (fRecurse) { do { if(!FindNextFileW(hFind, &sFind32W)) { goto bailout; } if ((!lstrcmpW(sFind32W.cFileName, L"."))||(!lstrcmpW(sFind32W.cFileName, L".."))) { continue; } uBuff[lenName] = (USHORT)'\\'; uBuff[lenName+1] = 0; lstrcatW(uBuff, sFind32W.cFileName); if (sFind32W.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { DoPinningW(uBuff, dwHintFlags, fRecurse); } break; } while (TRUE); } else { break; } } while (TRUE); bailout: if (hFind) { FindClose(hFind); } return fRet; } #else BOOL DoPinningA( LPSTR lpszName, DWORD dwHintFlags, BOOL fRecurse ) { char chBuff[MAX_PATH]; WIN32_FIND_DATAA sFind32A; HANDLE hFind = NULL; BOOL fRet = TRUE; DWORD lenName, dwStatus, dwPinCount, dwError; lenName = lstrlen(lpszName); if (lenName < 5) { return FALSE; } lstrcpy(chBuff, lpszName); if (chBuff[lenName-1] == (USHORT)'\\') { chBuff[lenName-1] = 0; --lenName; if (lenName < 5) { return FALSE; } } hFind = FindFirstFileA(chBuff, &sFind32A); if (hFind==INVALID_HANDLE_VALUE) { lstrcatA(chBuff, "\\*"); hFind = FindFirstFileA(chBuff, &sFind32A); if (hFind==INVALID_HANDLE_VALUE) { return FALSE; } chBuff[lenName] = 0; } if (sFind32A.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { FindClose(hFind); lstrcatA(chBuff, "\\*"); hFind = FindFirstFileA(chBuff, &sFind32A); if (hFind==INVALID_HANDLE_VALUE) { return FALSE; } chBuff[lenName] = 0; } do { if (!CSCPinFileA(chBuff, dwHintFlags, &dwStatus, &dwPinCount, &dwHintFlags)) { dwError = GetLastError(); } else { PrintCSCEntryInfo(NULL, dwStatus, dwPinCount, dwHintFlags, NULL); } if (fRecurse) { if(!FindNextFile(hFind, &sFind32A)) { goto bailout; } chBuff[lenName] = '\\'; lstrcat(chBuff, sFind32A.cFileName); if (sFind32A.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { DoPinningA(chBuff, dwHintFlags, fRecurse); } } else { break; } } while (TRUE); bailout: if (hFind) { FindClose(hFind); } return fRet; } #endif //================================================================================= DWORD ProcessShowTime ( DWORD argc, LPSTR *argv ) { DWORD Error, dwSize; FILETIME ftTemp; SYSTEMTIME SystemTime; if(argc != 2) return 0xffffffff; sscanf(argv[0], "%x", &(ftTemp.dwHighDateTime)); sscanf(argv[1], "%x", &(ftTemp.dwLowDateTime)); if(FileTimeToSystemTime( &ftTemp, &SystemTime )) { printf("%02u/%02u/%04u %02u:%02u:%02u\n ", SystemTime.wMonth, SystemTime.wDay, SystemTime.wYear, SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond ); } else { printf("Wrong Times \n"); } return ERROR_SUCCESS; } DWORD ProcessEncryptDecrypt( DWORD argc, LPSTR *argv ) { DWORD dwStatus, dwError=ERROR_SUCCESS; BOOL fEncrypt = FALSE; #ifdef CSC_ON_NT unsigned short uBuff[MAX_PATH]; #endif if (argc != 1) { printf("CSCUnPinFile: must provide a UNC path \r\n"); } else { fEncrypt = !((*argv[0] == 'u')||(*argv[0] == 'U')); if (argc == 1) { if(!CSCEncryptDecryptDatabase(fEncrypt, NULL, 0)) { dwError = GetLastError(); } } else { #if 0 memset(uBuff, 0, sizeof(uBuff)); MultiByteToWideChar(CP_ACP, 0, argv[1], strlen(argv[1]), uBuff, MAX_PATH*sizeof(unsigned short)); if (!CSCEncryptDecryptFileW(uBuff, fEncrypt)) { dwError = GetLastError(); } #endif } } return (dwError); }