获取Windows系统和磁盘的一些信息——Windows API

1.获取逻辑磁盘的一些信息:GetDiskFreeSpaceW(fileapi.h)

        DWORD dwTotalClusters;    //总的簇
        DWORD dwFreeClusters;     //可用的簇
        DWORD dwSectPerClust;     //每个簇有多少个扇区
        DWORD dwBytesPerSect;     //每个扇区有多少个字节
        GetDiskFreeSpaceW(TEXT("C:"), &dwSectPerClust, &dwBytesPerSect, &dwFreeClusters, &dwTotalClusters);

2.获取物理磁盘的扇区大小等信息:

BOOL GetDriveGeometry(LPWSTR wszPath, DISK_GEOMETRY *pdg)
{
    HANDLE hDevice = INVALID_HANDLE_VALUE;
    BOOL bResult = FALSE;
    DWORD junk = 0;

    hDevice = CreateFile(wszPath,
                        0,
                        FILE_SHARE_READ | FILE_SHARE_WRITE,
                        NULL,
                        OPEN_EXISTING,
                        0,
                        NULL);
    if (hDevice == INVALID_HANDLE_VALUE) return FALSE;

    bResult = DeviceIoControl(hDevice,
                                IOCTL_DISK_GET_DRIVE_GEOMETRY,
                                NULL,
                                0,
                                pdg,
                                sizeof(*pdg),
                                &junk,
                                NULL);
    CloseHandle(hDevice);
    return TRUE;
}


void someFunc()
{
    DISK_GEOMETRY dg = {0};
    BOOL bResult = FALSE;
    ULONGLONG DiskSize = 0;

    bResult = GetDriveGeometry(TEXT("\\\\.\\PhysicalDrive0"), &dg);
    if (bResult) {
        wprintf(L"Drive path =%ws\n", TEXT("\\\\.\\PhysicalDrive0"));
        wprintf(L"Cylinders = %I64d\n", dg.Cylinders);
        wprintf(L"Tracks/cylinder=%ld\n", dg.TracksPerCylinder);
        wprintf(L"Sectors/track=%ld\n", dg.SectorsPerTrack);
        wprintf(L"Bytes/sector=%ld\n", dg.BytesPerSector);

       //dg.Cylinders.QuadPart  共有几个柱面 
        DiskSize = dg.Cylinders.QuadPart * (ULONG)dg.TracksPerCylinder * (ULONG)dg.SectorsPerTrack * (ULONG)dg.BytesPerSector;
        wprintf(L"Disk size=%I64d (Bytes)"
               L"            %.2f (Gb)\n",
               DiskSize,
               (double)DiskSize / (1024 * 1024 * 1024));
    } else {
        wprintf(L"GetDriveGeometry failed. error:%ld.\n", GetLastError());
    }
}

3.获取磁盘的序列号等

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

void QueryPropertyForDevice(HANDLE);
void PrintDeviceDescriptor(PSTORAGE_DEVICE_DESCRIPTOR);

int main(int argc, char *argv[])
{
    if (argc != 2) {
       printf("Usage:  %s \n", argv[0] );
       printf("Examples:\n");
       printf("    %s g:       (PrintDeviceDescriptor)\n", argv[0]);
    }

    char filepath[7];
    StringCbPrintf(filepath, sizeof(filepath), "\\\\.\\%s", argv[1]);

    HANDLE hDevice = CreateFile(filepath,
       GENERIC_READ,
       FILE_SHARE_READ,
       NULL,
       OPEN_EXISTING,
       0,
       NULL);

    if (hDevice == INVALID_HANDLE_VALUE) {
        unsigned long errorCode = GetLastError();
        printf("Error opening %s. Error: %d\n",
               filepath, errorCode);
        return errorCode;
    }

    QueryPropertyForDevice(hDevice);
    CloseHandle(hDevice);

    return 0;
}



#define BOOLEAN_TO_STRING(_b_) \
( (_b_) ? "True" : "False" )

LPCSTR BusTypeStrings[] = {
    "Unknown",
    "Scsi",
    "Atapi",
    "Ata",
    "1394",
    "Ssa",
    "Fibre",
    "Usb",
    "RAID",
    "Not Defined",
};
#define NUMBER_OF_BUS_TYPE_STRINGS (sizeof(BusTypeStrings)/sizeof(BusTypeStrings[0]))

