#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硬盘分区系统设备名称相关推荐

  1. Linux和Windows硬盘分区设置

    Linux和Windows硬盘分区设置 现在的Linux都带了图形界面的分区工具,所以老的fdisk命令使用就不在这再写了. 一.系统引导过程简介 系统引导过程主要由以下几个步骤组成(以硬盘启动为例) ...

  2. linux双系统内存分配,Linux和Windows硬盘分区设置(二)

    三.关于硬盘分区划分标准及合理分区结构 1.硬盘分区划分标准 硬盘的分区由主分区.扩展分区和逻辑分区组成:所以我们在对硬盘分区时要遵循这个标准:主分区(包括扩展分区)的最大个数是四个,主分区(包含扩展 ...

  3. Windows硬盘等存储设备读写查询分区格式化(一)

    对硬盘的操作一般有:读,写,查询,分区,格式化.在Linux系统对硬盘进行自定义开发是比较容易的,因为在Linux系统,所有的设备都可以当做文件来处理.但是在万恶的Windows上就没有那么的便利了, ...

  4. Ubuntu21.04开机自动挂载Windows硬盘分区

    1.查看分区信息 sudo fdisk -l 2.查看磁盘类型 sudo blkid 例: 得到以下内容 Device Boot Start End Sectors Size Id Type /dev ...

  5. 硬盘分区、挂载及Ubuntu系统安装

    Linux发行版按照打包方式划分主要包括Debian系(基于Dpkg).Red Hat系(基于RPM).Slackware系等,其中Debian系.Red Hat系是我们所常见的,前者包括Ubuntu ...

  6. windows下查看硬盘序列号、设备序列号、操作系统版本和安装时间、系统启用时间等命令

    windows下查看硬盘序列号.设备序列号.操作系统版本和安装时间.系统启用时间等命令 最近由于工作需要查询一些硬盘序列号.设备序列号.操作系统版本和安装时间.系统启用时间等信息.所以对用到的命令进行 ...

  7. linux 分区 备份软件下载,硬盘分区备份(Image For Windows)

    TeraByte Unlimited Image 是一个可靠的硬盘分区数据映像备份和恢复解决方案,提供了一个简单方便的方式,完全备份你所有的硬盘驱动器的数据,程序和操作系统.备份可以直接保存到外部US ...

  8. LinuX 硬盘分区细节详谈 【 整理至 LinuxSir BY FreeXploiT 】

    系统引导过程及硬盘分区结构论述 作者: zhy2111314 来自: LinuxSir.Org ouc.edu.cn 摘要: 本文是理论性文档,主要讲述系统引导过程以及硬盘的物理结构: +++++++ ...

  9. LinuX 硬盘分区细节

    系统引导过程及硬盘分区结构论述 作者: zhy2111314 来自: LinuxSir.Org ouc.edu.cn 摘要: 本文是理论性文档,主要讲述系统引导过程以及硬盘的物理结构: +++++++ ...

  10. LinuX 硬盘分区细节详谈

    系统引导过程及硬盘分区结构论述 作者: zhy2111314 来自: LinuxSir.Org ouc.edu.cn 摘要: 本文是理论性文档,主要讲述系统引导过程以及硬盘的物理结构: +++++++ ...

最新文章

  1. 全球第三大手机操作系统!倒闭!
  2. 周立功-成功心法(2):通过讲故事营销自己
  3. 《浙江省推动数据中心能效提升行动方案(2021-2025年)》出炉
  4. 电脑要什么配置好_学平面设计用什么电脑比较好?对配置要求高吗?
  5. Exchange Server 2013日记功能
  6. 十八般武艺玩转GaussDB(DWS)性能调优:总体调优策略
  7. 【英语学习】【Level 08】U03 My Choice L6 Stories that make an impact
  8. centos web服务器---sysctl.conf调优参数
  9. Java遇见HTML——JSP篇之JSP内置对象(下)
  10. java数据区_Java运行时数据区域介绍
  11. 泰山OFFICE在LINUX上的文件图标终于全部正确
  12. greensock下载_面向初学者的GreenSock(第2部分):GSAP的时间表
  13. word排版一般步骤
  14. 微软Windows 11官方超高清4K壁纸提前放出,免费下载
  15. 如何创建Vue脚手架以及关闭语法检查
  16. Java总结IO篇之字符流
  17. xshell免费版绿化版下载
  18. 什么是「逼格」?怎么才能提高「逼格」?
  19. 1155 服务器芯片组,华硕服务器主板 P8B-E/4L 单路1155针脚 四千兆网卡
  20. python魔术方法是什么_Python常用魔术方法

热门文章

  1. Android常用组件
  2. vgcreate 创建卷组
  3. python如何转换数据集_将数据集转换为HDF5数据
  4. combox控件触发事件_dom事件
  5. python选择排序算法_Python - 排序算法
  6. Implement queue with two stack 用两个堆实现队列
  7. MySQL(3)-----DML数据库操作(上)
  8. C语言底层原理(一):预处理、编译、汇编、链接
  9. shellcode之简单的栈溢出实验
  10. 一个获取随机字符串的函数