/****************************************************************************** * * Copyright (c) 2000 Microsoft Corporation * * Module Name: * testmap.cpp * * Abstract: * UI tool for enumerating the change log/restore map * * Revision History: * Brijesh Krishnaswami (brijeshk) 06/09/2000 * created * *****************************************************************************/ #include "stdafx.h" #include "resource.h" #include <commctrl.h> #include "srrpcapi.h" #include "stdio.h" #ifdef THIS_FILE #undef THIS_FILE #endif static char __szTraceSourceFile[] = __FILE__; #define THIS_FILE __szTraceSourceFile #include "dbgtrace.h" #include "restmap.h" #include "enumlogs.h" #include "shellapi.h" #include "srapi.h" // // Macros: // #define MAX_LOADSTRING 100 #define LocalRealloc(a, b) LocalReAlloc(a, b, LMEM_MOVEABLE) #define MSG(a) MessageBox(NULL, a, L"", MB_OK); #define CHGLOG_COLS 8 // // Global Variables: // HINSTANCE hInst; WCHAR szTitle[MAX_LOADSTRING]; WCHAR szWindowClass[MAX_LOADSTRING]; HWND g_hwndChgLog = 0, g_hwndRestMap = 0, g_hwndMain = 0; HANDLE g_hDevice = 0, g_hFile = 0; WCHAR g_szLogDir[ MAX_PATH ]; WCHAR g_szActiveLogFile[ MAX_PATH ]; BOOL g_fTraceStatus = FALSE; WCHAR g_bBuffer[4096*16]; WCHAR g_szCmdLine[MAX_PATH]; int g_nRPNum = 0; int g_nOption = 1; WCHAR g_szDrive[MAX_PATH]; WCHAR g_szRstrmap[MAX_PATH] = L"c:\\rstrmap.dat"; typedef struct _CHGLOG_ITEM { LPWSTR aCols[CHGLOG_COLS]; } CHGLOG_ITEM; LPWSTR CHGLOG_COLUMNS[CHGLOG_COLS] = { L"Seq", L"Size", L"Operation", L"Attributes", L"TmpFile", L"Src Path", L"Dest Path", L"Acl" }; INT CHGLOG_WIDTHS[CHGLOG_COLS] = { 50, 50, 80, 80, 150, 250, 100, 50 }; WCHAR g_szBuffer [4096]; WCHAR g_achLogTemp[256]; WCHAR g_achTemp [256]; BYTE mapEnt[ 4096 ]; WCHAR szBuffer[4096]; // // Foward declarations of functions included in this code module: // ATOM RegisterRestoreMapClass(HINSTANCE hInstance); BOOL InitInstance(HINSTANCE, int); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM); void Log(char *ctl, int len); struct _EVENT_STR_MAP { DWORD EventId; LPWSTR pEventStr; } EventMap[ 12 ] = { {SrEventInvalid , L"INVALID " }, {SrEventStreamChange, L"FILE-MODIFY" }, {SrEventAclChange, L"ACL-CHANGE " }, {SrEventAttribChange, L"ATTR-CHANGE" }, {SrEventStreamOverwrite,L"FILE-MODIFY" }, {SrEventFileDelete, L"FILE-DELETE" }, {SrEventFileCreate, L"FILE-CREATE" }, {SrEventFileRename, L"FILE-RENAME" }, {SrEventDirectoryCreate,L"DIR-CREATE " }, {SrEventDirectoryRename,L"DIR-RENAME " }, {SrEventDirectoryDelete,L"DIR-DELETE " }, {SrEventMaximum, L"INVALID-MAX" } }; LPWSTR GetEventString( DWORD EventId ) { LPWSTR pStr = L"NOT-FOUND"; for( int i=0; i<sizeof(EventMap)/sizeof(_EVENT_STR_MAP);i++) { if ( EventMap[i].EventId == EventId ) { pStr = EventMap[i].pEventStr; } } return pStr; } LPWSTR DupString(LPWSTR lpsz) { int cb = (lstrlen(lpsz) + 1) * sizeof(WCHAR); LPWSTR lpszNew = (LPWSTR)LocalAlloc(LMEM_FIXED, cb); if (lpszNew != NULL) CopyMemory(lpszNew, lpsz, cb); return lpszNew; } BOOL WINAPI ChgLog_Insert( HWND hwnd, LPWSTR szSeqNo, LPWSTR szSize, LPWSTR szOperation, LPWSTR szAttr, LPWSTR szTmpFile, LPWSTR szSrc, LPWSTR szDest, LPWSTR szAcl) { LVITEM lvi; static int iItem = 0; CHGLOG_ITEM *pItem = (CHGLOG_ITEM *)LocalAlloc(LPTR, sizeof(CHGLOG_ITEM)); lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE; lvi.state = 0; lvi.stateMask = 0; lvi.pszText = LPSTR_TEXTCALLBACK; // app. maintains text lvi.iImage = 0; pItem->aCols[0] = DupString(szSeqNo); pItem->aCols[1] = DupString(szSize); pItem->aCols[2] = DupString(szOperation); pItem->aCols[3] = DupString(szAttr); pItem->aCols[4] = DupString(szTmpFile); pItem->aCols[5] = DupString(szSrc); pItem->aCols[6] = DupString(szDest); pItem->aCols[7] = DupString(szAcl); // Initialize item-specific LVITEM members. lvi.iItem = iItem; lvi.iSubItem = 0; lvi.lParam = (LPARAM)pItem; // item data // Add the item. ListView_InsertItem(hwnd, &lvi); iItem++; return TRUE; } VOID WINAPI ChgLog_OnGetDispInfo(NMLVDISPINFO * pnmv) { // Provide the item or subitem's text, if requested. if (pnmv->item.mask & LVIF_TEXT) { CHGLOG_ITEM *pItem = (CHGLOG_ITEM *) (pnmv->item.lParam); lstrcpy(pnmv->item.pszText, pItem->aCols[pnmv->item.iSubItem]); } } BOOL WINAPI ChgLog_InitColumns(HWND hwnd) { LVCOLUMN lvc; int iCol; // Initialize the LVCOLUMN structure. lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvc.fmt = LVCFMT_LEFT; lvc.cx = 100; lvc.pszText = g_achTemp; // Add the columns. for (iCol = 0; iCol < CHGLOG_COLS; iCol++) { lvc.iSubItem = iCol; lvc.cx = CHGLOG_WIDTHS[iCol]; lstrcpy(g_achTemp, CHGLOG_COLUMNS[iCol]); if (ListView_InsertColumn(hwnd, iCol, &lvc) == -1) return FALSE; } return TRUE; } BOOL ChgLog_FillWindow() { WCHAR szSeqNo[50]; WCHAR szSize[50]; WCHAR szOperation[50]; WCHAR szAttr[50]; WCHAR szTmpFile[150]; WCHAR szSrc [MAX_PATH]; WCHAR szDest[MAX_PATH]; WCHAR szAcl[MAX_PATH]; if (g_nOption == 3) { if (ERROR_SUCCESS != SRSwitchLog()) goto done; } { CChangeLogEntryEnum ChangeLog(g_szDrive, (g_nOption == 3), g_nRPNum, (g_nOption == 3)); CChangeLogEntry cle; if (ERROR_SUCCESS != ChangeLog.FindFirstChangeLogEntry(cle)) goto done; do { wsprintf( szSeqNo , L"%ld", cle.GetSequenceNum()); wsprintf( szSize , L"%d" , 0); wsprintf( szOperation, L"%s" , GetEventString(cle.GetType()) ); wsprintf( szAttr , L"%08x" , cle.GetAttributes() ); wsprintf( szTmpFile , L"%s" , cle.GetTemp() ? cle.GetTemp() : L"" ); wsprintf( szSrc , L"%s" , cle.GetPath1() ? cle.GetPath1() : L""); wsprintf( szDest, L"%s", cle.GetPath2() ? cle.GetPath2() : L""); wsprintf( szAcl, L"%s", cle.GetAcl() ? (cle.GetAclInline() ? L"Inline" : (LPWSTR) cle.GetAcl()) : L""); ChgLog_Insert( g_hwndChgLog, szSeqNo, szSize, szOperation, szAttr, szTmpFile, szSrc, szDest, szAcl); } while (ChangeLog.FindNextChangeLogEntry(cle) == ERROR_SUCCESS); ChangeLog.FindClose(); } done: return TRUE; } BOOL RestMap_FillWindow() { WCHAR szSeqNo[50]; WCHAR szSize[50]; WCHAR szOperation[50]; WCHAR szAttr[50]; WCHAR szTmpFile[150]; WCHAR szSrc [MAX_PATH]; WCHAR szDest[MAX_PATH]; WCHAR szAcl[MAX_PATH]; LPWSTR pszSrc, pszDest, pszTemp; LPBYTE pbAcl = NULL; RestoreMapEntry *prme = NULL; HANDLE hFile; PVOID pOpt = NULL; hFile = CreateFile(g_szRstrmap, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hFile == INVALID_HANDLE_VALUE) goto Err; while (ERROR_SUCCESS == ReadRestoreMapEntry(hFile, &prme)) { GetPaths(prme, &pszSrc, &pszTemp, &pszDest, &pbAcl); wsprintf( szSeqNo , L"%ld", 0); wsprintf( szSize , L"%d" , prme->m_dwSize); wsprintf( szOperation, L"%s" , GetEventString(prme->m_dwOperation)); wsprintf( szAttr , L"%08x" , prme->m_dwAttribute ); wsprintf( szTmpFile , L"%s" , pszTemp ? pszTemp : L""); wsprintf( szSrc , L"%s" , pszSrc ? pszSrc : L""); wsprintf( szDest, L"%s", pszDest ? pszDest : L""); wsprintf( szAcl, L"%s", prme->m_cbAcl ? (prme->m_fAclInline ? L"Inline" : (LPWSTR) pbAcl) : L""); ChgLog_Insert( g_hwndRestMap, szSeqNo, szSize, szOperation, szAttr, szTmpFile, szSrc, szDest, szAcl); } FreeRestoreMapEntry(prme); CloseHandle(hFile); Err: return TRUE; } void PrintUsage() { printf("Usage : testmap <option> <drive> <rpnum> <rstrmappath>\n"); printf(" 1 = both restoremap and changelog\n"); printf(" 2 = only restoremap\n"); printf(" 3 = only changelog\n"); } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { // TODO: Place code here. MSG msg; HACCEL hAccelTable; LPWSTR * argv = NULL; int argc; HGLOBAL hMem = NULL; InitAsyncTrace(); #if !NOTRACE InitAsyncTrace(); #endif argv = CommandLineToArgvW(GetCommandLine(), &argc); if (argc < 4) { PrintUsage(); goto Exit; } g_nOption = _wtoi(argv[1]); lstrcpy(g_szDrive, argv[2]); g_nRPNum = _wtoi(argv[3]); if (argc >= 5) lstrcpy(g_szRstrmap, argv[4]); // Initialize global strings LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadString(hInstance, IDC_VXDAPP, szWindowClass, MAX_LOADSTRING); RegisterRestoreMapClass(hInstance); // Perform application initialization: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_VXDAPP); // Main message loop: while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } Exit: if (argv) hMem = GlobalHandle(argv); if (hMem) GlobalFree(hMem); TermAsyncTrace(); return msg.wParam; } // // FUNCTION: RegisterRestoreMapClass() // ATOM RegisterRestoreMapClass(HINSTANCE hInstance) { WNDCLASSEX wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; wcex.lpfnWndProc = (WNDPROC)WndProc; wcex.cbClsExtra = 0; wcex.cbWndExtra = 0; wcex.hInstance = hInstance; wcex.hIcon = LoadIcon(hInstance, (LPCTSTR)IDI_VXDAPP); wcex.hCursor = LoadCursor(NULL, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = (LPCWSTR)IDC_VXDAPP; wcex.lpszClassName = szWindowClass; wcex.hIconSm = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL); return RegisterClassEx(&wcex); } // // FUNCTION: InitInstance(HANDLE, int) // BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { HWND hWnd; hInst = hInstance; // Force the common controls DLL to be loaded. InitCommonControls(); if (g_nOption == 1) lstrcpy(szTitle, L"changelog - restoremap"); else if (g_nOption == 2) lstrcpy(szTitle, L"restoremap"); else if (g_nOption == 3) lstrcpy(szTitle, L"changelog"); hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); g_hwndMain = hWnd; return TRUE; } // // FUNCTION: WndProc(HWND, unsigned, WORD, LONG) // LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { int wmId, wmEvent; PAINTSTRUCT ps; HDC hdc; WCHAR szHello[MAX_LOADSTRING]; LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING); switch (message & 0xffff) { case WM_CREATE: { // Create the list view window. if (g_nOption == 1 || g_nOption == 3) { g_hwndChgLog = CreateWindow( WC_LISTVIEW, L"ListView_Window", WS_CHILD | LVS_REPORT | WS_VISIBLE, 0, 0, 300, 300, hWnd, NULL, hInst, NULL); if (g_hwndChgLog == NULL) { MessageBox(GetFocus(), L"List view cannot create", L"Error", MB_ICONHAND | MB_OK); return -1; } else { RECT rc; GetClientRect(hWnd, &rc); MoveWindow(g_hwndChgLog, 0, 0, rc.right, rc.bottom, TRUE); } ChgLog_InitColumns(g_hwndChgLog); ChgLog_FillWindow(); } // Create the list view window. if (g_nOption == 1 || g_nOption == 2) { g_hwndRestMap = CreateWindow(WC_LISTVIEW, L"", WS_CHILD | LVS_REPORT | WS_VISIBLE, 0, 0, (g_nOption == 1) ? CW_USEDEFAULT : 300, (g_nOption == 1) ? CW_USEDEFAULT : 300, hWnd, NULL, hInst, NULL); if (g_hwndRestMap == NULL) { MessageBox(GetFocus(), L"Can't create RestMap View", L"Error", MB_ICONHAND | MB_OK); return -1; } else { RECT rc; GetClientRect(hWnd, &rc); MoveWindow(g_hwndRestMap, 0, (g_nOption == 1) ? (rc.bottom-rc.top)/2 : 0, rc.right, rc.bottom, TRUE); } ChgLog_InitColumns(g_hwndRestMap); RestMap_FillWindow(); } break; } case WM_SIZE: if (g_hwndChgLog) { // resize list control RECT rc; GetClientRect(hWnd, &rc); MoveWindow(g_hwndChgLog, 0, 0, rc.right, rc.bottom/2, TRUE); } // resize list control if (g_hwndRestMap) { // resize list control RECT rc; GetClientRect(hWnd, &rc); MoveWindow(g_hwndRestMap, 0, (g_nOption == 1) ? rc.bottom/2 : 0, rc.right, rc.bottom/2, TRUE); } return 0; case WM_COMMAND: wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); switch (wmId) { case IDM_ABOUT: DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } break; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // TODO: Add any drawing code here... RECT rt; GetClientRect(hWnd, &rt); // DrawText(hdc, szHello, lstrlen(szHello), &rt, DT_CENTER); EndPaint(hWnd, &ps); break; case WM_DESTROY: PostQuitMessage(0); break; // Parse the menu selections: case WM_NOTIFY: if(((LPNMHDR) lParam)->hwndFrom == g_hwndChgLog) { switch (((LPNMHDR) lParam)->code) { case LVN_GETDISPINFO: ChgLog_OnGetDispInfo((NMLVDISPINFO*)lParam); break; } } if(((LPNMHDR) lParam)->hwndFrom == g_hwndRestMap) { switch (((LPNMHDR) lParam)->code) { case LVN_GETDISPINFO: ChgLog_OnGetDispInfo((NMLVDISPINFO*)lParam); break; } } return 0; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } // Mesage handler for about box. LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_INITDIALOG: return TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return TRUE; } break; } return FALSE; }