-
-
[原创]文件沙盘代码YasVps
-
发表于:
2009-12-10 12:49
18039
-
之前计划写的沙盘系统,刚写好文件部分,也不算太完善,碰巧有人问起,遂贴上代码大家看去,你可以在此基础上完善之。 代码没什么WS技术,但做文件沙盘还是有不少问题的,需要的朋友可以下, 贴上主要头文件。基本代码是围绕这个头文件展开的。
#include <ntddk.h>
#pragma once
// ucReseaon :
//
// Basic
//
#define YASVPS_CREATE_FILE 0x00
#define YASVPS_MOVE_FILE 0x01
#define YASVPS_REPLACE_FILE 0x02
#define YASVPS_RENAME_FILE 0x03
#define YASVPS_WRITE_FILE 0x04
//
//Option
//
#define YASVPS_SETFILE_BASICINFO 0x05
#define YASVPS_SETFILE_ENDINFO 0x06
#define YASVPS_SETFILE_POSINFO 0x07
#define YASVPS_SETFILE_SECINFO 0x08
//
//删除以存在文件时追踪,
//对已存在文件的删除是不可恢复的,所以这个链表跟进程的生命周期一样,而且只能添加节点不能删除。
//
typedef struct __YASVPS_DELETETRACE
{
ULONG uPid;
CHAR lpszDelFilePath[YASVPS_MAX_PATH];
struct __YASVPS_DELETETRACE* lpNext;
}YASVPS_DELETETRACE;
//
//创建新文件时追踪,添加节点前,先判断文件是否 “删除文件追踪” 存在,若存在,则删除对应节点
//删除文件时,需要查找这个表的信息,如果发现删除的是自己创建的文件,则允许删除。并删除相关跟踪节点
//同样的任何修改文件也需要先找这张表
//外界不应该操作在YASVPS中运行进程创建的文件。
//
/*
dir 规则:
如果在枚举目录文件时, “删除以存在文件” 中有文件在对应的目录中。
如果在YASVPS_CREATEFILETRACE 没有相应节点,则过滤掉删除的文件,不显示
否则显示之
*/
/*
覆盖文件:
覆盖新创建文件: 直接允许
覆盖已存在文件: 相当于 删除原来存在的文件,再创建一个新的文件。
*/
/*
移动已存在文件: eg: c:\123.exe --->> c:\windows\123.exe --->> c:\123.exe
相当于删除文件再创建文件。
*/
//
//修改以存在文件时追踪。删除下面匹配的文件时,相应节点也要删除。
//
typedef struct __YASVPS_CREATETRACE
{
//
//任何修改文件也需要先找这张表,再根据 ucReseaon 做相应的操作
//
struct __YASVPS_CREATETRACE* lpNext;
ULONG uPid; //进程PID
HANDLE hFile;
PFILE_OBJECT lpFileObj; //保留
/*
ucReseaon :
#define YASVPS_CREATE_FILE 0x00
#define YASVPS_MOVE_FILE 0x01
#define YASVPS_REPLACE_FILE 0x02
#define YASVPS_RENAME_FILE 0x03
#define YASVPS_WRITE_FILE 0x04
*/
UCHAR ucReseaon;
/*
ucReseaon = YASVPS_CREATE_FILE
eg: lpszCreatePath : C:\123.exe
重定向 lpszTracePath : C:\YasVPS\C:\123.exe
之后 修改名字为 hello.exe 则 lpszCreatePath : C:\hello.exe
对YASVPS_CREATE_FILE 文件的操作,都直接PASS, 删除文件时,需要删除lpszLinkPath,
并删除对应YASVPS_CREATETRACE节点
“外界不应该操作在YASVPS中运行进程创建的文件!!!!!”
*/
//
//重命名/移动文件/覆盖文件/创建后后新的路径
//
CHAR lpszNewPath[YASVPS_MAX_PATH];
//
//指向的原始路径, 当该文件被写时,这个地方为TMP文件,写的文件不能超过10M(*)
//
CHAR lpszLinkPath[YASVPS_MAX_PATH];
//
//下面的暂时保留,不支持,主要是从效率和节省内存考虑
//
/* FILE_BASIC_INFORMATION stFileBasicInfo;
FILE_END_OF_FILE_INFORMATION szFileEndInfo;
*/
}YASVPS_CREATETRACE, *PYASVPS_CREATETRACE;
PYASVPS_CREATETRACE VpsAddCreateTraceNode( );
PYASVPS_CREATETRACE VpsIsFileRedirect( CHAR* lpszNewPath );
PYASVPS_CREATETRACE VpsIsFileRedirect_2(IN CHAR* lpszLinkPath );
PYASVPS_CREATETRACE __VpsGetRedirectInfo( CHAR* lpszDirPath , IN OUT CHAR* lpszFileName);
BOOLEAN VpsExaPath(PSTR szFilePath,PSTR szFileName,PSTR szFileDir,PSTR szFileExtName);
BOOLEAN VpsExaDirPath(PSTR szFilePath,PSTR szFileDir);
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课