枚举符号链接:

#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <tchar.h>// 定义函数返回值
//typedef ULONG NTSTATUS;// 宽字节字符串结构定义
typedef struct _UNICODE_STRING {USHORT  Length;USHORT  MaximumLength;PWSTR  Buffer;
} UNICODE_STRING, *PUNICODE_STRING;// 对象属性定义
typedef struct _OBJECT_ATTRIBUTES {ULONG Length;HANDLE RootDirectory;UNICODE_STRING *ObjectName;ULONG Attributes;PSECURITY_DESCRIPTOR SecurityDescriptor;PSECURITY_QUALITY_OF_SERVICE SecurityQualityOfService;
} OBJECT_ATTRIBUTES,*POBJECT_ATTRIBUTES;// 基本信息定义
typedef struct _DIRECTORY_BASIC_INFORMATION {UNICODE_STRING ObjectName;UNICODE_STRING ObjectTypeName;
} DIRECTORY_BASIC_INFORMATION, *PDIRECTORY_BASIC_INFORMATION;// 返回值或状态类型定义
#define OBJ_CASE_INSENSITIVE      0x00000040L
#define DIRECTORY_QUERY           (0x0001)
#define STATUS_SUCCESS            ((NTSTATUS)0x00000000L) // ntsubauth
#define STATUS_MORE_ENTRIES       ((NTSTATUS)0x00000105L)
#define STATUS_NO_MORE_ENTRIES    ((NTSTATUS)0x8000001AL)
#define STATUS_BUFFER_TOO_SMALL   ((NTSTATUS)0xC0000023L)
#define SYMBOLIC_LINK_QUERY       (0x0001)
#define SYMBOLIC_LINK_ALL_ACCESS  (STANDARD_RIGHTS_REQUIRED | 0x1)// 初始化对象属性宏定义
#define InitializeObjectAttributes( p, n, a, r, s ) { \(p)->Length = sizeof( OBJECT_ATTRIBUTES );          \(p)->RootDirectory = r;                             \(p)->Attributes = a;                                \(p)->ObjectName = n;                                \(p)->SecurityDescriptor = s;                        \(p)->SecurityQualityOfService = NULL;               \
}// 字符串初始化
typedef VOID (CALLBACK* RTLINITUNICODESTRING)(PUNICODE_STRING,PCWSTR);
RTLINITUNICODESTRING RtlInitUnicodeString;// 字符串比较
typedef
BOOLEAN
(WINAPI *RTLEQUALUNICODESTRING)(const UNICODE_STRING *String1,const UNICODE_STRING *String2,BOOLEAN CaseInSensitive);
RTLEQUALUNICODESTRING RtlEqualUnicodeString;// 打开对象
typedef NTSTATUS (WINAPI *ZWOPENDIRECTORYOBJECT)(OUT PHANDLE DirectoryHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes);
ZWOPENDIRECTORYOBJECT ZwOpenDirectoryObject;// 查询对象
typedef
NTSTATUS
(WINAPI *ZWQUERYDIRECTORYOBJECT)(IN HANDLE DirectoryHandle,OUT PVOID Buffer,IN ULONG BufferLength,IN BOOLEAN ReturnSingleEntry,IN BOOLEAN RestartScan,IN OUT PULONG Context,OUT PULONG ReturnLength OPTIONAL);
ZWQUERYDIRECTORYOBJECT ZwQueryDirectoryObject;// 打开符号链接对象
typedef
NTSTATUS
(WINAPI *ZWOPENSYMBOLICKLINKOBJECT)(OUT PHANDLE SymbolicLinkHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes);
ZWOPENSYMBOLICKLINKOBJECT ZwOpenSymbolicLinkObject;// 查询符号链接对象
typedef
NTSTATUS
(WINAPI *ZWQUERYSYMBOLICKLINKOBJECT)(IN HANDLE SymbolicLinkHandle,IN OUT PUNICODE_STRING TargetName,OUT PULONG ReturnLength OPTIONAL);
ZWQUERYSYMBOLICKLINKOBJECT ZwQuerySymbolicLinkObject;// 关闭已经打开的对象
typedef
NTSTATUS
(WINAPI *ZWCLOSE)(IN HANDLE Handle);
ZWCLOSE ZwClose;//
int main()
{HMODULE hNtdll = NULL;hNtdll = LoadLibrary(_T("ntdll.dll" ));if ( NULL == hNtdll ){printf("[%s]--Load ntdll.dll failed(%ld).\r\n", __FUNCTION__, GetLastError());goto EXIT;}printf("[%s]--Load ntdll.dll sucess now get proc.\r\n", __FUNCTION__);RtlInitUnicodeString      = (RTLINITUNICODESTRING)GetProcAddress(hNtdll, "RtlInitUnicodeString");RtlEqualUnicodeString     = (RTLEQUALUNICODESTRING)GetProcAddress(hNtdll, "RtlEqualUnicodeString");ZwOpenDirectoryObject     = (ZWOPENDIRECTORYOBJECT)GetProcAddress(hNtdll, "ZwOpenDirectoryObject");ZwQueryDirectoryObject    = (ZWQUERYDIRECTORYOBJECT)GetProcAddress(hNtdll, "ZwQueryDirectoryObject");ZwOpenSymbolicLinkObject  = (ZWOPENSYMBOLICKLINKOBJECT)GetProcAddress(hNtdll, "ZwOpenSymbolicLinkObject");ZwQuerySymbolicLinkObject = (ZWQUERYSYMBOLICKLINKOBJECT)GetProcAddress(hNtdll, "ZwQuerySymbolicLinkObject");ZwClose                   = (ZWCLOSE)GetProcAddress(hNtdll, "ZwClose");UNICODE_STRING     strDirName;OBJECT_ATTRIBUTES  oba;NTSTATUS           ntStatus; HANDLE             hDirectory;RtlInitUnicodeString(&strDirName, _T("\\BaseNamedObjects"));//global??,BaseNamedObjectsInitializeObjectAttributes(&oba, &strDirName, OBJ_CASE_INSENSITIVE, NULL, NULL);printf("[%s]--Open directory object now.\r\n", __FUNCTION__);ntStatus = ZwOpenDirectoryObject(&hDirectory, DIRECTORY_QUERY, &oba);if ( ntStatus != STATUS_SUCCESS ){printf("[%s]--Open directory object failed(%ld).\r\n", __FUNCTION__, GetLastError());goto EXIT;}printf("[%s]--Open directory object success.\r\n", __FUNCTION__);UNICODE_STRING symbolicLink;UNICODE_STRING targetName;BYTE           buffer[2048] = {0};ULONG          ulLength  = 2048;  ULONG          ulContext = 0;ULONG          ulRet     = 0; RtlInitUnicodeString(&symbolicLink, L"SymbolicLink");targetName.Length = 0;targetName.Buffer = (PWSTR)calloc(2, 1024);if ( targetName.Buffer == NULL ){printf("[%s]--calloc failed(%ld).\r\n", __FUNCTION__, GetLastError());goto EXIT;}targetName.MaximumLength = 1024;do{ntStatus = ZwQueryDirectoryObject(hDirectory, buffer, ulLength, TRUE, FALSE, &ulContext, &ulRet);if ( (ntStatus != STATUS_SUCCESS) && (ntStatus != STATUS_NO_MORE_ENTRIES) ){printf("[%s]--ZwQueryDirectoryObject failed(%ld).\r\n", __FUNCTION__, GetLastError());goto EXIT;}else if ( STATUS_NO_MORE_ENTRIES == ntStatus ){printf("[%s]--No more object.\r\n", __FUNCTION__);goto EXIT;}PDIRECTORY_BASIC_INFORMATION  directoryInfo = (PDIRECTORY_BASIC_INFORMATION)buffer;printf("ObjectName: [%S]---ObjectTypeName: [%S]\n", directoryInfo->ObjectName.Buffer, directoryInfo->ObjectTypeName.Buffer);if ( RtlEqualUnicodeString(&directoryInfo->ObjectTypeName, &symbolicLink, TRUE) ){OBJECT_ATTRIBUTES symbolicLinkAttributes;HANDLE            hSymbolicLink;// 初始化符号链接对象属性InitializeObjectAttributes(&symbolicLinkAttributes,&directoryInfo->ObjectName, OBJ_CASE_INSENSITIVE, hDirectory, NULL);// 打开符号链接对象ntStatus = ZwOpenSymbolicLinkObject(&hSymbolicLink, SYMBOLIC_LINK_QUERY, &symbolicLinkAttributes);if ( ntStatus != STATUS_SUCCESS ){printf("[%s]--ZwOpenSymbolicLinkObject failed(%ld).\r\n", __FUNCTION__, GetLastError());goto EXIT;}// 查询符号链接对象ntStatus = ZwQuerySymbolicLinkObject(hSymbolicLink, &targetName, NULL); if ( ntStatus != STATUS_SUCCESS ){printf("[%s]--ZwQuerySymbolicLinkObject failed(%ld).\r\n", __FUNCTION__, GetLastError());ZwClose(hSymbolicLink);goto EXIT;}// TODO: 添加针对符号链接的处理代码// 清空targetNamememset((LPVOID)targetName.Buffer, 0, targetName.Length*sizeof(WCHAR));// 关闭符号链接句柄ZwClose(hSymbolicLink);}}while(TRUE);
EXIT:if ( hDirectory != NULL ){ZwClose(hDirectory);}getchar();return 0;
}

比如说,需要枚举程序A有几个实例在运行,可以根据其 GUID 实现查找:

PDIRECTORY_BASIC_INFORMATION  directoryInfo = (PDIRECTORY_BASIC_INFORMATION)buffer;std::wstring objectName = directoryInfo->ObjectName.Buffer;if ( objectName.find( L"{FED3DBE6-1256-46fc-8DAE-C13360CB46C8}" ) != std::wstring::npos ){++g_nAppClientCount;//}

通过枚举驱动符号链接 判断程序***有几个实例在运行相关推荐

  1. 判断程序是否运行在虚拟机中的代码

    首先我们要了解一下什么是虚拟机, 对虚拟机的通用解释是通过软件模拟的具有完整硬件系统功能的, 运行在一个完全隔离环境中的完整计算机系统. 通过虚拟机软件, 你可以在一台物理计算机上模拟出一台或多台虚拟 ...

  2. c++ 或者 vc++中判断程序实例是否运行

    在Main 函数中Create*函数,以便创建一个命名对象(创建的是什么对象无所谓).当Create * 函数返回时,调用GetLastError函数. 如果GetLastError函数返回ERROR ...

  3. iOS中判断程序是不是第一次运行(新手引导界面用)

    2019独角兽企业重金招聘Python工程师标准>>> 在软件下载安装完成后,第一次启动往往需要显示一个新手操作引导,来告诉用户怎么操作这个app,这就需要在程序一开始运行就判断程序 ...

  4. 在ThinkPad W500 A98上升级Windows 7以及安装硬件驱动和相关程序(2/2)

    在ThinkPad W500 A98上升级Windows 7以及安装硬件驱动和相关程序(2/2) 升级硬件固件 在安装了升级硬件固件所必要的驱动程序后,就可以升级硬件固件了,在下载的硬件驱动和相关程序 ...

  5. NanoPi NEO Air使用八:编写个简单的驱动和应用程序

    NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...

  6. 关于如何判断程序和类库是Debug 还是 Release 的问题

    在发布程序时不小心把一部分Debug的dll文件和一部分Release的dll文件混合发布了,最后导致整个生产环境瘫痪(内存和cpu使用量很高,同时网站访问无响应).到现在我还搞不懂为什么会这样,也许 ...

  7. 在驱动和应用程序间共享内存

    在驱动和应用程序间共享内存 在不同的场合,很多驱动编写人员需要在驱动和用户程序间共享内存.两种最容易的技术是: l 应用程序发送IOCTL给驱动程序,提供一个指向内存的指针,之后驱动程序和应用程序就可 ...

  8. Android之通过ActivityLifecycleCallbacks判断程序是否运行在后台

    1.问题 判断程序是否运行在后台运行 2.解决办法 我们可以使用ActivityLifecycleCallbacks,对于ActivityLifecycleCallbacks,看我的这篇博客介绍() ...

  9. 判断程序是否已经运行

    近段时间,需要写一个小功能,就是需要判断程序是否已经运行. 某个程序安装后,也许被多个用户运行.那怎样判断当前用户已经运行了此程序了呢? 下面是Insus.NET的做法,就是: <VB.NET ...

最新文章

  1. R语言与数据分析(1) 数据分析流程、数据挖掘、数据可视化
  2. linux 符号链接攻击防御简介
  3. Java并发程序设计(四)JDK并发包之同步控制
  4. NetBeans IDE 7.0 Beta 发布
  5. 最全的 eclipse web 项目目录结构
  6. Linux 下的网络配置
  7. 每天一道LeetCode-----计算一个直方图空隙的容量(如果装水能装多少)
  8. jooq 配置oracle_jOOQ配置
  9. Spring Boot框架敏感信息泄露的完整介绍与SRC实战(附专属字典与PoC)
  10. Linux统治超级计算领域的九个理由
  11. java 的构造函数修饰符public private protected
  12. 在propreties文件中引用另一个properties文件中的内容
  13. Spring Boot2.x 的Druid连接池配置[附带监控]
  14. html 显示编辑xml文件,如何将 XML 文件显示为 HTML 表格展示
  15. xtreme toolkit pro——CXTPReportControl控件教程
  16. 非IE内核浏览器支持Active X控件
  17. O'Stolz定理的应用
  18. (十二:2020.08.28)CVPR 2016 追踪之论文纲要(译)
  19. 德国AgBB VoC有害物质测试
  20. c语言swap是什么,swap(什么是swap)

热门文章

  1. 使用matlab绘制条形图、面积图、饼图、柱状图
  2. inventor如何钣金出弧面_Inventor钣金设计教程
  3. 【JavaSE】----- Java语言的介绍
  4. [实变函数]3.3 可测集类
  5. scrapy_splash动态ip代理和请求头的动态修改
  6. 哈工大计算机系统lab7——微壳
  7. 据为己有!这位985博导把审稿的文章拒了,自己投!
  8. 【C语言】杨辉三角(数组)
  9. 第八节 多元函数的极值及其求法
  10. android动态改变布局,Android 动态添加布局的两种方式