⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filetest.h

📁 This ZIP archive includes the sources (and executable) for the FileTest utility, written by Ladisla
💻 H
字号:
/*****************************************************************************/
/* TestFile.h                             Copyright (c) Ladislav Zezula 2003 */
/*---------------------------------------------------------------------------*/
/* Definitions for file access testing application                           */
/*---------------------------------------------------------------------------*/
/*   Date    Ver   Who  Comment                                              */
/* --------  ----  ---  -------                                              */
/* 14.07.03  1.00  Lad  The first version of TestFile.h                      */
/*****************************************************************************/

#ifndef __TESTFILE_H__
#define __TESTFILE_H__

#ifndef UNICODE
#define UNICODE
#define _UNICODE
#endif

#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_NON_CONFORMING_SWPRINTFS
#include <tchar.h>
#include <stdio.h>
#include "ntstatus.h"

#define WIN32_NO_STATUS 
#include <windows.h>
#include <windowsx.h>
#include <ShlObj.h>

#include "ntdll.h"
#include "Utils.h"

//-----------------------------------------------------------------------------
// Defines

#define IsHandleValid(h)   (h != NULL && h != INVALID_HANDLE_VALUE)
#define IsHandleInvalid(h) (h == NULL || h == INVALID_HANDLE_VALUE)

#define ALIGN_INT32(Address) ((ULONG) ((Address + 3) & ~3))
#define ALIGN_INT64(Address) ((ULONG) ((Address + 7) & ~7))
#define ALIGN_EX(x, a)       (((x) + (a)-1) & ~((a)-1))

#define MAX_NT_PATH 32767                   // Maximum path name length in NT is 32767

#define OSVER_WINDOWS_2000    0x0500
#define OSVER_WINDOWS_XP      0x0501
#define OSVER_WINDOWS_2003    0x0502
#define OSVER_WINDOWS_VISTA   0x0600

//-----------------------------------------------------------------------------
// Structures

typedef struct
{
    DWORD   dwFlag;
    TCHAR * szFlagText;
    BOOL    bEnabled;

} TFlagInfo;

typedef struct
{
    TCHAR         szDirName[MAX_NT_PATH];   // Directory name
    TCHAR         szFileName1[MAX_NT_PATH]; // First file name
    TCHAR         szFileName2[MAX_NT_PATH]; // Second file name
    HANDLE        hTransaction;             // Handle to the current transaction (NULL if none)
    HANDLE        hDirectory;               // Handle to the open directory
    HANDLE        hFile;                    // Handle to the open file
    HANDLE        hMap;                     // Map handle (if the file is mapped)
    PVOID         pvFile;                   // Map pointer (if the file is mapped and accessed)
    DWORD         dwMapped;                 // Number of bytes mapped
    ACCESS_MASK   dwDesiredAccess;
    LARGE_INTEGER liAllocationSize;
    ULONG         dwFileAttributes;
    ULONG         dwShareAccess;
    ULONG         dwCreateDisposition;
    ULONG         dwCreateOptions;
    ULONG         dwObjAttrFlags;           // ObjAttr.Attributes
    ULONG         dwPageAccess;             // For CreateFileMapping
    ULONG         dwMapAccess;              // For MapViewOfFile
    BOOL          bTransactionActive;
    BOOL          bUseTransaction;

    int           cbFileInfoBuff;           // Size of pbFileInfoBuff in bytes
    BYTE          pbFileInfoBuff[1];        // Buffer for NtSetFileInfo

} TPropSheetData;

typedef struct
{
    HWND        hParent;                    // Parent of the dialog
    UINT        nIDTitle;                   // ID of the dialog title
    DWORD       dwFlags;                    // Flag value (in/out)
    int         nFlags;                     // Number of flags
    TFlagInfo * Flags;                      // Flags (structure array)
} TFlagDialogData;


//-----------------------------------------------------------------------------
// Data types and strctures for NtQueryInformationFile and NtSetInformationFile

