利用Fltmgr加载驱动

#include<stdio.h>
#include<windows.h>

typedef struct _tagLOAD
{
   WORD Len;
   WCHAR ServiceName[512];
} LOAD , *PLOAD;

#define MAGIC_IOCTL 0x00088004


VOID WINAPI make_reg( LPWSTR szDriverName, LPWSTR szDriverPath )
{
   
   DWORD dwType = SERVICE_KERNEL_DRIVER; 
   DWORD dwStart = SERVICE_DEMAND_START; 
   HKEY hKey;
   WCHAR szMain[512] = {0};
   WCHAR szImgPath[512] = {0};
   wchar_t szRegPath[512]={0};
   
   wsprintfW( szMain, 
      L"%s%s",
      L"SYSTEM\\CurrentControlSet\\Services\\",
      szDriverName );
   
   wsprintfW( szImgPath,
      L"%s%s",
      L"", 
      szDriverPath);
     
   if( RegCreateKeyW( HKEY_LOCAL_MACHINE, szMain, &hKey ) == ERROR_SUCCESS ) 
   {
      RegSetValueExW( hKey, 
         L"DisplayName", 
         0, 
         REG_SZ, 
         (LPBYTE)szDriverName, 
         (DWORD)lstrlenW(szDriverName)*2);
      
      RegSetValueExW( hKey, 
         L"ImagePath", 
         0, 
         REG_EXPAND_SZ,
         (LPBYTE)szImgPath, 
         (DWORD)lstrlenW(szImgPath)*2);
      
      RegSetValueExW( hKey, 
         L"Type",
         0,
         REG_DWORD,
         (LPBYTE)&dwType,
         (DWORD)sizeof(dwType) );
      
      RegSetValueExW( hKey, 
         L"Start",
         0,
         REG_DWORD,
         (LPBYTE)&dwStart,
         (DWORD)sizeof(dwStart) );
      
   }    
}


int main( int argc , char *argv[] )
{
   HANDLE hDevice;
   LOAD service_to_load;
   BOOL err;
   DWORD dwRet=0;
   WCHAR drvPath[512];

   memset( drvPath , 0 , 512 );
   GetCurrentDirectoryW( MAX_PATH , drvPath );
   lstrcatW( drvPath , L"" );
   make_reg( L"aaa" , drvPath );
   hDevice = CreateFile ("\\\\.\\FltMgr" , GENERIC_READ | GENERIC_WRITE , FILE_SHARE_READ | FILE_SHARE_WRITE , NULL , OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL );
   if( hDevice == INVALID_HANDLE_VALUE )
   {
      printf("CreateFile failed with status : %d\n" , GetLastError() );
      goto __end;
   }

   wcscpy( service_to_load.ServiceName , L"aaa");
   service_to_load.Len = wcslen( service_to_load.ServiceName )*sizeof(WCHAR);
   err = DeviceIoControl( hDevice , MAGIC_IOCTL , &service_to_load , sizeof(service_to_load) , NULL , 0 , &dwRet , NULL );
   if( !err )
   {
      printf("sorry\n");
      goto __end;
   }
   printf(":)\n");

__end:

   CloseHandle( hDevice );
   return 0;
}

<think>好的,用户现在想了解FLTMGR.SYS是什么驱动程序,需要功能描述和相关技术信息。首先,我需要回顾之前的对话,用户之前询问了intelppm.sys的作用和问题,现在转向另一个系统文件fltmgr.sys。用户提供的引用资料中有关于过滤器驱动程序和FltMgr的代码示例和错误信息,需要结合这些信息来回答。首先,确定FLTMGR.SYS的基本信息。根据引用[2],过滤器驱动程序用于扩展设备功能,特别是文件系统和网络过滤。引用[1]中的服务类型和依赖项显示,FltMgr是服务依赖项,说明fltmgr.sys是核心组件。然后,功能方面,用户需要知道它的核心作用。文件系统过滤驱动管理,支持多个过滤驱动实例,这来自引用[1]和[2]。错误代码引用[3]中的STATUS_FLT_NOT_INITIALIZED,说明FltMgr加载时的错误,进一步确认其管理角色。 技术架构部分,需要解释分层过滤模型,IRP处理,动态加载。引用[2]提到IRP筛选,引用[1]中的ServiceType和StartType说明它是文件系统驱动,按需启动。动态加载可能与引用[4]中的CreateFile调用有关,操作FltMgr设备。常见问题部分,用户可能遇到加载失败、冲突、资源不足,引用[3]中的错误代码可以对应解释。例如,0xC01C0003对应未加载,权限问题对应0xC0000022。最后,相关问题需要围绕功能、错误处理、开发、调试展开,结合用户之前的兴趣点,比如蓝屏问题,可能涉及驱动冲突或资源不足的情况。 需要确保使用正确的LaTeX格式,但用户的问题中没有数学公式,所以可能不需要。检查引用标注是否正确,每个引用在回答中对应。例如,分层模型引用[2],动态加载引用[1]和[4]。</think>### FLTMGR.SYS 驱动程序功能解析 **FLTMGR.SYS**(Filter Manager Driver)是 Windows 系统的核心组件,属于**文件系统过滤器驱动管理器**,主要功能包括: 1. **管理文件系统过滤驱动栈**:协调多个过滤驱动加载顺序与交互,例如加密代理、反病毒软件等[^1][^2]。 2. **提供过滤框架**:通过拦截 I/O 请求包(IRP)实现文件操作监控与修改,支持透明加密、实时扫描等功能[^2][^3]。 3. **动态加载机制**:允许按需加载第三方过滤驱动(如备份工具),降低系统资源占用[^1]。 #### 技术架构 - **分层过滤模型**:采用**设备栈**结构,每个过滤驱动按优先级处理 IRP,例如: $$ \text{用户层} \rightarrow \text{FltMgr} \rightarrow \text{NTFS.sys} \rightarrow \text{磁盘驱动} $$ 确保数据流经多个过滤层[^2]。 - **IRP 处理机制**:通过`IRP_MJ_READ`/`IRP_MJ_WRITE`拦截读写操作,实现文件内容过滤[^2]。 - **注册表依赖**:依赖`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\FltMgr`中的配置参数,定义加载顺序与依赖关系[^1]。 #### 常见问题与错误代码 - **驱动加载失败(STATUS_FLT_NOT_INITIALIZED, 0xC01C0003)**: FltMgr未正确初始化时触发,需检查系统文件完整性(`sfc /scannow`)或重新注册驱动[^3]。 - **权限冲突(STATUS_ACCESS_DENIED, 0xC0000022)**: 第三方驱动未签名或权限不足导致,需以管理员权限运行或启用测试签名模式[^3][^4]。 - **资源耗尽(STATUS_INSUFFICIENT_RESOURCES, 0xC000009A)**: 过滤驱动过多时可能耗尽内核内存,需优化驱动配置或升级硬件[^3]。 #### 调试与开发 开发者可通过`WinDbg`分析 FltMgr 的 IRP 处理流程: ```c // 示例:通过设备句柄与 FltMgr 交互 HANDLE hDevice = CreateFile(L"\\\\.\\FltMgr", GENERIC_READ | GENERIC_WRITE, ...); if (hDevice == INVALID_HANDLE_VALUE) { printf("错误代码: 0x%X\n", GetLastError()); // 输出错误如 0xC0000035(名称冲突)[^4] } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值