枚举系统的过滤驱动

/************************************************************************/
/*查找文件过滤系统
                                                                      */
/************************************************************************/
NTSTATUS FindDevice(UNICODE_STRING FileSys,UNICODE_STRING ObjectType,PFILTERSYS_INFO PFilterInfo,ULONG Count)
{
NTSTATUS Status;
UNICODE_STRING DriverName1,DriverName2;
PDRIVER_OBJECT DriverObject=NULL;
PDEVICE_OBJECT AttachObject=NULL;
WCHAR DriNa1[64]={L'/0'};
WCHAR DriNa2[64]={L'/0'};

PLDR_DATA_TABLE_ENTRY Ldr=NULL;
wcscpy(DriNa1,L"//Driver//");

wcscat(DriNa1,FileSys.Buffer);
RtlInitUnicodeString(&DriverName1,DriNa1);
/************************************************************************/
/*                                                                   */
/************************************************************************/
DbgPrint("%S/n",DriverName1.Buffer);
Status=ObReferenceObjectByName(&DriverName1,OBJ_CASE_INSENSITIVE,NULL,FILE_ALL_ACCESS,IoDriverObjectType,KernelMode,NULL,(PVOID *)&DriverObject);
if (NT_SUCCESS(Status))
{
 if (DriverObject==NULL)
 {
  return STATUS_UNSUCCESSFUL;
 }
 __try
 {


 AttachObject=DriverObject->DeviceObject->AttachedDevice;
 
  if (AttachObject==NULL)
  {
   return STATUS_UNSUCCESSFUL;
  }
  DbgPrint("要查找的设备是:%S,类型:%S,%.8X/n",FileSys.Buffer,ObjectType.Buffer,AttachObject);

 
  DbgPrint("ATTACHNAME :%S/n",AttachObject->DriverObject->DriverName.Buffer);
  
  for (ULONG i=0;i<Count;i++)
  {
   if (PFilterInfo[i].AttachDevice==0)
   {
    
    PFilterInfo[i].ObjectType=AttachObject->DeviceType;
    PFilterInfo[i].AttachDevice=(ULONG)AttachObject;
    
    RtlCopyMemory(PFilterInfo[i].SysName,AttachObject->DriverObject->DriverName.Buffer,AttachObject->DriverObject->DriverName.Length);
    RtlCopyMemory(PFilterInfo[i].HostSysName,DriverObject->DriverName.Buffer,DriverObject->DriverName.Length);
    Ldr=(PLDR_DATA_TABLE_ENTRY)(AttachObject->DriverObject->DriverSection);
    if (Ldr!=NULL && Ldr->FullDllName.Buffer!=NULL)
    {
     RtlCopyMemory(PFilterInfo[i].SysPath,Ldr->FullDllName.Buffer,Ldr->FullDllName.Length);
    }
    else
    {
     RtlCopyMemory(PFilterInfo[i].SysPath,AttachObject->DriverObject->DriverName.Buffer,AttachObject->DriverObject->DriverName.Length);
    }
    if (i==Count-1)
    {
     return STATUS_BUFFER_TOO_SMALL;
    }
    return STATUS_SUCCESS;
    
   }
   if (i==Count-1)
   {
    return STATUS_BUFFER_TOO_SMALL;
   }
  }
  
  
  
 } 
 __except(EXCEPTION_EXECUTE_HANDLER)
 {
  
 }
 return STATUS_SUCCESS;
 

 
}
else
{
 wcscpy(DriNa2,L"//FileSystem//");
 
 wcscat(DriNa2,FileSys.Buffer);
 RtlInitUnicodeString(&DriverName2,DriNa2);

 DbgPrint("%S/n",DriverName2.Buffer);
 Status=ObReferenceObjectByName(&DriverName2,OBJ_CASE_INSENSITIVE,NULL,FILE_ALL_ACCESS,IoDriverObjectType,KernelMode,NULL,(PVOID *)&DriverObject);
 if (NT_SUCCESS(Status))
 {
  if (DriverObject==NULL)
  {
   return STATUS_UNSUCCESSFUL;
  }
  __try
  {
  AttachObject=DriverObject->DeviceObject->AttachedDevice;
   if (AttachObject==NULL)
   {
    return STATUS_UNSUCCESSFUL;
   }
   DbgPrint("要查找的设备是:%S,类型:%S,%.8X/n",FileSys.Buffer,ObjectType.Buffer,AttachObject);
   DbgPrint("ATTACHNAME :%S/n",AttachObject->DriverObject->DriverName.Buffer);
   for (ULONG i=0;i<Count;i++)
   {
    if (PFilterInfo[i].AttachDevice==0)
    {
     
     PFilterInfo[i].ObjectType=AttachObject->DeviceType;
     PFilterInfo[i].AttachDevice=(ULONG)AttachObject;
     
     RtlCopyMemory(PFilterInfo[i].SysName,AttachObject->DriverObject->DriverName.Buffer,AttachObject->DriverObject->DriverName.Length);
     RtlCopyMemory(PFilterInfo[i].HostSysName,DriverObject->DriverName.Buffer,DriverObject->DriverName.Length);
     Ldr=(PLDR_DATA_TABLE_ENTRY)(AttachObject->DriverObject->DriverSection);
     if (Ldr!=NULL && Ldr->FullDllName.Buffer!=NULL)
     {
      RtlCopyMemory(PFilterInfo[i].SysPath,Ldr->FullDllName.Buffer,Ldr->FullDllName.Length);
     }
     else
     {
      RtlCopyMemory(PFilterInfo[i].SysPath,AttachObject->DriverObject->DriverName.Buffer,AttachObject->DriverObject->DriverName.Length);
     }
     if (i==Count-1)
     {
      return STATUS_BUFFER_TOO_SMALL;
     }
     return STATUS_SUCCESS;
     
    }
    if (i==Count-1)
    {
     return STATUS_BUFFER_TOO_SMALL;
    }
   }
   
  }
  __except(EXCEPTION_EXECUTE_HANDLER)
  {
       
  }
   
   
  return STATUS_SUCCESS;
  
   
 }
 else
 {
  return Status;
 }
 
}


return STATUS_UNSUCCESSFUL;

}