#define TYPE_NONE       0
#define TYPE_BOOLEAN    1
#define TYPE_UINT8      2
#define TYPE_UINT16     3
#define TYPE_UINT32     4
#define TYPE_UINT64     5
#define TYPE_STRING     6
#define TYPE_WSTRING    7
#define TYPE_UCHAR16    8                   // UCHAR [16]
#define TYPE_HANDLE     9                   // Handle
#define TYPE_POINTER    10                  // pointer
#define TYPE_FDI_NAME   11                  // FileName in FILE_DIRECTORY_INFORMATION
#define TYPE_FFDI_NAME  12                  // FileName in FILE_FULL_DIRECTORY_INFORMATION
#define TYPE_FBDI_NAME1 13                  // ShortName in FILE_BOTH_DIRECTORY_INFORMATION
#define TYPE_FBDI_NAME2 14                  // FileName in FILE_BOTH_DIRECTORY_INFORMATION
#define TYPE_FNI_NAME   15                  // FileName in FILE_NAME_INFORMATION
#define TYPE_FNS_NAME   16                  // FileName in FILE_NAMES_INFORMATION
#define TYPE_FFEA_NAME  17                  // EaName in FILE_FULL_EA_INFORMATION
#define TYPE_FSI_NAME   18                  // Name in FILE_STREAM_INFORMATION
#define TYPE_FIBD_NAME1 19                  // ShortName in FILE_ID_BOTH_DIR_INFORMATION
#define TYPE_FIBD_NAME2 20                  // FileName in FILE_ID_BOTH_DIR_INFORMATION
#define TYPE_FIFD_NAME  21                  // FileName in FILE_ID_FULL_DIR_INFORMATION
#define TYPE_FRI_NAME   22                  // FileName in FILE_RENAME_INFORMATION
#define TYPE_LE_NAME    23                  // FileName in FILE_LINK_ENTRY_INFORMATION
#define TYPE_STRUCT     24                  // Sub-structure, nMemberSize must be sizeof(structure) !!!

#define MEMBER_SIZE_SPECIAL (UINT)-1        // For variable length data items

struct TStructMember
{
    LPCTSTR szMemberName;                       // Name of the member
    UINT    nDataType;                          // Data type
    UINT    nMemberSize;                        // Size (in bytes) of the structure member
    union
    {
        TStructMember * pSubItems;              // Subitems, if this is structure too
        PBYTE pDataPtr;                         // If this describes data item, pointer to binary data
    };
};

struct TFileInfoData
{
    FILE_INFORMATION_CLASS FileInfoClass;       // Value for NtSetInformationFile
    LPCTSTR                szFileInfoClass;     // Text for the value
    LPCTSTR                szStructName;        // Name of the input/output structure 
    TStructMember        * pStructMembers;      // Description of the data structure
                                                // (NULL = not implemented)
    BOOL                   bIsChain;            // if TRUE, it is a chain of structures
                                                // (with ULONG NextEntryOffset as first member)
    BOOL                   bIsEditable;         // If TRUE, the structu is editable
                                                // and able to send to NtSetInfo
};

