列举某进程打开的文件列表

  unsigned long needed;
    DWORD size;
    SYSTEM_HANDLE shandle;
    HMODULE module = LoadLibraryW(L"Ntdll.dll");
    NtQuerySystemInformation = (QuerySystemInformation)GetProcAddress(module, "NtQuerySystemInformation");
    NtQueryObject = (QueryObject)GetProcAddress(module, "NtQueryObject");
 
    BYTE *buf = new BYTE[1024*1024*10];
    size=1024*1024*10;
	
    NTSTATUS ret = NtQuerySystemInformation(16,buf,size,&needed);
    
    HANDLE process=OpenProcess(PROCESS_ALL_ACCESS,FALSE,PID);
    HANDLE temp;
   
    for (DWORD i=4;i<needed;i+=sizeof(SYSTEM_HANDLE))
    {
        CopyMemory(&shandle,buf+i,sizeof(SYSTEM_HANDLE));
        if (shandle.dwProcessId==PID)
        {
            if (DuplicateHandle(process, (HANDLE)shandle.wValue, GetCurrentProcess(), &temp, 0, FALSE, DUPLICATE_SAME_ACCESS))
            {
				char Name[1024];
				ZeroMemory(Name, sizeof(Name));

				OBJECT_NAME_INFORMATION name,*pname;
				ULONG len;

				NtQueryObject(temp,1,&name,sizeof name,&len);
				pname=reinterpret_cast<POBJECT_NAME_INFORMATION>(new char[len]);
				NtQueryObject(temp,1,pname,len,&len);
				CComBSTR str = pname->Name.Buffer;


....................................

#include <atlbase.h>
#include <comutil.h>
#include <Ntsecapi.h>
#pragma comment(lib,"comsupp.lib")

#define PID 25780

typedef struct _PUBLIC_OBJECT_BASIC_INFORMATION {
    ULONG Attributes;
    ACCESS_MASK GrantedAccess;
    ULONG HandleCount;
    ULONG PointerCount;
    ULONG Reserved[10];    // reserved for internal use
} PUBLIC_OBJECT_BASIC_INFORMATION, *PPUBLIC_OBJECT_BASIC_INFORMATION;

typedef struct __PUBLIC_OBJECT_TYPE_INFORMATION {
    UNICODE_STRING TypeName;
    ULONG Reserved [22];    // reserved for internal use
} PUBLIC_OBJECT_TYPE_INFORMATION, *PPUBLIC_OBJECT_TYPE_INFORMATION;

typedef struct _OBJECT_NAME_INFORMATION
{
    UNICODE_STRING Name;
} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;


typedef struct _SYSTEM_HANDLE
{
    DWORD    dwProcessId;
    BYTE     bObjectType;
    BYTE     bFlags;
    WORD     wValue;
    PVOID    pAddress;
    DWORD    GrantedAccess;
}
SYSTEM_HANDLE;


typedef NTSTATUS (__stdcall *QuerySystemInformation)(int,void*,unsigned long,unsigned long*);
typedef NTSTATUS (__stdcall *QueryObject)(HANDLE,int,void*,unsigned long,unsigned long*);


QueryObject NtQueryObject;
QuerySystemInformation NtQuerySystemInformation;


  因项目需要,需要列举进程打开的文件列表。网上找了一大圈,实在是没有现成的代码,终于搜罗了一段可以用的代码。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值