#pragma PAGEDCODE
NTSTATUS OpenFileSysDir(UNICODE_STRING DriPath,PFILTERSYS_INFO PFilterInfo,ULONG Count)
{
 
 OBJECT_ATTRIBUTES oa;
 NTSTATUS Status;
 HANDLE hDriver;
 ULONG Length=0x8000;
 ULONG                context,dwRet,count=0;
 PDIRECTORY_BASIC_INFORMATION pBuffer=NULL,pB2;
 //先打开FileSystem目录
 //RtlInitUnicodeString(&DriPath,L"//FileSystem");
 InitializeObjectAttributes(&oa,&DriPath,OBJ_CASE_INSENSITIVE,NULL,NULL);
 Status=ZwOpenDirectoryObject(&hDriver,DIRECTORY_QUERY,&oa);
 if (NT_SUCCESS(Status))
 {
next:
 pBuffer=(PDIRECTORY_BASIC_INFORMATION)ExAllocatePoolWithTag(PagedPool,Length,'so');
 
 if (pBuffer!=NULL)
 {
  Status=ZwQueryDirectoryObject(hDriver,pBuffer,Length,FALSE,TRUE,&context,&dwRet);
  if (NT_SUCCESS(Status))
  { 
   pB2=pBuffer;
   while (pB2->ObjectName.Length!=0&& pB2->ObjectTypeName.Length!=0)
   {
    DbgPrint("ObjectName: %S ObjectTypeName: %S ",pB2->ObjectName.Buffer,pB2->ObjectTypeName.Buffer);
   
    Status=FindDevice(pB2->ObjectName,pB2->ObjectTypeName,PFilterInfo, Count);
    if (Status==STATUS_BUFFER_TOO_SMALL)
    {
     return STATUS_BUFFER_TOO_SMALL;
    }
    pB2++;
    count++;
   }
   if (pBuffer)
   {
    ExFreePoolWithTag(pBuffer,'so');
   }
   if (hDriver)
   {
    ZwClose(hDriver);
   }
   // DbgPrint("count is %d/n",count);
   return STATUS_SUCCESS;
  }
  else if (Status==STATUS_BUFFER_TOO_SMALL||Status==STATUS_MORE_ENTRIES)
  {
   ExFreePoolWithTag(pBuffer,'so');
   Length*=2;
   goto next;
  }
  else{
   
   // DbgPrint("ZwQueryDirectoryObject failed/n");
   ExFreePoolWithTag(pBuffer,'so');
   if (hDriver)
   {
    ZwClose(hDriver);
   }
   return STATUS_UNSUCCESSFUL;
  }
 }
 else
 {
  if (hDriver)
  {
   ZwClose(hDriver);
  }
  return STATUS_UNSUCCESSFUL;
 }
 }
 else
 {
  DbgPrint("ZwOpenDirectoryObject failed,status %.8X/n",Status);
  return STATUS_UNSUCCESSFUL;
 }
 
 
}

 

 

下面是调用上面的

RtlInitUnicodeString(&DirPath1,L"//FileSystem");
    status=OpenFileSysDir(DirPath1,POUTfilterInfo,cout/sizeof(FILTERSYS_INFO));
    if (STATUS_BUFFER_TOO_SMALL==status)
    {
     DbgPrint("分配的内存太小/n");
     goto END;
    }
    RtlInitUnicodeString(&DirPath2,L"//Driver");
    status=OpenFileSysDir(DirPath2,POUTfilterInfo,cout/sizeof(FILTERSYS_INFO));
    if (STATUS_BUFFER_TOO_SMALL==status)
    {
     DbgPrint("分配的内存太小/n");
     goto END;
    }

 

POUTfilterInfo是分配的内存,用来存放枚举到的过滤驱动的一些信息

//检测到的过滤驱动的信息
typedef struct _FILTERSYS_INFO{
 ULONG ObjectType;
 WCHAR SysName[64];
 WCHAR SysPath[260];
 ULONG AttachDevice;
 WCHAR HostSysName[64];
 
}FILTERSYS_INFO,*PFILTERSYS_INFO;

 

 

代码写的比较乱,还有改进的地方,例如FindDevice这里面

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值