in IORequestGenerator/IORequestGenerator.cpp [61:171]
UINT64 GetDynamicPartitionSize(HANDLE hFile)
{
assert(NULL != hFile && INVALID_HANDLE_VALUE != hFile);
UINT64 size = 0;
VOLUME_DISK_EXTENTS diskExt = {0};
PVOLUME_DISK_EXTENTS pDiskExt = &diskExt;
DWORD bytesReturned;
DWORD status = ERROR_SUCCESS;
BOOL rslt;
OVERLAPPED ovlp = {0};
ovlp.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (ovlp.hEvent == nullptr)
{
PrintError("ERROR: Failed to create event (error code: %u)\n", GetLastError());
return 0;
}
rslt = DeviceIoControl(hFile,
IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,
NULL,
0,
pDiskExt,
sizeof(VOLUME_DISK_EXTENTS),
&bytesReturned,
&ovlp);
if (!rslt) {
status = GetLastError();
if (status == ERROR_MORE_DATA) {
status = ERROR_SUCCESS;
bytesReturned = sizeof(VOLUME_DISK_EXTENTS) + ((pDiskExt->NumberOfDiskExtents - 1) * sizeof(DISK_EXTENT));
pDiskExt = (PVOLUME_DISK_EXTENTS)LocalAlloc(LPTR, bytesReturned);
if (pDiskExt)
{
rslt = DeviceIoControl(hFile,
IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,
NULL,
0,
pDiskExt,
bytesReturned,
&bytesReturned,
&ovlp);
if (!rslt)
{
status = GetLastError();
if (status == ERROR_IO_PENDING)
{
if (WAIT_OBJECT_0 != WaitForSingleObject(ovlp.hEvent, INFINITE))
{
status = GetLastError();
PrintError("ERROR: Failed while waiting for event to be signaled (error code: %u)\n", status);
}
else
{
status = ERROR_SUCCESS;
assert(pDiskExt->NumberOfDiskExtents <= 1);
}
}
else
{
PrintError("ERROR: Could not obtain dynamic volume extents (error code: %u)\n", status);
}
}
}
else
{
status = GetLastError();
PrintError("ERROR: Could not allocate memory (error code: %u)\n", status);
}
}
else if (status == ERROR_IO_PENDING)
{
if (WAIT_OBJECT_0 != WaitForSingleObject(ovlp.hEvent, INFINITE))
{
status = GetLastError();
PrintError("ERROR: Failed while waiting for event to be signaled (error code: %u)\n", status);
}
else
{
status = ERROR_SUCCESS;
assert(pDiskExt->NumberOfDiskExtents <= 1);
}
}
else
{
PrintError("ERROR: Could not obtain dynamic volume extents (error code: %u)\n", status);
}
}
else
{
assert(pDiskExt->NumberOfDiskExtents <= 1);
}
if (status == ERROR_SUCCESS)
{
for (DWORD n = 0; n < pDiskExt->NumberOfDiskExtents; n++) {
size += pDiskExt->Extents[n].ExtentLength.QuadPart;
}
}
if (pDiskExt && (pDiskExt != &diskExt)) {
LocalFree(pDiskExt);
}
CloseHandle(ovlp.hEvent);
return size;
}