-2

私の目標は、アクティブなディスク パーティションに Windows がインストールされているかどうかを知ることです。Windows のパスを取得できます。

C:\WINDOWS

そしてそれはパーティションです:

\Device\Harddisk4\Partition4

しかし問題は、このパーティションがアクティブかどうかを知る方法です。

4

1 に答える 1

1

このリンクを確認してください ( http://msdn.microsoft.com/en-us/library/windows/desktop/aa365451(v=vs.85).aspx )

PARTITION_INFORMATION には BootIndicator があります。ただし、実行中のウィンドウがそのパーティションによって起動されたという保証はありません。

編集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 fail\n");
}
于 2014-11-24T04:11:14.873 に答える