WIN64AST的作者之前发布了一些教程,里面有关于关闭内核句柄的介绍,但是他忘了一件事,所以那份代码并不能真正的关闭内核句柄,而且他的代码。。。不敢用在项目里。有人在看雪上问过类似问题,我也回答过,在vista之后,windows会检查内核句柄值得有效性,也就是为什么下面我提供的代码中会有这一行:
*(PULONG64)HandleValue |= (ULONG64)KERNEL_HANDLE_MASK,为什么,自己想。
因为大多数时候我们都是关闭的文件句柄,这份代码就是只提供了关闭文件句柄,你可以自己改改。
头文件unlockfile.h:
#include "ntifs.h"
#pragma pack(8) //让编译器对这个结构作8字节对齐
typedef struct _FILE_HANDLE_INFO
{
CHAR FilePath[264];
HANDLE hProcess;
HANDLE hHandle;
PVOID Object;
ULONG HandleCount;
}FILE_HANDLE_INFO, *PFILE_HANDLE_INFO;
typedef struct _FILE_HANDLE_INFO_LIST
{
ULONG64 Count;
FILE_HANDLE_INFO Info[1];
}FILE_HANDLE_INFO_LIST, *PFILE_HANDLE_INFO_LIST;
#pragma pack() //取消8字节对齐,恢复为默认字节对齐
PFILE_HANDLE_INFO_LIST EnumFileHandle();
BOOLEAN ForceCloseHandle(HANDLE hProcess, HANDLE HandleValue);
BOOLEAN ForceCloseHandleByPath(const char* Path);
源文件unlockfile.c:
#include "unlockfile.h"
typedef struct _HANDLE_INFO{
UCHAR ObjectTypeIndex;
UCHAR HandleAttributes;
USHORT HandleValue;
ULONG GrantedAccess;
ULONG64 Object;
UCHAR Name[256];
} HANDLE_INFO, *PHANDLE_INFO;
typedef struct _SYSTEM_HANDLE_TABLE_ENTRY_INFO{
USHORT UniqueProcessId;
USHORT CreatorBackTraceIndex;
UCHAR ObjectTypeIndex;
UCHAR HandleAttributes;
USHORT HandleValue;
PVOID Object;
ULONG GrantedAccess;
} SYSTEM_HANDLE_TABLE_ENTRY_INFO, *PSYSTEM_HANDLE_TABLE_ENTRY_INFO;
typedef struct _SYSTEM_HANDLE_INFORMATION {
ULONG64 NumberOfHandles;
SYSTEM_HANDLE_TABLE_ENTRY_INFO Handles[1];
} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
typedef struct _OBJECT_BASIC_INFORMATION {
ULONG Attributes;
ACCESS_MASK DesiredAccess;
ULONG HandleCount;
ULONG