今天,上了下看雪,好久没上去了,现在的看雪,跟之前不一样了,刚毕业的那个时候,上面的大牛真是多,现在屈指可数了,可能这些大牛们,因为年纪的增长,已经不在一线了,或许因为家庭,每时间在论坛上逛了,也许都已经在创业了,现在这个APP泛滥的年代,意念和想法,已经不靠技术了,也没有多少人在研究着技术,目前的中国还是有些浮躁,其实好好想想,现在所有的系统,芯片还是掌握在别人手上,不要谈Android,Windows谁号谁坏,其实中国本就没有发言权,因为再好,或者谁好,都不是自己的,看愈演愈烈的网络监听吧。别人现在是赚钱,如果上升到国家安全,好用是好用,但你摆脱不了的时候,它就可以控制你,监听你。其实现在的中国互联网公司已经有很多钱了,为什么不去扶持一下,中国的操作系统,芯片了。
我们今天来看下,微软的文件系统微过滤驱动的示例,主要的功能,包括,用户模式的应用程序和微小过滤驱动层程序的交流。微小过滤驱动的文件名的分析。一些相关文件信息的上传到应用程序。借此机会,重新来回顾一下,这些知识点。
这里首先分配了一个全局的上下文的空间。
typedef struct _MINISPY_DATA {
//
// The object that identifies this driver.
//
PDRIVER_OBJECT DriverObject;
//
// The filter that results from a call to
// FltRegisterFilter.
//
PFLT_FILTER Filter;
//
// Server port: user mode connects to this port
//
PFLT_PORT ServerPort;
//
// Client connection port: only one connection is allowed at a time.,
//
PFLT_PORT ClientPort;
//
// List of buffers with data to send to user mode.
//
KSPIN_LOCK OutputBufferLock;
LIST_ENTRY OutputBufferList;
//
// Lookaside list used for allocating buffers.
//
NPAGED_LOOKASIDE_LIST FreeBufferList;
//
// Variables used to throttle how many records buffer we can use
//
LONG MaxRecordsToAllocate;
__volatile LONG RecordsAllocated;
//
// static buffer used for sending an "out-of-memory" message
// to user mode.
//
__volatile LONG StaticBufferInUse;
//
// We need to make sure this buffer aligns on a PVOID boundary because
// minispy casts this buffer to a RECORD_LIST structure.
// That can cause alignment faults unless the structure starts on the
// proper PVOID boundary
//
PVOID OutOfMemoryBuffer[RECORD_SIZE/sizeof( PVOID )];
//
// Variable and lock for maintaining LogRecord sequence numbers.
//
__volatile LONG LogSequenceNumber;
//
// The name query method to use. By default, it is set to
// FLT_FILE_NAME_QUERY_ALWAYS_ALLOW_CACHE_LOOKUP, but it can be overridden
// by a setting in the registery.
//
ULONG NameQueryMethod;
//
// Global debug flags
//
ULONG DebugFlags;
#if MINISPY_VISTA
//
// Dynamically imported Filter Mgr APIs
//
PFLT_SET_TRANSACTION_CONTEXT PFltSetTransactionContext;
PFLT_GET_TRANSACTION_CONTEXT PFltGetTransactionContext;
PFLT_ENLIST_IN_TRANSACTION PFltEnlistInTransaction;
#endif
} MINISPY_DATA, *PMINISPY_DATA;
注册操作函数的定义:
CONST FLT_REGISTRATION FilterRegistration = {
sizeof(FLT_REGISTRATION), // Size
FLT_REGISTRATION_VERSION, // Version
#if MINISPY_WIN8
FLTFL_REGISTRATION_SUPPORT_NPFS_MSFS, // Flags
#else
0, // Flags
#endif // MINISPY_WIN8
Contexts, // Context
Callbacks, // Operation callbacks
SpyFilterUnload, // FilterUnload
NULL, // InstanceSetup
SpyQueryTeardown, // InstanceQueryTeardown
NULL, // InstanceTeardownStart
NULL, // InstanceTeardownComplete
NULL, // GenerateFileName
NULL, // GenerateDestinationFileName
NULL // NormalizeNameComponent
#if MINISPY_VISTA
SpyKtmNotificationCallback // KTM notification callback
#endif // MINISPY_VISTA
};
这里,还有两个内置的数据结构。
const FLT_CONTEXT_REGISTRATION Contexts[] = {
#if MINISPY_VISTA
{ FLT_TRANSACTION_CONTEXT,
0,
SpyDeleteTxfContext,
sizeof(MINISPY_TRANSACTION_CONTEXT),
'ypsM' },
#endif // MINISPY_VISTA
{ FLT_CONTEXT_END }
};
这个是定义上下文,这里主要是为VISTA以后出现的传输上下文。
再Callbacks操作的定义:
CONST FLT_OPERATION_REGISTRATION Callbacks[] = {
{ IRP_MJ_CREATE,
0,
SpyPreOperationCallback,
SpyPostOperationCallback },
{ IRP_MJ_CREATE_NAMED_PIPE,
0,
SpyPreOperationCallback,
SpyPostOperationCallback },
{ IRP_MJ_CLOSE,
0,
SpyPreOperationCallback,
SpyPostOperationCallback },
{ IRP_MJ_READ,
0,
SpyPreOperationCallback,
SpyPostOperationCallback },
{ IRP_MJ_WRITE,
0,
SpyPreOperationCallback,
SpyPostOperationCallback },
{ IRP_MJ_QUERY_INFORMATION,
0,
SpyPreOperationCallback,
SpyPostOperationCallback },
{ IRP_MJ_SET_INFORMATION,
0,
SpyPreOperationCallback,
SpyPostOperationCallback },
{ IRP_MJ_QUERY_EA,
0,
SpyPreOperationCallback,
SpyPostOperationCallback },
{ IRP_MJ_SET_EA,
0,
SpyPreOperationCallback,
SpyPostOperationCallback },
{ IRP_MJ_FLUSH_BUFFERS,
0,
SpyPreOperationCallback,
SpyPostOperationCallback },
{ IRP_MJ_QUERY_VOLUME_INFORMATION,
0,
SpyPreOperationCallback,
SpyPostOperationCallback },
{ IRP_MJ_SET_VOLUME_INFORMATION,
0,
SpyPreOperationCallback,
SpyPostOperationCallback },
{ IRP_MJ_DIRECTORY_CONTROL,
0,
SpyPreOperationCallback,
SpyPostOperationCallback },
{ IRP_MJ_FILE_SYSTEM_CONTROL,
0,
SpyPreOperationCallback,
SpyPostOperationCallback },
{ IRP_MJ_DEVICE_CONTROL,
0,
SpyPreOperationCallback,
SpyPostOperationCallback },
{ IRP_MJ_INTERNAL_DEVICE_CONTROL,
0,
SpyPreOperationCallback,
SpyPostOperationCallback },
{ IRP_MJ_SHUTDOWN,
0,
SpyPreOperationCallback,
NULL }, //post operation callback not supported
{ IRP_MJ_LOCK_CONTROL,
0,
SpyPreOperationCallback,
SpyPostOperationCallback },
{ IRP_MJ_CLEANUP,
0,
SpyPreOperationCallback,
SpyPostOperationCallback },
{ IRP_MJ_CREATE_MAILSLOT,
0,
SpyPreOperationCallback,
SpyPostOperationCallback },
{ IRP_MJ_QUERY_SECURITY,
0,
SpyPreOperationCallback,
SpyPostOperationCallback },
{ IRP_MJ_SET_SECURITY,
0,
SpyPreOperationCallback,
SpyPostOperationCallback },
{ IRP_M