Win32 API功能封装
+ -

Windows下获取盘符信息

2021-08-30 390 0

在Windows 下,各盘符其实是系统中一个文件,我们了可以通过CreateFile来打开,然后再通过DeviceIoControl函数发送不同的控制码获取相关的信息。

这里的信息包括盘符大小,StartingOffset,DiskNumber,ExtentLength等。


#include<windows.h>
#include<stdio.h>
#include <winioctl.h>

#define IOCTL_VOLUME_BASE   ((DWORD) 'V')
#define IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS    CTL_CODE(IOCTL_VOLUME_BASE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS)

void Show(char* pName)
{
    printf("%s\n",pName);
//char* pName = "\\\\.\\D:";
        HANDLE hDevice = CreateFile(pName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
        if (hDevice == INVALID_HANDLE_VALUE)
        {
            return ;
        }

typedef struct _DISK_EXTENT {
    ULONG DiskNumber;
    LARGE_INTEGER StartingOffset;
    LARGE_INTEGER ExtentLength;
} DISK_EXTENT, *PDISK_EXTENT;
typedef struct _VOLUME_DISK_EXTENTS {
    ULONG NumberOfDiskExtents;
    DISK_EXTENT Extents[1];
} VOLUME_DISK_EXTENTS, *PVOLUME_DISK_EXTENTS;


VOLUME_DISK_EXTENTS vde;

    ULONG rtn;
    BOOL ok=    DeviceIoControl(hDevice,   
            IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, 
            NULL,
            0,
            &vde,
            sizeof(vde),
            &rtn,
            NULL); 
    if(!ok)
    {
        DWORD e =GetLastError();
        e =e;
    }

    PDISK_EXTENT pdisk = vde.Extents;
    printf("DiskID:%d\n",pdisk->DiskNumber);
    printf("NumberOfDiskExtents:%d\n",vde.NumberOfDiskExtents);
    printf("start:%I64d\n",pdisk->StartingOffset.QuadPart/512);
    printf("ExtentLength:%I64d\n",pdisk->ExtentLength.QuadPart/512);


    printf("\n");
        CloseHandle(hDevice);
}
void main()
{
    DWORD dw=GetLogicalDriveStrings(0,NULL);
    LPTSTR lpDriveStrings=(LPTSTR) HeapAlloc( GetProcessHeap(),0,dw*sizeof(TCHAR));
    GetLogicalDriveStrings(dw,lpDriveStrings);
    for(;strlen(lpDriveStrings);)
    {
        printf("%s\n",lpDriveStrings);
        lpDriveStrings+=strlen(lpDriveStrings);
        lpDriveStrings++;
    }

    Show("\\\\.\\C:");
    Show("\\\\.\\D:");
    Show("\\\\.\\E:");
    Show("\\\\.\\F:");
    Show("\\\\.\\G:");
    Show("\\\\.\\H:");
    Show("\\\\.\\I:");
    Show("\\\\.\\M:");

}

0 篇笔记 写笔记

Windows下获取盘符信息
在Windows 下,各盘符其实是系统中一个文件,我们了可以通过CreateFile来打开,然后再通过DeviceIoControl函数发送不同的控制码获取相关的信息。这里的信息包括盘符大小,StartingOffset,DiskNumber,ExtentLength等。#include<......
Windows下隐藏盘符
在windows下,有时我们需要隐藏某个分区当有隐藏磁盘分区的需求时可以通过修改注册表来实现在不删除盘符的情况下使分区不在资源管理器中显示,但不会修改盘符以及影响分区中的数据,仅仅只是在资源管理器中不再显示,可以理解为视觉上的隐藏适合在保证磁盘分区能正常使用的情况下让电脑使用者看不见某一些分区 w......
文件路径名解析出路径、盘符、扩展名和文件名
LPTSTR szfileName = new TCHAR[MAX_PATH]; GetModuleFileName(NULL, szfileName , MAX_PATH); // 获取盘符、文件名、扩展名等信息 wchar_t drive[_MAX_DRIVE];......
作者信息
我爱内核
Windows驱动开发,网站开发
好好学习,天天向上。
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!