2014-11-24 6 views

ответ

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"); 
} 
+0

Если вы не возражаете, я спрашиваю, почему я хотел бы использовать его тогда, если ' это не гарантировано'? – c00000fd

+0

@ c00000fd: Это отвечает на ваш вопрос, т. Е. Показывает, активен ли раздел или нет. Независимо от того, является ли экземпляр Windows, который в настоящее время загружается через этот раздел, представляет собой другой вопрос. –

+0

@HarryJohnston: ОК. Понимаю. Вероятно, так он сформулировал это. – c00000fd