#pragma once#include <stdio.h>#include <tchar.h>#include <windows.h>#include <atlbase.h>#include <shlwapi.h>#include <vector>#include <map>using namespace std;#include <string>typedef std::basic_string<TCHAR, std::char_traits<TCHAR>, std::allocator<TCHAR>> tstring;#include <winternl.h>#include <psapi.h>#pragma comment(lib, "psapi.lib")#define NT_SUCCESS(status) (status == (NTSTATUS)0x00000000L)#define STATUS_INFO_LENGTH_MISMATCH ((NTSTATUS)0xC0000004L)#define STATUS_BUFFER_OVERFLOW ((NTSTATUS)0x80000005L)#define SystemHandleInformation ((SYSTEM_INFORMATION_CLASS)16)// NTQUERYOBJECTtypedef struct _OBJECT_NAME_INFORMATION {UNICODE_STRING Name;WCHAR NameBuffer[1];} OBJECT_NAME_INFORMATION, *POBJECT_NAME_INFORMATION;typedef enum _OBJECT_INFORMATION_CLASS {ObjectBasicInformation,ObjectNameInformation,ObjectTypeInformation,ObjectAllInformation,ObjectDataInformation} OBJECT_INFORMATION_CLASS, *POBJECT_INFORMATION_CLASS;typedef NTSTATUS (WINAPI *NTQUERYOBJECT)(_In_opt_ HANDLE Handle,_In_ OBJECT_INFORMATION_CLASS ObjectInformationClass,_Out_opt_ PVOID ObjectInformation,_In_ ULONG ObjectInformationLength,_Out_opt_ PULONG ReturnLength);// NTQUERYSYSTEMINFORMATIONtypedef struct _SYSTEM_HANDLE {DWORD dwProcessId;BYTE bObjectType;BYTE bFlags;WORD wValue;PVOID pAddress;DWORD GrantedAccess;} SYSTEM_HANDLE, *PSYSTEM_HANDLE;typedef struct _SYSTEM_HANDLE_INFORMATION {DWORD dwCount;SYSTEM_HANDLE Handles[1];} SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;typedef NTSTATUS (WINAPI *NTQUERYSYSTEMINFORMATION)(IN SYSTEM_INFORMATION_CLASS SystemInformationClass,OUT PVOID SystemInformation,IN ULONG SystemInformationLength,OUT PULONG ReturnLength OPTIONAL);//// NtQueryInformationFile//#define FileNameInformation ((FILE_INFORMATION_CLASS)9)// typedef struct _FILE_NAME_INFORMATION {// ULONG FileNameLength;// WCHAR FileName[1];// } FILE_NAME_INFORMATION, *PFILE_NAME_INFORMATION;typedef NTSTATUS (WINAPI *NTQUERYINFORMATIONFILE)(IN HANDLE FileHandle,OUT PIO_STATUS_BLOCK IoStatusBlock,OUT PVOID FileInformation,IN ULONG Length,IN FILE_INFORMATION_CLASS FileInformationClass);// typedef struct _CLIENT_ID {// HANDLE UniqueProcess;// HANDLE UniqueThread;// } CLIENT_ID, *PCLIENT_ID;// ncScopedHandleclass ncScopedHandle{ncScopedHandle(const ncScopedHandle&);ncScopedHandle& operator=(const ncScopedHandle&);public:ncScopedHandle(HANDLE handle): _handle(handle){}~ncScopedHandle(){if (_handle != NULL) {CloseHandle(_handle);}}operator HANDLE() const{return _handle;}PHANDLE operator& (){return &_handle;}void operator=(HANDLE handle){if (_handle != NULL) {CloseHandle(_handle);}_handle = handle;}private:HANDLE _handle;};// ncFileHandlestruct ncFileHandle{SYSTEM_HANDLE _handle;tstring _filePath;tstring _path;ncFileHandle (SYSTEM_HANDLE handle, const tstring& filePath, const tstring& path): _handle (handle), _filePath (filePath), _path (path){}};// GetDeviceDriveMapvoid GetDeviceDriveMap(std::map<tstring, tstring>& mapDeviceDrive){TCHAR szDrives[512];if (!GetLogicalDriveStrings (_countof(szDrives) - 1, szDrives)) {return;}TCHAR* lpDrives = szDrives;TCHAR szDevice[MAX_PATH];TCHAR szDrive[3] = _T(" :");do {*szDrive = *lpDrives;if (QueryDosDevice (szDrive, szDevice, MAX_PATH)) {mapDeviceDrive[szDevice] = szDrive;}while (*lpDrives++);}while (*lpDrives);}// DevicePathToDrivePathBOOL DevicePathToDrivePath (tstring& path){static std::map<tstring, tstring> mapDeviceDrive;if (mapDeviceDrive.empty ()) {GetDeviceDriveMap (mapDeviceDrive);}for (std::map<tstring, tstring>::const_iterator it = mapDeviceDrive.begin (); it != mapDeviceDrive.end (); ++it) {size_t nLength = it->first.length ();if (_tcsnicmp (it->first.c_str (), path.c_str (), nLength) == 0) {path.replace (0, nLength, it->second);return TRUE;}}return FALSE;}// GetHandlePathBOOL GetHandlePath (HANDLE handle, tstring& path){static NTQUERYOBJECT fpNtQueryObject =(NTQUERYOBJECT)GetProcAddress (GetModuleHandle (_T("ntdll")), "NtQueryObject");if (fpNtQueryObject == NULL) {return FALSE;}DWORD dwLength = 0;OBJECT_NAME_INFORMATION info;NTSTATUS status = fpNtQueryObject (handle, ObjectNameInformation, &info, sizeof (info), &dwLength);if (status != STATUS_BUFFER_OVERFLOW) {return FALSE;}POBJECT_NAME_INFORMATION pInfo = (POBJECT_NAME_INFORMATION)malloc(dwLength);while (true) {status = fpNtQueryObject (handle, ObjectNameInformation, pInfo, dwLength, &dwLength);if (status != STATUS_BUFFER_OVERFLOW) {break;}pInfo = (POBJECT_NAME_INFORMATION)realloc(pInfo, dwLength);}BOOL bRes = FALSE;if (NT_SUCCESS(status)) {path = pInfo->Name.Buffer;bRes = DevicePathToDrivePath(path);}free(pInfo);return bRes;}// GetSystemHandleInfoPSYSTEM_HANDLE_INFORMATION GetSystemHandleInfo (){static NTQUERYSYSTEMINFORMATION fpNtQuerySystemInformation =(NTQUERYSYSTEMINFORMATION)GetProcAddress (GetModuleHandle (_T("ntdll")), "NtQuerySystemInformation");if (fpNtQuerySystemInformation == NULL) {return NULL;}DWORD dwLength = 0;SYSTEM_HANDLE_INFORMATION shi;NTSTATUS status = fpNtQuerySystemInformation (SystemHandleInformation, &shi, sizeof (shi), &dwLength);if (status != STATUS_INFO_LENGTH_MISMATCH) {return NULL;}PSYSTEM_HANDLE_INFORMATION pshi = (PSYSTEM_HANDLE_INFORMATION)malloc(dwLength);while (true) {status = fpNtQuerySystemInformation (SystemHandleInformation, pshi, dwLength, &dwLength);if (status != STATUS_INFO_LENGTH_MISMATCH) {break;}pshi = (PSYSTEM_HANDLE_INFORMATION)realloc(pshi, dwLength);}if (!NT_SUCCESS (status)) {free (pshi);pshi = NULL;}return pshi;}//// 检测指定句柄是否可能导致NtQueryObject卡死:// 1.注意必须使用NtQueryInformationFile而不是NtQueryObject进行检测,否则可能导致WinXP系统// 下进程死锁而无法结束。//void CheckBlockThreadFunc (void* param){static NTQUERYINFORMATIONFILE fpNtQueryInformationFile =(NTQUERYINFORMATIONFILE)GetProcAddress (GetModuleHandle (_T("ntdll")), "NtQueryInformationFile");if (fpNtQueryInformationFile != NULL) {BYTE buf[1024];IO_STATUS_BLOCK ioStatus;fpNtQueryInformationFile ((HANDLE)param, &ioStatus, buf, 1024, FileNameInformation);}}// IsBlockingHandleBOOL IsBlockingHandle (HANDLE handle){HANDLE hThread = (HANDLE)_beginthread(CheckBlockThreadFunc, 0, (void*)handle);if (WaitForSingleObject (hThread, 100) != WAIT_TIMEOUT) {return FALSE;}TerminateThread (hThread, 0);return TRUE;}// FindFileHandleBOOL FindFileHandle (LPCTSTR lpName, vector<ncFileHandle>& handles){handles.clear ();if (lpName == NULL) {return FALSE;}// 打开“NUL”文件以便后续获取文件句柄类型值。ncScopedHandle hTempFile = CreateFile (_T("NUL"), GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0);if (hTempFile == NULL) {return FALSE;}// 获取当前系统中所有的句柄信息。PSYSTEM_HANDLE_INFORMATION pshi = GetSystemHandleInfo ();if (pshi == NULL) {return FALSE;}// 查询当前系统的文件句柄类型值。BYTE nFileType = 0;DWORD dwCrtPid = GetCurrentProcessId ();for (DWORD i = 0; i < pshi->dwCount; ++i) {if (pshi->Handles[i].dwProcessId == dwCrtPid && hTempFile == (HANDLE)pshi->Handles[i].wValue) {nFileType = pshi->Handles[i].bObjectType;break;}}HANDLE hCrtProc = GetCurrentProcess ();for (DWORD i = 0; i < pshi->dwCount; ++i) {// 过滤掉非文件类型的句柄。if (pshi->Handles[i].bObjectType != nFileType) {continue;}// 将上述句柄复制到当前进程中。ncScopedHandle handle = NULL;ncScopedHandle hProc = OpenProcess (PROCESS_DUP_HANDLE, FALSE, pshi->Handles[i].dwProcessId);if (hProc == NULL || !DuplicateHandle (hProc, (HANDLE)pshi->Handles[i].wValue, hCrtProc, &handle, 0, FALSE, DUPLICATE_SAME_ACCESS)) {continue;}// 过滤掉会导致NtQueryObject卡死的句柄(如管道等)。if (IsBlockingHandle (handle)) {continue;}// 获取句柄对应的文件路径并进行匹配检查。tstring filePath;if (GetHandlePath (handle, filePath) && filePath.find (lpName) != tstring::npos) {ncScopedHandle hProcess = OpenProcess(MAXIMUM_ALLOWED, FALSE, pshi->Handles[i].dwProcessId);TCHAR szProcName[MAX_PATH];GetProcessImageFileName (hProcess, szProcName, MAX_PATH);tstring path (szProcName);DevicePathToDrivePath(path);ncFileHandle fh (pshi->Handles[i], filePath, path);handles.push_back (fh);}}free(pshi);return TRUE;}// BOOL CloseHandleEx (HANDLE handle, DWORD dwPid)// {// if (GetCurrentProcessId () == dwPid)// return CloseHandle (handle);//// ncScopedHandle hProcess = OpenProcess (PROCESS_DUP_HANDLE, FALSE, dwPid);// if (hProcess == NULL)// return FALSE;//// return DuplicateHandle (hProcess, handle, GetCurrentProcess (), NULL, 0, FALSE, DUPLICATE_CLOSE_SOURCE);// }// mainint _tmain(int argc, _TCHAR* argv[]){tstring path (_T("E:\\TDDOWNLOAD\\"));vector<ncFileHandle> vecHandles;if (!FindFileHandle(path.c_str(), vecHandles)) {return -1;}return 0;}
相关推荐
ThinkBook 16p 2024 BIOS降压定频实战:从解锁CFG Lock到AC Loadline调优
高性能笔记本在满载时频繁撞上温度墙,通常源于固件层默认电压冗余过大,而系统级降压工具又受限于CFG Lock锁定。要根治问题,需要从BIOS固件层面理解电压管理机制——AC/DC Loadline参数控制着CPU在不同负载下的电压请求,通过修改这些负载线值可以安全降低电压,解锁CFG Lock后还能让XTU、ThrottleStop等软件调参工具恢复可用。这种BIOS级调优在工程实践中广泛用于改善散热、稳定频率、压降风扇噪音,尤其适用于联想ThinkBook 16p 2024与拯救者Y9000P等采用HX平
NtQueryObject 获得内核对象的信息
一个内核对象有两个计数器:一个是句柄计数,句柄是给用户态用的;另一个是指针计数,也叫引用计数,因为核心态也常常用到内核对象,为了方便,在核心态的代码用指针直接访问对象,所以Object Manager维护了这个指针引用计数。只有在句柄计数和引用计数都为0时,对象才被释放。一般而言,指针引用计数值比句柄计数值大。 再进一步,实际上,在用户态其实是可以查询一个内核对象的句柄计数和引用计数
IFIX往Mysql数据库同步数据方法
通过IFix数据库向Mysql数据库同步数据
NtQueryObject 函数
若翻译出现错误,请指出,本人会即时改正。 这个函数未来可能会改变或者从windows中移除,但是不会通告你。(微软有多贱,我嘞个草了) 函数声明: NTSTATUS NtQueryObject( _In_opt_ HANDLE Handle, _In_ OBJECT_INFORMATION_CLASS objectInformationClass, _Out_opt_
Oracle数据库安装图文教程 附百度云oracle Database 11g 安装包
一,Oracle数据库安装包下载 1.从Oracle官网下载所需的数据库安装包【下载需要注册登录Oracle账户】 http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 2.此处有下载好的Oracle Database 11g Release 2 百度云网盘 提取码:z...
基于YOLOv8的野生菌菇检测、识别与分类系统
YOLOv8是YOLO系列模型的最新版本,继承了YOLO系列高效、精确的特点。YOLOv8采用了新的网络架构,并优化了推理速度和检测精度。与传统的目标检测算法(如Faster R-CNN)不同,YOLO模型通过一次前向传播同时完成目标定位与分类,因而具有非常高的计算效率。
Ring3 调用 NtQueryObject 获得文件句柄对应的对象名时调用线程死锁的原因
之前遗留的一个问题http://blog.youkuaiyun.com/qq_18218335/article/details/76400680 之前实现Ring3 查找文件占用的时候发现对部分句柄进行NtQueryObject 操作的时候会造成调用者线程挂起,从Ring3 解决问题的方法就是生成一个单独的工作线程,代替我们执行NtQueryObject 函数,如果工作线程挂起,则调用Kill
2026年1至9月武汉市房地产价格深度分析报告
本报告基于2026年1月至9月武汉市实际成交案例,从成交价格、区域分布、户型结构、价格走势等维度进行深度分析。数据来源包括武汉市住房保障和房屋管理局备案数据、主要中介机构成交记录及典型楼盘网签案例,覆盖全市15个行政区及主要功能板块。
通过对象名(ObjectName)匹配,确定所属的进程
大概流程: 首先通过ZwQuerySystemInformation(SystemHandleInformation,*,*)获取句柄信息,然后根据句柄调用ZwQueryObject(*,ObjectNameInformation,*)获取对象名信息,最后匹配确定目标。示例是确定“\\Windows\\ApiPort"所属的进程。 需要注意的是用有的句柄调用ZwQueryObject会返回ST...
基于STM32L4XX、HAL库的IP101GRI以太网收发器(PHY)驱动程序设计
define IP101GRI_PHY_ADDRESS 0x01 // 根据硬件设计设置PHY地址。#define IP101GRI_PHYSTS 0x10 // PHY状态寄存器。#define IP101GRI_PHYINIR 0x12 // PHY中断寄存器。#define IP101GRI_PHYCR 0x14 // PHY控制寄存器。#define IP101GRI_PHYID2 0x03 // PHY标识符2。
DeepSeek-R1 论文阅读 DeepSeek-R1: Incentivizing Reasoning Capability in LLMs via Reinforcement Learning
和。这些模型的核心创新点是通过强化学习(Reinforcement Learning, RL)来提升大型语言模型(LLM)的推理能力,而没有依赖传统的监督微调(Supervised Fine-Tuning, SFT)作为预训练的步骤。是一种通过大规模强化学习直接训练的模型。它在推理能力上表现出色,能够自然地展现出许多强大且有趣的推理行为。但它也有一些问题,比如可读性差和语言混合。这意味着模型在生成文本时,有时会显得不太清晰,或者不一致地使用不同语言。为了解决这些问题并进一步提升推理能力,研究者提出了。
查看文件是否被其他进程访问
项目中写了一个穿网闸文件传输程序,定期扫描指定文件夹,并将文件传输至网闸对侧。但在使用过程中发现部分文件经常被截断传输,实际上程序中对该问题已经做了处理,Linux系统使用lsof命令可以直接插到该文件当前有没有被写入,Windows系统使用尝试重命名文件方式来确定文件有没有被占用。但实际应用中在Windwos环境安装的openssh来提供sftp server,该程序在文件传输过程中,可以随意重...
VC中sqlite的使用
在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示
vc 查看文件被占用的进程
#pragma once #include #include #include #include #include #include #include using namespace std; #include typedef std::basic_string, std::allocator> tstring; #include #include #pragma c
C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片
基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正
计算机控制技术及应用
《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。
获取文件占用进程信息
转自http://blog.youkuaiyun.com/linuxsmallping/article/details/51732956 #pragma once #include #include #include #include #include #include #include using namespace std; #include typedef std::basic_stringTCHA
efm32 入门.pdf
本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。
使用NtQueryInformationFile函数获得不到完整路径
#include <windows.h> #include <iostream> using namespace std; typedef struct _OBJECT_NAME_INFORMATION { WORD Length; WORD MaximumLength; LPWSTR Buffer; } OBJECT_NAME...
NtQueryObject遍历进程(死锁)与管道冲突的解决方案
在一次注入使用命名管道进行进程间通讯的案例中需要使用NtQueryObject遍历进程互斥锁情况,期间发现一个问题,NtQueryObject查询到管道时候会死锁,网上也有很多资料介绍NtQueryObject死锁的情况,不过解决方案不是很明确这里记录下解决办法在时候NtQueryObject打开进程关联句柄时,先使用CreateFileMapping假定创建文件句柄,如果创建成功,返回,当然假如...
C++检测句柄的权限
主要是依靠NtQueryObject函数,其中需要传入ObjectBasicInformation参数 PUBLIC_OBJECT_BASIC_INFORMATION结构包含可用于对象的全部信息的子集。 typedef struct _PUBLIC_OBJECT_BASIC_INFORMATION { ULONG Attributes; ACCESS_MASK Grante...
通过遍历系统句柄信息(SystemHandleInformation),获取系统进程和当前进程的eprocess
实验环境:win10 1909 64 参考:https://blog.youkuaiyun.com/qinlicang/article/details/4489727 首先,获取系统的句柄信息;然后,在句柄信息表中进行搜索,通过数据结构进行匹配;最后,确定系统进程和当前进程的eprocess; 主要数据结构如下: typedef struct _SYSTEM_HANDLE_TABLE_ENTRY_INFO { USHORT UniqueProcessId; USHORT CreatorBack
WhoUseMe 驱动实现
前面写过一个应用层的查找谁占用了我们的文件的程序WhoUseMe http://blog.youkuaiyun.com/qq_18218335/article/details/62884657 从文中截图可以看出来,普通的应用层程序虽然可以达到枚举句柄的目的,但是对于一部分具有特殊权限的文件及端口句柄来说,调用NtQueryObject函数可能导致线程挂起,对此我们的解决办法是让一个单独的线程执行N
【转】SYSTEM_HANDLE_INFORMATION
typedef struct _SYSTEM_HANDLE_INFORMATION{ ULONG ProcessId; UCHAR ObjectTypeNumber; UCHAR Flags; USHORT Handle; ...
R3下,遍历所有进程的伪句柄表,关闭指定句柄
之所以产生这个想法,是在删除文件的时候有时会提示文件被占用了,然后让我们先关闭之后在来删除,但是我怎么知道哪个进程打开了我的文件? 于是就去网上了找了一份代码然后改了改,接着来说说是怎么实现功能的。首先我们需要遍历所有的进程,所有要找到遍历进程的代码。 //遍历进程 WCHAR * szServerName = NULL; HANDLE WtsServerHandle = WTSOp...
利用NtDuplicateObject进行Dump
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。(本文仅用于交流学习)这是国外老哥2020年提出的一种蛮有意思的思路。我们先来看看大致的思路是什么样子的,然后来看看一些需要学习的点。
采用关闭句柄的方式去掉程序多开的限制
下面的文字,主要是为了分享给和我一样的菜鸟,而且这些东西都是很多大牛的文章中的一个非常小的部分。您们直接飘过吧。 一些程序限制多开的方法很多,比如采用窗口名,进程名,内核对象等等,论坛中也有很多关于这方面的介绍,但是好像没有一个具体的例子,估计是觉得太简单了吧。我研究的这程序的限制多开的方法采用的是“内核对象信号量”。 要破解其多开也有很多方法: 1、直接
386



被折叠的 条评论
为什么被折叠?



