Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

188 lines
4.7 KiB

/******************************************************************************
*
* Copyright (c) 2000 Microsoft Corporation
*
* Module Name:
* chglog.cpp
*
* Abstract:
* Tool for enumerating the change log - forward/reverse
*
* Revision History:
* Brijesh Krishnaswami (brijeshk) 04/09/2000
* created
*
*****************************************************************************/
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#include <windows.h>
#include <stdio.h>
#include "srapi.h"
#include <shellapi.h>
#include "enumlogs.h"
#include "srrpcapi.h"
#include <dbgtrace.h>
struct _EVENT_STR_MAP
{
DWORD EventId;
LPWSTR pEventStr;
} EventMap[ 13 ] =
{
{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 " },
{SrEventMountCreate, L"MNT-CREATE " },
{SrEventMountDelete, L"MNT-DELETE " }
};
LPWSTR
GetEventString(
DWORD EventId
)
{
LPWSTR pStr = NULL;
static WCHAR EventStringBuffer[8];
for( int i=0; i<sizeof(EventMap)/sizeof(_EVENT_STR_MAP);i++)
{
if ( EventMap[i].EventId == EventId )
{
pStr = EventMap[i].pEventStr;
}
}
if (pStr == NULL)
{
pStr = &EventStringBuffer[0];
wsprintf(pStr, L"0x%X", EventId);
}
return pStr;
}
void __cdecl
main()
{
DWORD dwTargetRPNum = 0;
LPWSTR * argv = NULL;
int argc;
HGLOBAL hMem = NULL;
BOOL fSwitch = TRUE;
BOOL fForward = TRUE;
BOOL fExtended = FALSE;
DWORD dwRc;
InitAsyncTrace();
argv = CommandLineToArgvW(GetCommandLine(), &argc);
if (! argv)
{
printf("Error parsing arguments");
goto done;
}
if (argc < 2)
{
printf("Usage: chglog <drive> <extended=0> <forward=1/0> <RPNum> <Switch=1/0>");
goto done;
}
if (argc >= 3)
{
fExtended = _wtoi(argv[2]);
}
if (argc >= 4)
{
fForward = _wtoi(argv[3]);
}
if (argc >= 5)
{
dwTargetRPNum = (DWORD) _wtol(argv[4]);
}
if (argc >= 6)
{
fSwitch = _wtoi(argv[5]);
}
{
if (fSwitch)
{
dwRc = SRSwitchLog();
if (ERROR_SUCCESS != dwRc)
{
printf("! SRSwitchLog : %ld", dwRc);
goto done;
}
}
CChangeLogEntryEnum ChangeLog(argv[1], fForward, dwTargetRPNum, fSwitch);
CChangeLogEntry cle;
if (ERROR_SUCCESS != ChangeLog.FindFirstChangeLogEntry(cle))
{
printf("No change log entries");
goto done;
}
do
{
if (fExtended)
{
printf(
"%08I64ld\t%S\tFlags=%08d\tAttr=%08d\tAcl=%S\tProcess=%S\tPath1=%S\tPath2=%S\tTemp=%S\tShortName=%S\n",
cle.GetSequenceNum(),
GetEventString(cle.GetType()),
cle.GetFlags(),
cle.GetAttributes(),
cle.GetAcl() ? L"Yes" : L"No",
cle.GetProcess() ? cle.GetProcess() : L"null",
cle.GetPath1() ? cle.GetPath1() : L"null",
cle.GetPath2() ? cle.GetPath2() : L"null",
cle.GetTemp() ? cle.GetTemp() : L"null",
cle.GetShortName() ? cle.GetShortName() : L"null");
}
else
{
printf(
"%08I64d\t%S\t%S\t%S\t%S\t%S\n",
cle.GetSequenceNum(),
GetEventString(cle.GetType()),
cle.GetProcess() ? cle.GetProcess() : L"null",
cle.GetPath1() ? cle.GetPath1() : L"null",
cle.GetPath2() ? cle.GetPath2() : L"null",
cle.GetTemp() ? cle.GetTemp() : L"null");
}
dwRc = ChangeLog.FindNextChangeLogEntry(cle);
} while (dwRc == ERROR_SUCCESS);
if (argc == 7 && 0 == lstrcmpi(argv[6], L"lock"))
getchar();
ChangeLog.FindClose();
}
done:
if (argv) hMem = GlobalHandle(argv);
if (hMem) GlobalFree(hMem);
TermAsyncTrace();
return;
}