使用Native API查询Windows硬盘分区系统设备名称
#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;
// 字符串比较
typedefBOOLEAN(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;
// 查询对象
typedefNTSTATUS(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;
// 打开符号链接对象
typedefNTSTATUS(WINAPI *ZWOPENSYMBOLICKLINKOBJECT)(OUT PHANDLE SymbolicLinkHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes);
ZWOPENSYMBOLICKLINKOBJECT ZwOpenSymbolicLinkObject;
// 查询符号链接对象
typedefNTSTATUS(WINAPI *ZWQUERYSYMBOLICKLINKOBJECT)(IN HANDLE SymbolicLinkHandle,IN OUT PUNICODE_STRING TargetName,OUT PULONG ReturnLength OPTIONAL);
ZWQUERYSYMBOLICKLINKOBJECT ZwQuerySymbolicLinkObject;
// 关闭已经打开的对象
typedefNTSTATUS(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) // ntsubauthHMODULE 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;}
#elseCopyMemory(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();}
使用Native API查询Windows硬盘分区系统设备名称相关推荐
- Linux和Windows硬盘分区设置
Linux和Windows硬盘分区设置 现在的Linux都带了图形界面的分区工具,所以老的fdisk命令使用就不在这再写了. 一.系统引导过程简介 系统引导过程主要由以下几个步骤组成(以硬盘启动为例) ...
- linux双系统内存分配,Linux和Windows硬盘分区设置(二)
三.关于硬盘分区划分标准及合理分区结构 1.硬盘分区划分标准 硬盘的分区由主分区.扩展分区和逻辑分区组成:所以我们在对硬盘分区时要遵循这个标准:主分区(包括扩展分区)的最大个数是四个,主分区(包含扩展 ...
- Windows硬盘等存储设备读写查询分区格式化(一)
对硬盘的操作一般有:读,写,查询,分区,格式化.在Linux系统对硬盘进行自定义开发是比较容易的,因为在Linux系统,所有的设备都可以当做文件来处理.但是在万恶的Windows上就没有那么的便利了, ...
- Ubuntu21.04开机自动挂载Windows硬盘分区
1.查看分区信息 sudo fdisk -l 2.查看磁盘类型 sudo blkid 例: 得到以下内容 Device Boot Start End Sectors Size Id Type /dev ...
- 硬盘分区、挂载及Ubuntu系统安装
Linux发行版按照打包方式划分主要包括Debian系(基于Dpkg).Red Hat系(基于RPM).Slackware系等,其中Debian系.Red Hat系是我们所常见的,前者包括Ubuntu ...
- windows下查看硬盘序列号、设备序列号、操作系统版本和安装时间、系统启用时间等命令
windows下查看硬盘序列号.设备序列号.操作系统版本和安装时间.系统启用时间等命令 最近由于工作需要查询一些硬盘序列号.设备序列号.操作系统版本和安装时间.系统启用时间等信息.所以对用到的命令进行 ...
- linux 分区 备份软件下载,硬盘分区备份(Image For Windows)
TeraByte Unlimited Image 是一个可靠的硬盘分区数据映像备份和恢复解决方案,提供了一个简单方便的方式,完全备份你所有的硬盘驱动器的数据,程序和操作系统.备份可以直接保存到外部US ...
- LinuX 硬盘分区细节详谈 【 整理至 LinuxSir BY FreeXploiT 】
系统引导过程及硬盘分区结构论述 作者: zhy2111314 来自: LinuxSir.Org ouc.edu.cn 摘要: 本文是理论性文档,主要讲述系统引导过程以及硬盘的物理结构: +++++++ ...
- LinuX 硬盘分区细节
系统引导过程及硬盘分区结构论述 作者: zhy2111314 来自: LinuxSir.Org ouc.edu.cn 摘要: 本文是理论性文档,主要讲述系统引导过程以及硬盘的物理结构: +++++++ ...
- LinuX 硬盘分区细节详谈
系统引导过程及硬盘分区结构论述 作者: zhy2111314 来自: LinuxSir.Org ouc.edu.cn 摘要: 本文是理论性文档,主要讲述系统引导过程以及硬盘的物理结构: +++++++ ...
最新文章
- 全球第三大手机操作系统!倒闭!
- 周立功-成功心法(2):通过讲故事营销自己
- 《浙江省推动数据中心能效提升行动方案(2021-2025年)》出炉
- 电脑要什么配置好_学平面设计用什么电脑比较好?对配置要求高吗?
- Exchange Server 2013日记功能
- 十八般武艺玩转GaussDB(DWS)性能调优:总体调优策略
- 【英语学习】【Level 08】U03 My Choice L6 Stories that make an impact
- centos web服务器---sysctl.conf调优参数
- Java遇见HTML——JSP篇之JSP内置对象(下)
- java数据区_Java运行时数据区域介绍
- 泰山OFFICE在LINUX上的文件图标终于全部正确
- greensock下载_面向初学者的GreenSock(第2部分):GSAP的时间表
- word排版一般步骤
- 微软Windows 11官方超高清4K壁纸提前放出,免费下载
- 如何创建Vue脚手架以及关闭语法检查
- Java总结IO篇之字符流
- xshell免费版绿化版下载
- 什么是「逼格」?怎么才能提高「逼格」?
- 1155 服务器芯片组,华硕服务器主板 P8B-E/4L 单路1155针脚 四千兆网卡
- python魔术方法是什么_Python常用魔术方法