|
本帖最后由 hanlu 于 2025-6-30 15:26 编辑
// ConsoleApplication8.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <windows.h>
#include <strsafe.h>
#include <winioctl.h>
#include <ntddstor.h>
BOOL IsBitlockerPartition(IN LPCWSTR lpDiskName, ULONGLONG ullOffset);
typedef struct _BOOT_SECTOR_BITLOCKER {
BYTE jump[3];
BYTE oemID[8];
WORD bytePerSector;
BYTE sectorPerCluster;
WORD reserved0;
BYTE fatCount;
WORD rootMaxEntries;
WORD totalSectorsSmall;
BYTE mediaType;
WORD sectorsPerFatSmall;
WORD sectorsPerTrack;
WORD headCount;
DWORD fsOffset;
DWORD totalSectors;
DWORD sectorsPerFat;
WORD fatFlags;
WORD version;
DWORD rootCluster;
WORD fsInfoSector;
WORD backupSector;
ULONG32 reserved1[3];
BYTE driveNumber;
BYTE reserved2;
BYTE extSig;
ULONG32 serial;
CHAR label[11];
CHAR fsName[8];
CHAR bootCode[70];
GUID partitionGUID;
DWORD64 fveBlockOffset[3];
CHAR bootCode2[307];
BYTE stringOffsets[3];
BYTE endMarker[2];
} BOOT_SECTOR_BITLOCKER, * PBOOT_SECTOR_BITLOCKER;
static BOOL IsBitlocker(WCHAR Volume)
{
WCHAR szVolumeDosName[50] = {};
::StringCchPrintfW(szVolumeDosName, ARRAYSIZE(szVolumeDosName), L"\\\\.\\%c:", Volume);
HANDLE hFile = ::CreateFile(szVolumeDosName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (INVALID_HANDLE_VALUE == hFile)
return FALSE;
BOOL bRet = FALSE;
do
{
BYTE bBuffer[sizeof(VOLUME_DISK_EXTENTS) + 5 * sizeof(DISK_EXTENT)] = {};
ULONG ulReturnedLength = 0;
if (!::DeviceIoControl(hFile, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, NULL, 0, &bBuffer, sizeof(bBuffer), &ulReturnedLength, NULL))
break;
PVOLUME_DISK_EXTENTS pVolumeDiskExt = (PVOLUME_DISK_EXTENTS)bBuffer;
if (1 == pVolumeDiskExt->NumberOfDiskExtents)
{
WCHAR szPhysicalDiskName[100] = {};
::StringCchPrintfW(szPhysicalDiskName, ARRAYSIZE(szPhysicalDiskName), L"\\\\.\\PhysicalDrive%d",
pVolumeDiskExt->Extents[0].DiskNumber);
bRet = IsBitlockerPartition(szPhysicalDiskName, pVolumeDiskExt->Extents[0].StartingOffset.QuadPart);
}
} while (FALSE);
::CloseHandle(hFile);
return bRet;
}
BOOL IsBitlockerPartition(IN LPCWSTR lpDiskName, ULONGLONG ullOffset)
{
BOOL bRet = FALSE;
HANDLE hFile = INVALID_HANDLE_VALUE;
do
{
hFile = CreateFileW(lpDiskName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
if (INVALID_HANDLE_VALUE == hFile)
break;
LARGE_INTEGER liOffset = {};
liOffset.QuadPart = ullOffset;
LARGE_INTEGER NewFilePointer = {};
if (0 == ::SetFilePointerEx(hFile, liOffset, &NewFilePointer, FILE_BEGIN))
break;
BYTE bDbr[512] = {};
DWORD dwRead = 0;
if (!::ReadFile(hFile, bDbr, sizeof(bDbr), &dwRead, NULL))
break;
PBOOT_SECTOR_BITLOCKER pBitlockerBootSector = (PBOOT_SECTOR_BITLOCKER)bDbr;
bRet = (0 == _strnicmp((char*)pBitlockerBootSector->oemID, "-FVE-FS-", 8));
} while (FALSE);
if (INVALID_HANDLE_VALUE != hFile)
::CloseHandle(hFile);
return bRet;
}
int main()
{
if (IsBitlocker('C')) {
//开启
std::cout << "true" << std::endl;
}
else {
//未开启
std::cout << "false" << std::endl;
}
}

是代码,可以直接编译的 不会用的暂时不要下载啦 调用的官网方法判断
|
|