获取磁盘分区信息

1、封装一个函数 bool CheckDiskExist(LPCTSTR lpszDrive) 判断指定的盘符是否存在;
2、调用 GetLogicalDrives 获得当前系统有几个分区,分别是什么,打印出来?该API函数的说明详见:https://www.cctry.com/thread-298708-1-1.html
3、调用 GetDiskFreeSpace 获得系统盘的总容量,已用容量,剩余容量,该API函数的说明详见:https://www.cctry.com/thread-298709-1-1.html
4、调用 GetDiskFreeSpaceEx 获得系统盘的总容量,已用容量,剩余容量,该API函数的说明详见:https://www.cctry.com/thread-298710-1-1.html

#include <Windows.h>
#include <tchar.h>
#include <bitset>
#include <iostream>
using namespace std;
int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, INT nCmdShow)
{

    return 0;
}
bool CheckDiskExist(LPCTSTR lpszDrive)
{
    if (!lpszDrive || _tcslen(lpszDrive) < 3) return FALSE;
    TCHAR szDrives[MAX_PATH] = {0};
    DWORD dwRet = GetLogicalDriveStrings(MAX_PATH, szDrives);
    if (!dwRet) return FALSE;
    TCHAR* pDrive = szDrives;
    do
    {
        if (*pDrive) if (_tcscmp(lpszDrive, pDrive) == 0) return true;
        pDrive += _tcslen(pDrive) + 1;
    } while (*pDrive);
}
bool EnumDrives2()
{
    char chDrive = 'A';
    DWORD dwDrives = GetLogicalDrives();
                            //循环次数28次            
    for (int idx = 0; idx < sizeof(DWORD) * 7; ++idx, ++chDrive)
    {
        DWORD dwValue = dwDrives >> idx; //右移1位相当于除以2,这个只有正数适用,而负数不适用。
        if((dwValue & 1) > 0) cout << chDrive << ":\\" << endl;
        //按位与二进位均为1时, 结果位才为1, 否则为0。
    }
    return TRUE;
}
bool GetDiskSpace(LPCTSTR lpDisk)
{
    if (!lpDisk || _tcslen(lpDisk) < 3) return FALSE;
    DWORD dwSectorsPerCluster = 0;    //每个簇有多少个扇区
    DWORD dwBytesPerSector = 0;        //每个扇区有多少个字节
    DWORD dwNumberOfFreeClusters = 0;    //空余簇的数量
    DWORD dwTotalNumberOfClusters = 0;//全部簇的数量
    bool bRet = GetDiskFreeSpace(lpDisk,&dwSectorsPerCluster,&dwBytesPerSector,&dwNumberOfFreeClusters,&dwTotalNumberOfClusters);
    if (!bRet) return FALSE;
    cout << "使用 GetDiskFreeSpace 函数获取磁盘空间信息" << endl;
    cout << "每簇的扇区数 = " << dwSectorsPerCluster << endl;
    cout << "每扇区的字节数 = " << dwBytesPerSector << endl;
    cout << "空余簇的数量 = " << (DWORD64)dwNumberOfFreeClusters * (DWORD64)dwSectorsPerCluster * (DWORD64)dwBytesPerSector << endl;
    cout << "磁盘总容量 = " << (DWORD64)dwTotalNumberOfClusters * (DWORD64)dwSectorsPerCluster * (DWORD64)dwBytesPerSector << endl;
    //DWORD空间不够存放转为DWORD64
    return TRUE;
}
bool GetDiskSpaceEx(LPCTSTR lpDisk)
{
    if (!lpDisk || _tcslen(lpDisk) < 3) return FALSE;
    DWORD64 qwFreeBytesAvailableToCaller =  0 ;
    DWORD64 qwTotalNumberOfBytes =  0 ;
    DWORD64 qwTotalNumberOfFreeBytes =  0 ;
    bool bRet = GetDiskFreeSpaceEx(lpDisk, (PULARGE_INTEGER)&qwFreeBytesAvailableToCaller, (PULARGE_INTEGER)&qwTotalNumberOfBytes, (PULARGE_INTEGER)&qwTotalNumberOfFreeBytes);
    if (!bRet) return FALSE;
    cout << "使用 GetDiskFreeSpaceEx 函数获取磁盘空间信息" << endl;
    cout << "可用的磁盘空闲容量: " << qwFreeBytesAvailableToCaller << endl;
    cout << "磁盘总容量: " << qwTotalNumberOfBytes << endl;
    cout << "磁盘空闲容量: " << qwTotalNumberOfFreeBytes << endl;
    return TRUE;
}
int main()
{
    //CheckDiskExist(_T("D:\\"));
    //EnumDrives2();
    //GetDiskSpace(_T("D:\\"));
    GetDiskSpaceEx(_T("D:\\"));
    return 0;
}

 

上一篇:中断,IDE环境汇编语法


下一篇:CS-Shellcode分析入门 第二课