#define FILE_INFO_READONLY(classname, structname, ischain)   \
    {classname, _T(#classname), _T(#structname), classname##Members, ischain, FALSE}

#define FILE_INFO_EDITABLE(classname, structname, ischain)   \
    {classname, _T(#classname), _T(#structname), classname##Members, ischain, TRUE}

#define FILE_INFO_UNSUPPORTED(classname, structname, ischain)   \
    {classname, _T(#classname), NULL, NULL, FALSE, FALSE}


//-----------------------------------------------------------------------------
// Prototypes for transaction APIs

typedef HANDLE (WINAPI * CREATETRANSACTION)(
    LPSECURITY_ATTRIBUTES lpTransactionAttributes,
    LPGUID TransactionGuid,
    DWORD CreateOptions,
    DWORD IsolationLevel,
    DWORD IsolationFlags,
    DWORD dwMilliseconds,
    LPWSTR Description
    );

typedef BOOL (WINAPI * SETCURRENTTRANSACTION)(
    HANDLE hTransaction
    );
    
typedef BOOL (WINAPI * COMMITTRANSACTION)(
    HANDLE hTransaction
    );

typedef BOOL (WINAPI * ROLLBACKTRANSACTION)(
    HANDLE hTransaction
    );

typedef HANDLE (WINAPI * RTLGETCURRENTTRANSACTION)(
    );

typedef VOID (WINAPI * RTLSETCURRENTTRANSACTION)(
    HANDLE TransactionHandle
    );

typedef HANDLE (WINAPI * CREATEFILETRANSACTED)(
    LPCTSTR lpFileName,
    DWORD dwDesiredAccess,
    DWORD dwShareMode,
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    DWORD dwCreationDisposition,
    DWORD dwFlagsAndAttributes,
    HANDLE hTemplateFile,
    HANDLE hTransaction,
    PUSHORT pusMiniVersion, 
    PVOID  lpExtendedParameter);

//-----------------------------------------------------------------------------
// Global variables

extern HINSTANCE g_hInst;
extern HANDLE g_hHeap;
extern BOOL g_bDisableDialogDispatch;

extern CREATETRANSACTION        pfnCreateTransaction;
extern COMMITTRANSACTION        pfnCommitTransaction;
extern ROLLBACKTRANSACTION      pfnRollbackTransaction;
extern RTLGETCURRENTTRANSACTION pfnRtlGetCurrentTransaction;
extern RTLSETCURRENTTRANSACTION pfnRtlSetCurrentTransaction;
extern CREATEFILETRANSACTED     pfnCreateFileTransacted;

//-----------------------------------------------------------------------------
// NTSTATUS conversion

const TCHAR * NtStatus2Text(NTSTATUS Status);

//-----------------------------------------------------------------------------
// Utilities (in Utils.cpp)

DWORD Text2CreateDisposition(const TCHAR * szText);
void  CreateDisposition2Text(DWORD dwCreateDisposition, TCHAR * szBuffer);

DWORD DlgText2Hex32(HWND hDlg, UINT nIDCtrl);
DWORD Text2Hex32(const TCHAR * szText);
void  Hex2Text32(DWORD dwValue, TCHAR * szBuffer);
void  Hex2DlgText32(HWND hDlg, UINT nIDCtrl, DWORD dwValue);

DWORD_PTR DlgText2HexPtr(HWND hDlg, UINT nIDCtrl);
DWORD_PTR Text2HexPtr(const TCHAR * szText);
void  Hex2TextPtr(DWORD_PTR & dwpValue, TCHAR * szBuffer);
void Hex2DlgTextPtr(HWND hDlg, UINT nIDCtrl, DWORD_PTR dwpValue);

LARGE_INTEGER DlgText2Hex64(HWND hDlg, UINT nIDCtrl);
LARGE_INTEGER Text2Hex64(const TCHAR * szText);
void  Hex2Text64(LARGE_INTEGER & liValue, TCHAR * szBuffer);
void  Hex2DlgText64(HWND hDlg, UINT nIDCtrl, LARGE_INTEGER & liValue);

int SetLastErrorText(HWND hDlg, UINT nIDCtrl, int nError);
ULONG GetEaEntrySize(PFILE_FULL_EA_INFORMATION EaInfo);

HTREEITEM InsertTreeItem(HWND hTreeView, HTREEITEM hParentItem, LPCTSTR szText, PVOID pParam);

void ResolveDynamicLoadedAPIs();
void UnloadDynamicLoadedAPIs();

//-----------------------------------------------------------------------------
// Global functions

INT_PTR FlagsDialog(TFlagDialogData * pData);
INT_PTR EaEditorDialog(HWND hParent, PFILE_FULL_EA_INFORMATION * pEaInfo);

//-----------------------------------------------------------------------------
// Message handlers for each page

INT_PTR CALLBACK PageProc00(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK PageProc01(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK PageProc02(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK PageProc03(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK PageProc04(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK PageProc05(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK PageProc06(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
INT_PTR CALLBACK PageProc07(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);

#endif // __TESTFILE_H__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -