使用Native API查询Windows硬盘分区系统设备名称

开发知识点-C++入门到入土知识手册 指针经典笔试题练习题讲解typedef笔试题多个源文件-理论多个源文件-实践PBC++简述C++标准C++的应用场景第一个C++程序const修饰普通变量const修饰成员变量const修饰成员函数const修饰对象const修饰引用onst修饰函数返回值为普通变量和对象const修饰函数返回值为const的指针const修饰函数返回值为const的引用extern c的使用_cplusplus的使用string对象的构造方法string对象的赋值。 阅读详情


#include <windows.h>
#include <tchar.h>
#include <stdlib.h>
#include <stdio.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;

#define InitObjectAttributes( 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;               \
}

#define NT_SUCCESS(Status) ((NTSTATUS)(Status) >= 0)
#define STATUS_INSUFFICIENT_RESOURCES    ((NTSTATUS)0xC000009AL)     // ntsubauth


HMODULE hNtdll = NULL;

BOOL LoadNtdllModule(void)
{
	hNtdll = LoadLibrary(_T("ntdll.dll" ));
	if ( NULL == hNtdll ) {
		_tprintf(_T("[%s]--Load ntdll.dll failed(%ld).\r\n"), __FUNCTION__, GetLastError());
		return FALSE;
	}
	return TRUE;
}

void FreeNtdllModule(void)
{
	if (hNtdll) {
		FreeLibrary(hNtdll);
	}
}

BOOL InitNtdllAPI(void)
{
	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");

	if (!RtlInitUnicodeString
		|| !RtlEqualUnicodeString
		|| !ZwOpenDirectoryObject
		|| !ZwQueryDirectoryObject
		|| !ZwOpenSymbolicLinkObject
		|| !ZwQuerySymbolicLinkObject
		|| !ZwClose){
		return FALSE;
	}
	return TRUE;
}

NTSTATUS QuerySymbolicLink(
	IN PUNICODE_STRING SymbolicLinkName,
	OUT PUNICODE_STRING LinkTarget
	)
{
	OBJECT_ATTRIBUTES oa;
	NTSTATUS status;
	HANDLE handle;

	InitObjectAttributes(&oa, SymbolicLinkName,
		OBJ_CASE_INSENSITIVE,
		0, 0);

	status = ZwOpenSymbolicLinkObject(&handle, GENERIC_READ, &oa);
	if (!NT_SUCCESS(status)) {
		return status;
	}

	LinkTarget->MaximumLength = MAX_PATH * sizeof(WCHAR);
	LinkTarget->Length = 0;
	LinkTarget->Buffer = (PWSTR)GlobalAlloc(GPTR, LinkTarget->MaximumLength);
	if (!LinkTarget->Buffer) {
		ZwClose(handle);
		return STATUS_INSUFFICIENT_RESOURCES;
	}

	RtlZeroMemory(LinkTarget->Buffer, LinkTarget->MaximumLength);

	status = ZwQuerySymbolicLinkObject(handle, LinkTarget, NULL);
	ZwClose(handle);

	if (!NT_SUCCESS(status)) {
		GlobalFree(LinkTarget->Buffer);
	}

	return status;
}

BOOL QueryHardiskVolume(UINT nDiskNo, UINT nPartNo, LPTSTR lpszTargetPath, DWORD dwLength)
{
	NTSTATUS status;
	UNICODE_STRING szSymbolicLink;
	UNICODE_STRING szDeviceName;
	WCHAR *lpszSymbolicLink;
	CHAR *_lpszTargetPath;
	BOOL bRet = FALSE;
	lpszSymbolicLink = (PWSTR)GlobalAlloc(GPTR, MAX_PATH * sizeof(WCHAR));
	if (!lpszSymbolicLink){
		return FALSE;
	}
	wsprintfW(lpszSymbolicLink, L"\\Device\\Harddisk%u\\Partition%u", nDiskNo, nPartNo);

	//RtlInitUnicodeString(&szSymbolicLink, L"\\??\\C:");
	//RtlInitUnicodeString(&szSymbolicLink, L"\\??\\Harddisk0Partition1");
	//RtlInitUnicodeString(&szSymbolicLink, L"\\Device\\Harddisk0\\Partition1");
	RtlInitUnicodeString(&szSymbolicLink, lpszSymbolicLink);

	status = QuerySymbolicLink(&szSymbolicLink, &szDeviceName);
	if (STATUS_SUCCESS == status){
		_tprintf(_T("[%S] => [%S]\n"), szSymbolicLink.Buffer, szDeviceName.Buffer);
		if (szDeviceName.Length <= dwLength) {
#ifndef _UNICODE
			_lpszTargetPath = WideCharToAnsi(szDeviceName.Buffer);			
			if (_lpszTargetPath){
				//CopyMemory(lpszTargetPath, _lpszTargetPath, lstrlenA(_lpszTargetPath));
				lstrcpyA(lpszTargetPath, _lpszTargetPath);
				bRet = TRUE;
				delete [] _lpszTargetPath;
			}
#else
			CopyMemory(lpszTargetPath, szDeviceName.Buffer, szDeviceName.Length)
#endif
		}
		GlobalFree(szDeviceName.Buffer);
	}
	GlobalFree(lpszSymbolicLink);
	return bRet;
}


测试: 获取系统第一块物理硬盘第一分区设备名称

    TCHAR szDeviceName[MAX_PATH];
    if (LoadNtdllModule()) {
        if(InitNtdllAPI()){
            QueryHardiskVolume(0, 1, szDeviceName, MAX_PATH);             
        }
        FreeNtdllModule();
    }



【Window内核驱动开发】——通过符号链接获取真实设备 【我的】Window驱动开发——通过符号链接获取真实设备 作者:zcr214 时间:2016/5/5   我们想要把驱动绑定到指定的盘符,实际是绑定到它对应的真实设备卷,实际上windows用户看到的C盘D盘只是符号链接名,而真实设备通常是/Device/HarddiskVolume2,/Device/HarddiskVolume3等,符号链接名可以任意更改,但是真实设备卷却是不变的。而实际 阅读详情

相关推荐

ntdll.dll学习总结

ntdll.dll ntdll.dll描述了windows本地NTAPI的接口。是重要的Windows NT内核级文件。当Windows启动时,ntdll.dll就 驻留在内存中特定的写保护区域,使别的程序无法占用这个内存区域。[1]  中文名 ntdll.dll 外文名 NT Layer DLL 版    本 6.3.9600.17736 系统DLL文件 是 属    于 Wind

bcbobo21cn的专栏 1万+

浅析windows对象管理

作者:Sysnap 出处:http://hi.baidu.com/sysnap 标题:Windows 对象管理把以前的对象笔记帖上来...后面多加了俩个 函数..来加深理解...一个是ZwQueryDirectoryObject来检测隐藏驱动一个是让ZwQueryDirectoryObject检测不了的...代码比较简单..先看前面的理论再去理解后面的函数...应该可以编译出来的..否则那个函数你

1260

山东大学机器学习(实验一内容)——线性回归

1. 描述 第一个练习将为你提供线性回归练习。这些练习已经用Matlab进行了广泛的测试,但它们也应该在Octave中工作,它被称为“免费版的Matlab”。如果你使用的是Octave,那就是 一定要安装Image包(可在Windows中作为选项使用)安装程序,可从Octave-Forge获得Linux。 2.线性回归 回想一下,线性回归模型是 hθ(x)=θTx=∑j=0nθjxj h_{\th...

HachiLin的博客 4108

遍历系统中加载的驱动程序以及通过设备对象指针获取设备对象名称

遍历系统中加载的驱动以及通过设备对象指针获取设备对象名称

Masimaro的专栏 2702

VTK学习(入门级教程,包括安装和使用)~持续更新中

说明:研究QT+VTK有段时间了,准备把学到的东西分享给大家,这篇博客以VS+QT+VTK为主进行展开学习的。

HXX904的博客 4757

成本会计(第九版)王忠孝课后习题答案解析

在掌握了基础知识之后,我们还需要培养自己的实际操作能力。此外,在学习过程中,遇到困难时,要及时向老师、同学请教,不要害怕暴露自己的不足。三人行,必有我师,每个人都有值得学习的地方。首先,我们需要认真阅读教材,把基础知识掌握牢固。在这里,我建议大家使用《成本会计(第九版)》的配套练习册,这样可以帮助我们检查学习效果。同时,网上的一些优质课程和论坛也是不错的学习资源,例如网易云课堂、中国大学MOOC等。别担心,这里我给大家推荐一些实用的学习资料和方法,帮助你更好地掌握这门课程。出版社: 大连理工大学出版社。

weixin_58833001的博客 1888

使用Native API查询Windows硬盘分区系统物理设备号

#include #include #include #include // 定义函数返回值 typedef ULONG NTSTATUS; // 宽字节字符串结构定义 typedef struct _UNICODE_STRING { USHORT Length; USHORT MaximumLength; PWSTR Buffer; } UNICODE_STRING, *P

929

edusrc挖掘思路

edusrc挖掘思路前言思路信息搜集系统账号常见漏洞实战分享1、确定目标,语法:site:xxxx.edu.cn2、账号密码组成我们知道了,谷歌语法查找工号3、爆破登录系统4、确定功能,抓具体的url5、添加单引号,报错,是mssql6、报数据库版本,到这一步就可以交了,已经是中危了后记 前言 一月份的时候偶然注意到edusrc,起初是抱着学习的心态去挖几个洞,可是后面发现有证书,而且还贼好看,于是我动了凡心,一顿操作也拿了几本,广西民大、山东理工、同济,未到的有浙大、上海理工,证书要求证书图片可以在我个人

qq_45414878的博客 2万+

ring3下穿透磁盘还原技术揭秘

在写这篇文章之前我犹豫了很久,到底要不要把这些鲜为人知的方法公开了,因为一 旦公开,被人掌握这些技术,那么还原软件的脆弱性则一览无遗,网吧的机子应该就可以 随便的穿透,机器狗是需要加载驱动来进行穿透还原,而我介绍的这种技术不需要加载驱 动则可以穿透还原,你是不是听的有点兴奋,有点热血沸腾;但是我还是要告诉你,技术 是一把双刃剑,利用的好是安全软件,利用的邪恶就是***、病毒等...

weixin_33743880的博客 903

嘉立创EDA报错:元件引脚与焊盘未对应报错解决记录

原件引脚与焊盘未对应报错解决方法,一文总结!

2303_77013775的博客 1万+

MATPOWER下载安装教程

将MATPOWER文件复制在C:\Program Files (x86)\MATLAB\R2016b\bin目录下。原来的窗口中多了很多文件路径,点击【保存】,再点击【关闭】选择所要添加的MATPOWER文件夹,点击【选择文件夹】二、将MATPOWER放在bin目录下。找到菜单栏的【设置路径】点击【添加并包含子文件】一、从官网下载后解压。

weixin_47365903的博客 2万+

ZwOpenSymbolicLinkObject routine

ZwOpenSymbolicLinkObject routine ZwOpenSymbolicLinkObject 例程打开一个已经存在的符号链接。 Syntax   NTSTATUS ZwOpenSymbolicLinkObject( _Out_ PHANDLE LinkHandle, _In_ ACCESS_MASK DesiredAc

死胖子的博客 1648

单片机通过蜂鸣器播放任意音乐代码实现(2):音乐单片机代码自动生成

单片机通过蜂鸣器播放任意音乐代码实现(2):音乐单片机代码自动生成 上一节我们已经构建了基于51单片机的蜂鸣器音乐播放环境,接下来只需要手动或者自动添加音乐代码便能实现不同音乐的播放。当然,第二节将告诉你如何自动生成这些音乐代码。 所用软件 MuseScore 3;用于转换MID文件为musicxml文件 C/C++ IDE(本文为Visual Studio 2019) 1.生成音乐对应的MID文件 可以直接下载mid格式音乐文件,也可以将某段音乐转换为MID文件。最好是直接使用mid格式音乐文件,可

kevin1499的博客 2万+

通过符号链接名获取设备名称

有时候只知道符号链接名,可是通过比如ZwCreateFile等方式打开设备需要设备名。可以通过以下两个内核函数来获取(该方法在另一篇博客内也有提及): NTSYSAPI NTSTATUS ZwOpenSymbolicLinkObject( PHANDLE LinkHandle, ACCESS_MASK DesiredAccess, // 这个权限至少是GENERIC_READ POBJECT_ATTRIBUTES ObjectAttributes );

輚至消亡 1025

学习笔记:TF卡启动荔枝派Nano(全志F1C200S)

荔枝派Nano编译Kernel报错报错内容如下编译烧录 报错内容如下 No controllers found No ethernet found. 从这些报错我真没看从出啥问题,也是在网上找,说是没有找到flash,是因为淘宝买的板子更换了flash,需要在u-boot里面重新适配型号: 板子的型号为xt25f128,但是实际u-boot的配置里面不是需要重新更改: u-boot/arch/arm/dts/suniv-f1c100s-licheepi-nano.dts &spi0 { pin

热爱科技,物联,程序开发等 2133

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

探索Windows内核系列——Object的结构

探索Windows内核系列——Object的结构

sunjiaoya的博客 1487

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Windows NT内核函数大全

Nt内核函数大全 NtLoadDriver服务控制管理器加载设备驱动. NtUnloadDriver服务控制管理器支持卸载指定的驱动程序. NtRegisterNewDevice加载新驱动文件. NtQueryIntervalProfile返回数据. NtSetIntervalProfile指定采样间隔. NtStartProfile开始取样. NtStopProfile停止采样...

qq_42577465的博客 2189

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

ZwQuerySymbolicLinkObject routine

ZwQuerySymbolicLinkObject routine ZwQuerySymbolicLinkObject 返回包含符号链接目标的一个字符串。 Syntax C++ NTSTATUS ZwQuerySymbolicLinkObject( _In_ HANDLE LinkHandle, _Inout_ PUNICODE_STRING

死胖子的博客 2032

Nt内核函数原型and中文

NtLoadDriver 服务控制管理器加载设备驱动. NtUnloadDriver 服务控制管理器支持卸载指定的驱动程序. NtRegisterNewDevice 加载新驱动文件. NtQueryIntervalProfile 返回数据. NtSetIntervalProfile 指定采样间隔. NtStartProfile 开始取样. NtStopProfile 停止...

dengjiatao9832的博客 738

对A盾原理的小小总结,膜拜A神

A盾的原理是在驱动加载时重载os内核,获取原始ssdt表的地址。 应用层点击查询的代码在文件A-ProtectView.cpp中,每种点击操作调用相应的 query查询函数,在query函数里ReadFile。读操作的Handle是A盾自定义的操作码, 类似DeviceIoControl的控制码,比如handle为LIST_SSDT,LIST_INLINEHOOK等。 驱动加载...

weixin_33704591的博客 347

通过设备符号连接打开设备 句柄得到设备名_ZwOpenSymbolicLinkObject_ZwQuerySymbolicLinkObject

#pragma PAGEDCODE NTSTATUS HelloDDKRead(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp) { KdPrint(("DriverB:Enter B HelloDDKRead\n")); NTSTATUS ntStatus = STATUS_SUCCESS; UNICODE_STRING DeviceSymbolicLin...

837

Nt内核函数大全

Nt内核函数大全 NtLoadDriver 服务控制管理器加载设备驱动. NtUnloadDriver 服务控制管理器支持卸载指定的驱动程序. NtRegisterNewDevice 加载新驱动文件. NtQueryIntervalProfile 返回数据. NtSetIntervalProfile 指定采样间隔. NtStartProfile 开始取样. NtStopProfile 停止采样...

huang714的专栏 1936

盘符设备名互相转换

主要实现函数为ZwOpenSymbolicLinkObject和ZwQuerySymbolicLinkObject。第一个函数用于打开符号链接,第二个函数将设备名保存到缓冲区中。函数入口为QuerySymbolicLink#include <ntddk.h> #include <windef.h> #include <ntstrsafe.h>//输入\\??\\c:-->\\device\\\har

zyorz的博客 3178

完全反截屏

把一些高手的语录总结一下:   控制所有截屏软件肯定是不可能的。但可以用相当小的代价来禁止尽可能多的截屏。 分析截屏软件的行为,可得出截屏基本有两种方式。 1. 通过剪贴板 2. 直接截取屏幕中的某一部分保存成图像文件 针对以上两种可做如下的防护: 1. 监控剪贴板变化 (SetClipboardViewer) ,发现剪贴板发生变化后,看剪贴板中是否有图片,如果有,清空它。 2

flyingleo1981的专栏 1万+

符号链接枚举

//--------------------------------------------------------------------------// Copyright (C), 2004-2010, Zhengzz, All Rights Reserved//// FileName: EnumSymbolink.cpp//// Author: zhen

dhbzzz的专栏 3472
上一篇: 查看GCC编译优化的具体选项开关
下一篇: 内存rank概念和区分
功名半纸
功名半纸 领域专家: 操作系统技术领域 领域专家: 操作系统技术领域
博客等级 码龄26年 1137粉丝 282原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值