Leaked source code of windows server 2003
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.
 
 
 
 
 
 

179 lines
3.9 KiB

/*++
Copyright (c) Microsoft Corporation. All rights reserved.
Module Name:
LogFileChanges.h
Abstract:
This AppVerifier shim hooks all the native file I/O APIs
that change the state of the system and logs their
associated data to a text file.
Notes:
This is a general purpose shim.
History:
08/17/2001 rparsons Created
--*/
#ifndef __APPVERIFIER_LOGFILECHANGES_H_
#define __APPVERIFIER_LOGFILECHANGES_H_
#include "precomp.h"
//
// Length (in characters) of the largest element.
//
#define MAX_ELEMENT_SIZE 1024 * 10
//
// Length (in characters) of the longest operation type.
//
#define MAX_OPERATION_LENGTH 32
//
// Flags that indicate what state the file is in.
//
#define LFC_EXISTING 0x00000001
#define LFC_DELETED 0x00000002
#define LFC_MODIFIED 0x00000004
#define LFC_UNAPPRVFW 0x00000008
//
// Maximum number of handles we can track for a single file.
//
#define MAX_NUM_HANDLES 64
//
// We maintain a doubly linked list of file handles so we know what file is being modified
// during a file operation.
//
typedef struct _LOG_HANDLE {
LIST_ENTRY Entry;
HANDLE hFile[MAX_NUM_HANDLES]; // array of file handles
DWORD dwFlags; // flags that relate to the state of the file
LPWSTR pwszFilePath; // full path to the file
UINT cHandles; // number of handles open for this file
} LOG_HANDLE, *PLOG_HANDLE;
//
// Flags that define different settings in effect.
//
#define LFC_OPTION_ATTRIBUTES 0x00000001
#define LFC_OPTION_UFW_WINDOWS 0x00000002
#define LFC_OPTION_UFW_PROGFILES 0x00000004
//
// Enumeration for different operations.
//
typedef enum {
eCreatedFile = 0,
eOpenedFile,
eDeletedFile,
eModifiedFile,
eRenamedFile
} OperationType;
#ifdef ARRAYSIZE
#undef ARRAYSIZE
#endif
#define ARRAYSIZE(a) (sizeof(a) / sizeof(a[0]))
//
// Macros for memory allocation/deallocation.
//
#define MemAlloc(s) RtlAllocateHeap(RtlProcessHeap(), HEAP_ZERO_MEMORY, (s))
#define MemFree(b) RtlFreeHeap(RtlProcessHeap(), 0, (b))
//
// On Windows 2000, we need to pre-allocate the event
// in RTL_CRITICAL_SECTION. On XP and above, this is
// a no-op.
//
#define PREALLOCATE_EVENT_MASK 0x80000000
//
// Critical section wrapper class.
//
class CCriticalSection
{
private:
CRITICAL_SECTION m_CritSec;
public:
CCriticalSection()
{
InitializeCriticalSectionAndSpinCount(&m_CritSec,
PREALLOCATE_EVENT_MASK | 4000);
}
~CCriticalSection()
{
DeleteCriticalSection(&m_CritSec);
}
void Lock()
{
EnterCriticalSection(&m_CritSec);
}
BOOL TryLock()
{
return TryEnterCriticalSection(&m_CritSec);
}
void Unlock()
{
LeaveCriticalSection(&m_CritSec);
}
};
//
// Auto-lock class that uses the CCriticalSection class.
//
class CLock
{
private:
CCriticalSection &m_CriticalSection;
public:
CLock(CCriticalSection &CriticalSection)
: m_CriticalSection(CriticalSection)
{
m_CriticalSection.Lock();
}
~CLock()
{
m_CriticalSection.Unlock();
}
};
APIHOOK_ENUM_BEGIN
APIHOOK_ENUM_ENTRY(NtDeleteFile)
APIHOOK_ENUM_ENTRY(NtClose)
APIHOOK_ENUM_ENTRY(NtCreateFile)
APIHOOK_ENUM_ENTRY(NtOpenFile)
APIHOOK_ENUM_ENTRY(NtWriteFile)
APIHOOK_ENUM_ENTRY(NtWriteFileGather)
APIHOOK_ENUM_ENTRY(NtSetInformationFile)
//
// Hook these only for Windows 2000 so we know when
// it's safe to call shel32.
//
#ifdef SHIM_WIN2K
APIHOOK_ENUM_ENTRY(GetStartupInfoA)
APIHOOK_ENUM_ENTRY(GetStartupInfoW)
#endif // SHIM_WIN2K
APIHOOK_ENUM_END
#endif // __APPVERIFIER_LOGFILECHANGES_H_