void QueryPropertyForDevice(HANDLE hDevice)
{
    bool result;
    DWORD readed;

    STORAGE_DESCRIPTOR_HEADER *DeviceDescriptorHeader;
    STORAGE_DEVICE_DESCRIPTOR *DeviceDescriptor;
    DWORD devDescLength;
    STORAGE_PROPERTY_QUERY query;

    query.PropertyId = StorageDeviceProperty;
    query.QueryType = PropertyStandardQuery;

    DeviceDescriptorHeader = (STORAGE_DESCRIPTOR_HEADER *) malloc( sizeof(STORAGE_DESCRIPTOR_HEADER) );
    
    result = DeviceIoControl( hDevice,     // device to be queried
        IOCTL_STORAGE_QUERY_PROPERTY,     // operation to perform
        &query, sizeof query,               // no input buffer
        DeviceDescriptorHeader, sizeof(STORAGE_DESCRIPTOR_HEADER),     // output buffer
        &readed,                 // # bytes returned
        NULL );      // synchronous I/O

    devDescLength = DeviceDescriptorHeader->Size;
    DeviceDescriptor = (STORAGE_DEVICE_DESCRIPTOR *) malloc( devDescLength );

    result = DeviceIoControl( hDevice,     // device to be queried
        IOCTL_STORAGE_QUERY_PROPERTY,     // operation to perform
        &query, sizeof query,               // no input buffer
        DeviceDescriptor, devDescLength,     // output buffer
        &readed,                 // # bytes returned
        NULL );      // synchronous I/O

    PrintDeviceDescriptor(DeviceDescriptor);

    free( DeviceDescriptorHeader );
    free( DeviceDescriptor );
}

void PrintDeviceDescriptor(PSTORAGE_DEVICE_DESCRIPTOR DeviceDescriptor)
{
    LPCSTR vendorId = "";
    LPCSTR productId = "";
    LPCSTR productRevision = "";
    LPCSTR serialNumber = "";
    LPCSTR busType;

    if ((ULONG)DeviceDescriptor->BusType < NUMBER_OF_BUS_TYPE_STRINGS) {
        busType = BusTypeStrings[DeviceDescriptor->BusType];
    } else {
        busType = BusTypeStrings[NUMBER_OF_BUS_TYPE_STRINGS-1];
    }

    if ((DeviceDescriptor->ProductIdOffset != 0) &&
        (DeviceDescriptor->ProductIdOffset != -1)) {
        productId        = (LPCSTR)(DeviceDescriptor);
        productId       += (ULONG_PTR)DeviceDescriptor->ProductIdOffset;
    }
    if ((DeviceDescriptor->VendorIdOffset != 0) &&
        (DeviceDescriptor->VendorIdOffset != -1)) {
        vendorId         = (LPCSTR)(DeviceDescriptor);
        vendorId        += (ULONG_PTR)DeviceDescriptor->VendorIdOffset;
    }
    if ((DeviceDescriptor->ProductRevisionOffset != 0) &&
        (DeviceDescriptor->ProductRevisionOffset != -1)) {
        productRevision  = (LPCSTR)(DeviceDescriptor);
        productRevision += (ULONG_PTR)DeviceDescriptor->ProductRevisionOffset;
    }
    if ((DeviceDescriptor->SerialNumberOffset != 0) &&
        (DeviceDescriptor->SerialNumberOffset != -1)) {
        serialNumber     = (LPCSTR)(DeviceDescriptor);
        serialNumber    += (ULONG_PTR)DeviceDescriptor->SerialNumberOffset;
    }

    puts("\n            ***** STORAGE DEVICE DESCRIPTOR DATA *****");
    printf("              Version: %08x\n"
           "            TotalSize: %08x\n"
           "           DeviceType: %08x\n"
           "   DeviceTypeModifier: %08x\n"
           "       RemovableMedia: %s\n"
           "      CommandQueueing: %s\n"
           "            Vendor Id: %s\n"
           "           Product Id: %s\n"
           "     Product Revision: %s\n"
           "        Serial Number: %s\n"
           "             Bus Type: %s\n",
           DeviceDescriptor->Version,
           DeviceDescriptor->Size,
           DeviceDescriptor->DeviceType,
           DeviceDescriptor->DeviceTypeModifier,
           BOOLEAN_TO_STRING(DeviceDescriptor->RemovableMedia),
           BOOLEAN_TO_STRING(DeviceDescriptor->CommandQueueing),
           vendorId,
           productId,
           productRevision,
           serialNumber,
           busType);
    
    printf("\n");
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值