如何通过其上的路径判断Windows分区是否处于活动状态

How to tell if Windows partition is active by a path on it?

本文关键字:是否 分区 活动状态 Windows 判断 何通过 路径      更新时间:2023-10-16

我的目标是知道Windows是否安装在活动磁盘分区上。我可以获取Windows的路径:

C:WINDOWS

然后是分区:

DeviceHarddisk4Partition4

但问题是怎么知道这个分区是否处于活动状态?

检查此链接 (http://msdn.microsoft.com/en-us/library/windows/desktop/aa365451(v=vs.85).aspx)

PARTITION_INFORMATION有引导指示器。 但不能保证正在运行的窗口是由该分区启动的。

编辑 这是一个在 Windows7 上测试的示例函数。我认为"激活"分区不是您的目标。"激活"具有可启动USB设备等含义。我不喜欢 WMI,但它可以帮助您实现目标(http://msdn.microsoft.com/en-us/library/windows/desktop/bb986746(v=vs.85).aspx)

BOOL
__stdcall
TP_IsPartitionActivated(
__in    LPCWSTR pPartition,
__out   PBOOL   pbIsActivated
)
{
    HANDLE  hDevice = INVALID_HANDLE_VALUE;
    PARTITION_INFORMATION_EX   szPartitionInformation;
    DWORD cbReturned = 0x00;
    if (pPartition == NULL || pbIsActivated == NULL) { return FALSE; }
    __try
    {
        hDevice = CreateFileW(pPartition, 0x00, 0x00, NULL, OPEN_EXISTING, 0x00, NULL);
        if (hDevice == INVALID_HANDLE_VALUE) { return FALSE; }
        RtlZeroMemory(&szPartitionInformation, sizeof(szPartitionInformation));
        if (FALSE != DeviceIoControl(hDevice, IOCTL_DISK_GET_PARTITION_INFO_EX, NULL, 0x00, (LPVOID)&szPartitionInformation, sizeof(PARTITION_INFORMATION_EX), &cbReturned, NULL))
        {
            if (PARTITION_STYLE_MBR == szPartitionInformation.PartitionStyle)
            {
                *pbIsActivated = szPartitionInformation.Mbr.BootIndicator;
            }
            else
            {
            }
            return TRUE;
        }
        else
        {
            cbReturned = GetLastError();
            wprintf(L"%08X(%d)n", cbReturned, cbReturned);
        }
    }
    __finally
    {
        if (hDevice != INVALID_HANDLE_VALUE) { CloseHandle(hDevice); }
    }
    return FALSE;
}

呼叫喜欢

WCHAR   szPartition[] = L"\\.\C:";
BOOL    bIsActivated = FALSE;
if (FALSE != TP_IsPartitionActivated(szPartition, &bIsActivated))
{
    wprintf(L"%s n", bIsActivated == FALSE ? L"not activated" : L"activated");
}
else
{
    wprintf(L"function failn");
}