总结一下进程句柄和“文件句柄”

进程句柄,顾名思义,一个进程所对应的句柄

如何获得一个电脑上所运行的所有进程ID和进程Name?

Demo:

#include <stdio.h>
#include <Windows.h>
#include <winternl.h>

#pragma comment(lib,"ntdll.lib") // Need to link with ntdll.lib import library. You can find the ntdll.lib from the Windows DDK.

typedef struct _SYSTEM_PROCESS_INFO
{
	ULONG                   NextEntryOffset;
	ULONG                   NumberOfThreads;
	LARGE_INTEGER           Reserved[3];
	LARGE_INTEGER           CreateTime;
	LARGE_INTEGER           UserTime;
	LARGE_INTEGER           KernelTime;
	UNICODE_STRING          ImageName;
	ULONG                   BasePriority;
	HANDLE                  ProcessId;
	HANDLE                  InheritedFromProcessId;
}SYSTEM_PROCESS_INFO, *PSYSTEM_PROCESS_INFO;

int main()
{
	NTSTATUS status;
	PVOID buffer;
	PSYSTEM_PROCESS_INFO spi;

	buffer = VirtualAlloc(NULL, 1024 * 1024, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE); // We need to allocate a large buffer because the process list can be large.

	if (!buffer)
	{
		printf("\nError: Unable to allocate memory for process list (%d)\n", GetLastError());
		return -1;
	}

	printf("\nProcess list allocated at address %#x\n", buffer);
	spi = (PSYSTEM_PROCESS_INFO)buffer;

	if (!NT_SUCCESS(status = NtQuerySystemInformation(SystemProcessInformation, spi, 1024 * 1024, NULL)))
	{
		printf("\nError: Unable to query process list (%#x)\n", status);

		VirtualFree(buffer, 0, MEM_RELEASE);
		return -1;
	}

	while (spi->NextEntryOffset) // Loop over the list until we reach the last entry.
	{
		printf("\nProcess name: %ws | Process ID: %d\n", spi->ImageName.Buffer, spi->ProcessId); // Display process information.
		spi = (PSYSTEM_PROCESS_INFO)((LPBYTE)spi + spi->NextEntryOffset); // Calculate the address of the next entry.
	}

//	HANDLE handle_1 = OpenProcess(PROCESS_ALL_ACCESS, TRUE, 14504);

	printf("\nPress any key to continue.\n");
	getchar();

	VirtualFree(buffer, 0, MEM_RELEASE); // Free the allocated buffer.
	return 0;
}

 

上面的代码运行会详细列出对应的process name和process ID

那么有了ProcessID就可以通过OpenProcess函数得到相应的进程句柄了。

好了,最重要的部分来了。

进程所对应的文件句柄是什么?

MSDN上有说明:(机翻)

当一个进程使用createfile函数打开一个文件时,一个文件句柄将与它关联,直到该进程终止或该句柄使用closehandle函数关闭为止。文件句柄用于在许多函数调用中标识文件。

 

每个文件句柄和文件对象对于打开文件的每个进程通常都是唯一的。唯一的例外是,当一个进程持有的文件句柄重复时,或者当一个子进程继承父进程的文件句柄时。在这些情况下,这些文件句柄是唯一的,但可以看到单个共享文件对象。有关复制由进程持有的文件句柄的详细信息,请参见Duplicatehandle。

 

请注意,虽然文件句柄通常是进程专用的,但文件句柄指向的文件数据不是。因此,共享同一文件的进程和线程必须同步其访问。对于文件上的大多数操作,进程通过其专用句柄池来标识文件。

那么这说的文件句柄到底是什么样的呢?

请参考:https://jingyan.baidu.com/article/e75aca85797962142edac6c4.html

由上图可以看到,Type为File的是文件类型,后面是Handle Name。

有了handle name就可以通过GetMappedFileNameA获得文件句柄了。

那么如何通过编程来获得进程PID对应的所有的文件句柄呢?

提供一个参考,使用NtQuerySystemInformation函数,第一个参数设为 SystemExtendedHandleInformation.

这个方法在案例很少,我也没用过,如何有人能熟练运用的话,麻烦在评论区给我个DEMO链接,提前感谢!

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值