Files
BeneficialCode-WinArk/KernelLibrary/FileManager.h
T

146 lines
4.1 KiB
C++

#pragma once
enum class FileAccessMask:ULONG {
WriteData = FILE_WRITE_DATA,// 写文件内容
ReadData = FILE_READ_DATA, // 读文件内容
Delete = DELETE, // 删除或者给文件改名字
WriteAttributes = FILE_WRITE_ATTRIBUTES, // 设置文件写属性
ReadAttributes = FILE_READ_ATTRIBUTES, // 设置文件读属性
Read = GENERIC_READ,
Write = GENERIC_WRITE,
All = GENERIC_ALL,
Synchronize = SYNCHRONIZE,
};
DEFINE_ENUM_FLAG_OPERATORS(FileAccessMask);
extern "C"
NTSTATUS NtQueryAttributesFile(
_In_ POBJECT_ATTRIBUTES ObjectAttributes,
_Out_ PFILE_BASIC_INFORMATION FileInformation
);
extern "C"
NTSTATUS ObCreateObject(
_In_opt_ KPROCESSOR_MODE ObjectAttributesAccessMode,
_In_ POBJECT_TYPE Type,
_In_opt_ POBJECT_ATTRIBUTES ObjectAttributes,
_In_ KPROCESSOR_MODE AccessMode,
_Inout_opt_ PVOID ParseContext,
_In_ ULONG ObjectSize,
_In_opt_ ULONG PagedPoolCharge,
_In_opt_ ULONG NonPagedPoolCharge,
_Out_ PVOID* Object
);
typedef struct _AUX_ACCESS_DATA {
PPRIVILEGE_SET PrivilegesUsed;
GENERIC_MAPPING GenericMapping;
ACCESS_MASK AccessesToAudit;
ACCESS_MASK MaximumAuditMask;
ULONG Unknown[256];
}AUX_ACCESS_DATA,*PAUX_ACCESS_DATA;
extern "C"
NTSTATUS SeCreateAccessState(
_Out_ PACCESS_STATE AccessState,
_Out_ PAUX_ACCESS_DATA AuxData,
_In_ ACCESS_MASK DesiredAccess,
_In_opt_ PGENERIC_MAPPING GenericMapping
);
IO_COMPLETION_ROUTINE IoCompletionRoutine;
// 参考链接
// https://bbs.pediy.com/thread-264070.htm
struct FileManager {
public:
NTSTATUS Open(PUNICODE_STRING fileName, FileAccessMask accessMask = FileAccessMask::All);
NTSTATUS Close();
NTSTATUS WriteFile(PVOID buffer, ULONG size, PIO_STATUS_BLOCK ioStatus, PLARGE_INTEGER offset);
NTSTATUS ReadFile(PVOID buffer, ULONG size, PIO_STATUS_BLOCK ioStatus, PLARGE_INTEGER offset);
NTSTATUS GetFileSize(PLARGE_INTEGER fileSize);
//NTSTATUS CreateDir(PUNICODE_STRING dir);
static NTSTATUS DeleteFile(PUNICODE_STRING fileName);
static NTSTATUS ConvertDosNameToNtName(_In_ PCWSTR dosName, _Out_ PUNICODE_STRING ntName);
NTSTATUS GetRootName(_In_ PCWSTR dosName,_Out_ PUNICODE_STRING rootName);
NTSTATUS OpenFileForRead(PCWSTR path);
//NTSTATUS RenameFile();
//NTSTATUS EnumurateFile();
NTSTATUS SetInformationFile(PIO_STATUS_BLOCK ioStatus,PVOID FileInformation,ULONG Length,FILE_INFORMATION_CLASS FileInformationClass);
// 解锁并释放MDL链
static VOID FreeMdl(_In_ PMDL mdl);
NTSTATUS IrpCreateFile(
_Out_ PFILE_OBJECT* pFileObject,
_Out_ PDEVICE_OBJECT* pDeviceObject,
_In_ ACCESS_MASK DesiredAccess,
_In_ PCWSTR DosName,
_Out_ PIO_STATUS_BLOCK IoStatusBlock,
_In_opt_ PLARGE_INTEGER AllocationSize,
_In_ ULONG FileAttributes,
_In_ ULONG ShareAccess,
_In_ ULONG CreateDisposition,
_In_ ULONG CreateOptions,
_In_reads_bytes_opt_(EaLength) PVOID EaBuffer,
_In_ ULONG EaLength
);
NTSTATUS IrpQueryDirectoryFile(
_In_ PDEVICE_OBJECT DeviceObject,
_In_ PFILE_OBJECT FileObject,
_Out_ PIO_STATUS_BLOCK IoStatusBlock,
_Out_writes_bytes_(Length) PVOID FileInformation,
_In_ ULONG Length,
_In_ FILE_INFORMATION_CLASS FileInformationClass,
_In_ BOOLEAN ReturnSingleEntry,
_In_opt_ PUNICODE_STRING FileName,
_In_ BOOLEAN RestartScan
);
NTSTATUS IrpSetInformationFile(
_In_ PDEVICE_OBJECT DeviceObject,
_In_ PFILE_OBJECT FileObject,
_In_opt_ PFILE_OBJECT TargetFileObject,
_Out_ PIO_STATUS_BLOCK IoStatusBlock,
_In_reads_bytes_(Length) PVOID FileInformation,
_In_ ULONG Length,
_In_ FILE_INFORMATION_CLASS FileInformationClass
);
NTSTATUS IrpCleanupFile(
_In_ PDEVICE_OBJECT DeviceObject,
_In_ PFILE_OBJECT FileObject
);
NTSTATUS IrpCloseFile(
_In_ PDEVICE_OBJECT DeviceObject,
_In_ PFILE_OBJECT FileObject
);
NTSTATUS IrpDeleteFile(
IN PDEVICE_OBJECT DeviceObject, //如果指定为pFileObject->Vpb->DeviceObject,可绕过文件系统过滤驱动
IN PFILE_OBJECT FileObject
);
NTSTATUS IrpQueryInformationFile(
_In_ PDEVICE_OBJECT DeviceObject,
_In_ PFILE_OBJECT FileObject,
_Out_ PIO_STATUS_BLOCK IoStatusBlock,
_Out_writes_bytes_(Length) PVOID FileInformation,
_In_ ULONG Length,
_In_ FILE_INFORMATION_CLASS FileInformationClass
);
NTSTATUS ForceDeleteFile(PCWSTR fileName);
~FileManager();
private:
HANDLE _handle{ nullptr };
};