18#define InsertAscendingList(ListHead, NewEntry, Type, ListEntryField, SortField)\
22 current = (ListHead)->Flink;\
23 while (current != (ListHead))\
25 if (CONTAINING_RECORD(current, Type, ListEntryField)->SortField >=\
26 (NewEntry)->SortField)\
30 current = current->Flink;\
33 InsertTailList(current, &((NewEntry)->ListEntryField));\
37#define PARTITION_LINUX 0x83
39#define PARTITION_TBL_SIZE 4
41#define MBR_MAGIC 0xAA55
84#ifdef DUMP_PARTITION_TABLE
96 DbgPrint(
"Index Start Length Hidden Nr Type Boot RW\n");
97 DbgPrint(
"----- ------------ ------------ ---------- -- ---- ---- --\n");
99 for (
i = 0;
i < DiskEntry->LayoutBuffer->PartitionCount;
i++)
102 DbgPrint(
" %3lu %12I64u %12I64u %10lu %2lu %2x %c %c\n",
104 PartitionInfo->StartingOffset.QuadPart / DiskEntry->BytesPerSector,
105 PartitionInfo->PartitionLength.QuadPart / DiskEntry->BytesPerSector,
115 DbgPrint(
"Index Start Length Nr RW Type \n");
116 DbgPrint(
"----- ------------ ------------ -- -- --------\n");
117 for (
i = 0;
i < DiskEntry->LayoutBuffer->PartitionCount;
i++)
121 DbgPrint(
" %3lu %12I64u %12I64u %2lu %c %08lx\n",
123 PartitionInfo->StartingOffset.QuadPart / DiskEntry->BytesPerSector,
124 PartitionInfo->PartitionLength.QuadPart / DiskEntry->BytesPerSector,
135#ifdef DUMP_PARTITION_LIST
147 DbgPrint(
"Disk Start Disk End Disk Length \n");
148 DbgPrint(
"------------ ------------ ------------\n");
149 DbgPrint(
"%12I64u %12I64u %12I64u\n",
150 DiskEntry->StartSector.QuadPart,
151 DiskEntry->EndSector.QuadPart,
152 DiskEntry->EndSector.QuadPart - DiskEntry->StartSector.QuadPart + 1);
156 DbgPrint(
"Start End Length Nr Type P\n");
157 DbgPrint(
"------------ ------------ ------------ --- -------- --\n");
159 for (ListEntry = DiskEntry->PrimaryPartListHead.Flink;
160 ListEntry != &DiskEntry->PrimaryPartListHead;
161 ListEntry = ListEntry->
Flink)
165 DbgPrint(
"%12I64u %12I64u %12I64u %3lu %08lx %c\n",
176 DbgPrint(
"Disk Start Disk End Disk Length \n");
177 DbgPrint(
"------------ ------------ ------------\n");
178 DbgPrint(
"%12I64u %12I64u %12I64u\n",
179 DiskEntry->StartSector.QuadPart,
180 DiskEntry->EndSector.QuadPart,
181 DiskEntry->EndSector.QuadPart - DiskEntry->StartSector.QuadPart + 1);
215 L"\\Scsi\\Scsi Port %lu",
232 DPRINT1(
"RtlQueryRegistryValues() failed (Status %lx)\n",
Status);
346 if (*Int13Drives ==
NULL)
359#define ROOT_NAME L"\\Registry\\Machine\\HARDWARE\\DESCRIPTION\\System\\MultifunctionAdapter"
379 L"\\Registry\\Machine\\HARDWARE\\DESCRIPTION\\System",
385 DPRINT1(
"Unable to query the 'Configuration Data' key in '\\Registry\\Machine\\HARDWARE\\DESCRIPTION\\System', status=%lx\n",
Status);
405 L"%s\\%lu\\DiskController",
ROOT_NAME, AdapterCount);
416 L"%s\\%lu\\DiskController\\0",
ROOT_NAME, AdapterCount);
429 L"%s\\%lu\\DiskController\\0\\DiskPeripheral",
ROOT_NAME, AdapterCount);
446 if (BiosDiskEntry ==
NULL)
452 L"%s\\%lu\\DiskController\\0\\DiskPeripheral\\%lu",
ROOT_NAME, AdapterCount, DiskCount);
456 (
PVOID)BiosDiskEntry,
460 RtlFreeHeap(RtlGetProcessHeap(), 0, BiosDiskEntry);
464 BiosDiskEntry->DiskNumber = DiskCount;
465 BiosDiskEntry->Recognized =
FALSE;
467 if (DiskCount < Int13Drives[0].NumberDrives)
469 BiosDiskEntry->Int13DiskData = Int13Drives[DiskCount];
473 DPRINT1(
"Didn't find int13 drive datas for disk %u\n", DiskCount);
478 DPRINT(
"DiskNumber: %lu\n", BiosDiskEntry->DiskNumber);
479 DPRINT(
"Signature: %08lx\n", BiosDiskEntry->Signature);
480 DPRINT(
"Checksum: %08lx\n", BiosDiskEntry->Checksum);
481 DPRINT(
"BytesPerSector: %lu\n", BiosDiskEntry->DiskGeometry.BytesPerSector);
482 DPRINT(
"NumberOfCylinders: %lu\n", BiosDiskEntry->DiskGeometry.NumberOfCylinders);
483 DPRINT(
"NumberOfHeads: %lu\n", BiosDiskEntry->DiskGeometry.NumberOfHeads);
484 DPRINT(
"DriveSelect: %02x\n", BiosDiskEntry->Int13DiskData.DriveSelect);
485 DPRINT(
"MaxCylinders: %lu\n", BiosDiskEntry->Int13DiskData.MaxCylinders);
486 DPRINT(
"SectorsPerTrack: %d\n", BiosDiskEntry->Int13DiskData.SectorsPerTrack);
487 DPRINT(
"MaxHeads: %d\n", BiosDiskEntry->Int13DiskData.MaxHeads);
488 DPRINT(
"NumberDrives: %d\n", BiosDiskEntry->Int13DiskData.NumberDrives);
511 ULONG PartitionIndex,
525 if (PartEntry ==
NULL)
559 if (CheckFatFormat())
573 if (CheckExt2Format())
587 if (CheckNtfsFormat())
591 else if (CheckHpfsFormat())
621 ULONG PartitionIndex)
633 if (PartEntry ==
NULL)
673 DPRINT(
"ScanForUnpartitionedMbrDiskSpace()\n");
682 DPRINT1(
"No primary partition!\n");
688 if (NewPartEntry ==
NULL)
711 LastStartSector = StartSector;
712 LastSectorCount = 0
ULL;
713 LastUnusedSectorCount = 0
ULL;
723 LastUnusedSectorCount =
729 DPRINT(
"Unpartitioned disk space %I64u sectors\n", LastUnusedSectorCount);
734 if (NewPartEntry ==
NULL)
763 if ((LastStartSector + LastSectorCount) < (EndSector + 1))
765 LastUnusedSectorCount =
AlignDown((EndSector + 1) - (LastStartSector + LastSectorCount), DiskEntry->
SectorAlignment);
769 DPRINT1(
"Unpartitioned disk space: %I64u sectors\n", LastUnusedSectorCount);
774 if (NewPartEntry ==
NULL)
800 DPRINT1(
"No logical partition!\n");
806 if (NewPartEntry ==
NULL)
830 LastSectorCount = 0
ULL;
831 LastUnusedSectorCount = 0
ULL;
841 LastUnusedSectorCount =
847 DPRINT(
"Unpartitioned disk space %I64u sectors\n", LastUnusedSectorCount);
852 if (NewPartEntry ==
NULL)
889 DPRINT(
"Unpartitioned disk space: %I64u sectors\n", LastUnusedSectorCount);
894 if (NewPartEntry ==
NULL)
918 DPRINT(
"ScanForUnpartitionedMbrDiskSpace() done\n");
933 DPRINT(
"ScanForUnpartitionedGptDiskSpace()\n");
935#ifdef DUMP_PARTITION_LIST
936 DumpPartitionList(DiskEntry);
941 DPRINT(
"No partitions!\n");
947 if (NewPartEntry ==
NULL)
965#ifdef DUMP_PARTITION_LIST
966 DumpPartitionList(DiskEntry);
974 LastSectorCount = 0
ULL;
975 LastUnusedSectorCount = 0
ULL;
985 LastUnusedSectorCount =
991 DPRINT(
"Unpartitioned disk space %I64u sectors\n", LastUnusedSectorCount);
996 if (NewPartEntry ==
NULL)
1031 DPRINT(
"Unpartitioned disk space: %I64u sectors\n", LastUnusedSectorCount);
1036 if (NewPartEntry ==
NULL)
1058#ifdef DUMP_PARTITION_LIST
1059 DumpPartitionList(DiskEntry);
1062 DPRINT(
"ScanForUnpartitionedGptDiskSpace() done\n");
1071 ULONG LayoutBufferSize;
1072 PDRIVE_LAYOUT_INFORMATION_EX NewLayoutBuffer;
1077 LayoutBufferSize =
sizeof(DRIVE_LAYOUT_INFORMATION_EX) +
1082 if (DiskEntry->LayoutBuffer ==
NULL)
1084 DPRINT1(
"Failed to allocate the disk layout buffer!\n");
1090 DPRINT1(
"Buffer size: %lu\n", LayoutBufferSize);
1099 DiskEntry->LayoutBuffer,
1106 DPRINT1(
"NtDeviceIoControlFile() failed (Status: 0x%08lx)\n",
Status);
1113 DiskEntry->LayoutBuffer,
1115 if (NewLayoutBuffer ==
NULL)
1117 DPRINT1(
"Failed to reallocate the disk layout buffer!\n");
1121 DiskEntry->LayoutBuffer = NewLayoutBuffer;
1213 for (
i = 0;
i < 128;
i++)
1217 Checksum = ~Checksum + 1;
1226 if (DiskEntry ==
NULL)
1238 DPRINT(
"Partition style: RAW\n");
1245 DPRINT(
"Partition style: GPT\n");
1250 DPRINT(
"Partition style: MBR\n");
1269 BiosDiskEntry->
Checksum == Checksum &&
1282 ListEntry = ListEntry->
Flink;
1291 DPRINT1(
"WARNING: Setup could not find a matching BIOS disk entry. Disk %d is not be bootable by the BIOS!\n", DiskNumber);
1325 DiskEntry->
Lun = ScsiAddress.
Lun;
1335#ifdef DUMP_PARTITION_TABLE
1336 DumpPartitionTable(DiskEntry);
1360 DPRINT1(
"No valid partition table found! Use megabyte (%lu Sectors) alignment!\n", (1024 * 1024) / DiskEntry->
BytesPerSector);
1373 for (
i = 0;
i < 4;
i++)
1378 for (
i = 0;
i < 4;
i++)
1453 for (DiskNumber = 0; DiskNumber < Sdi.
NumberOfDisks; DiskNumber++)
1456 L"\\Device\\Harddisk%d\\Partition0",
1543 RtlFreeHeap(RtlGetProcessHeap(), 0, BiosDiskEntry);
1561 if (pExtents ==
NULL)
1586 if (pExtents ==
NULL)
1610 VolumeEntry->pExtents = pExtents;
1657 ULONG ulVolumeNumber,
1658 PWSTR pszVolumeName)
1668 DWORD CharCount = 0;
1676 DPRINT(
"AddVolumeToList(%S)\n", pszVolumeName);
1681 if (VolumeEntry ==
NULL)
1689 pszVolumeName[
Index] =
L'\0';
1693 pszVolumeName[
Index] =
L'\\';
1752 (3 + 1) *
sizeof(
WCHAR));
1776 ULONG ulVolumeNumber = 0;
1849 ULONG PartitionCount;
1854 DPRINT(
"WriteMbrPartitions() Disk: %lu\n", DiskEntry->DiskNumber);
1857 if (!DiskEntry->Dirty)
1861 L"\\Device\\Harddisk%lu\\Partition0",
1862 DiskEntry->DiskNumber);
1890 PartitionCount = DiskEntry->LayoutBuffer->PartitionCount;
1893 BufferSize =
sizeof(DRIVE_LAYOUT_INFORMATION_EX) +
1901 DiskEntry->LayoutBuffer,
1903 DiskEntry->LayoutBuffer,
1914 DiskEntry->LayoutBuffer->PartitionCount = PartitionCount;
1919 DPRINT1(
"IOCTL_DISK_SET_DRIVE_LAYOUT failed (Status 0x%08lx)\n",
Status);
1926 for (ListEntry = DiskEntry->PrimaryPartListHead.
Flink;
1927 ListEntry != &DiskEntry->PrimaryPartListHead;
1928 ListEntry = ListEntry->
Flink)
1941 for (ListEntry = DiskEntry->LogicalPartListHead.
Flink;
1942 ListEntry != &DiskEntry->LogicalPartListHead;
1943 ListEntry = ListEntry->
Flink)
1956 DiskEntry->Dirty =
FALSE;
1974 DPRINT(
"WriteGptPartitions() Disk: %lu\n", DiskEntry->DiskNumber);
1977 if (!DiskEntry->Dirty)
1981 L"\\Device\\Harddisk%lu\\Partition0",
1982 DiskEntry->DiskNumber);
2010 BufferSize =
sizeof(DRIVE_LAYOUT_INFORMATION_EX) +
2018 DiskEntry->LayoutBuffer,
2020 DiskEntry->LayoutBuffer,
2027 DPRINT1(
"IOCTL_DISK_SET_DRIVE_LAYOUT_EX failed (Status 0x%08lx)\n",
Status);
2032 DiskEntry->Dirty =
FALSE;
2060 if ((
PartitionInfo->StartingOffset.QuadPart == PartEntry->StartSector.QuadPart * DiskEntry->BytesPerSector) &&
2061 (
PartitionInfo->PartitionLength.QuadPart == PartEntry->SectorCount.QuadPart * DiskEntry->BytesPerSector))
2078 for (
Entry = DiskEntry->PrimaryPartListHead.Flink;
2079 Entry != &DiskEntry->PrimaryPartListHead;
2100 for (ListEntry = DiskEntry->LogicalPartListHead.
Flink;
2101 ListEntry != &DiskEntry->LogicalPartListHead;
2102 ListEntry = ListEntry->
Flink)
2118 PDRIVE_LAYOUT_INFORMATION_EX NewLayoutBuffer;
2119 ULONG NewPartitionCount;
2120 ULONG CurrentPartitionCount = 0;
2121 ULONG LayoutBufferSize;
2124 DPRINT1(
"ReAllocateLayoutBuffer()\n");
2128 if (DiskEntry->LayoutBuffer)
2129 CurrentPartitionCount = DiskEntry->LayoutBuffer->PartitionCount;
2131 DPRINT1(
"CurrentPartitionCount: %lu ; NewPartitionCount: %lu\n",
2132 CurrentPartitionCount, NewPartitionCount);
2134 if (CurrentPartitionCount == NewPartitionCount)
2137 LayoutBufferSize =
sizeof(DRIVE_LAYOUT_INFORMATION_EX) +
2141 DiskEntry->LayoutBuffer,
2143 if (NewLayoutBuffer ==
NULL)
2145 DPRINT1(
"Failed to allocate the new layout buffer (size: %lu)\n", LayoutBufferSize);
2149 NewLayoutBuffer->PartitionCount = NewPartitionCount;
2152 if (NewPartitionCount > CurrentPartitionCount)
2154 for (
i = CurrentPartitionCount;
i < NewPartitionCount;
i++)
2156 NewLayoutBuffer->PartitionEntry[
i].RewritePartition =
TRUE;
2160 DiskEntry->LayoutBuffer = NewLayoutBuffer;
2178 DPRINT(
"UpdateMbrDiskLayout()\n");
2183 DPRINT(
"ReAllocateLayoutBuffer() failed.\n");
2191 for (ListEntry = DiskEntry->PrimaryPartListHead.
Flink;
2192 ListEntry != &DiskEntry->PrimaryPartListHead;
2193 ListEntry = ListEntry->
Flink)
2212 DPRINT1(
"Updating primary partition entry %lu\n",
Index);
2236 for (ListEntry = DiskEntry->LogicalPartListHead.
Flink;
2237 ListEntry != &DiskEntry->LogicalPartListHead;
2238 ListEntry = ListEntry->
Flink)
2255 DPRINT1(
"Updating logical partition entry %lu\n",
Index);
2260 PartitionInfo->Mbr.HiddenSectors = DiskEntry->SectorAlignment;
2268 if (LinkInfo !=
NULL)
2273 HiddenSectors64.
QuadPart = PartEntry->
StartSector.
QuadPart - DiskEntry->SectorAlignment - DiskEntry->ExtendedPartition->StartSector.QuadPart;
2283 LinkInfo = &DiskEntry->LayoutBuffer->PartitionEntry[
Index + 1];
2299 DPRINT1(
"Wiping primary partition entry %lu\n",
Index);
2314 for (
Index = 4;
Index < DiskEntry->LayoutBuffer->PartitionCount;
Index++)
2339 DiskEntry->Dirty =
TRUE;
2353 DPRINT(
"UpdateGptDiskLayout()\n");
2357 for (ListEntry = DiskEntry->PrimaryPartListHead.
Flink;
2358 ListEntry != &DiskEntry->PrimaryPartListHead;
2359 ListEntry = ListEntry->
Flink)
2373 if (
Count != DiskEntry->LayoutBuffer->PartitionCount)
2375 PDRIVE_LAYOUT_INFORMATION_EX NewLayoutBuffer;
2376 ULONG NewLayoutBufferSize;
2378 NewLayoutBufferSize =
sizeof(DRIVE_LAYOUT_INFORMATION_EX) +
2382 DiskEntry->LayoutBuffer,
2383 NewLayoutBufferSize);
2384 if (NewLayoutBuffer ==
NULL)
2386 DPRINT1(
"Failed to allocate the new layout buffer (size: %lu)\n", NewLayoutBufferSize);
2390 NewLayoutBuffer->PartitionCount =
Count;
2391 DiskEntry->LayoutBuffer = NewLayoutBuffer;
2396 for (ListEntry = DiskEntry->PrimaryPartListHead.
Flink;
2397 ListEntry != &DiskEntry->PrimaryPartListHead;
2398 ListEntry = ListEntry->
Flink)
2407 DPRINT(
"Updating primary partition entry %lu\n",
Index);
2439 if (PartEntry->LogicalPartition)
2444 if (PartEntry->ListEntry.Blink != ListHead)
2452 return PrevPartEntry;
2468 if (PartEntry->LogicalPartition)
2473 if (PartEntry->ListEntry.Flink != ListHead)
2481 return NextPartEntry;
2502 if (!PartEntry->IsPartitioned ||
2509 PartEntry->PartitionNumber == 0)
2519 L"\\Device\\Harddisk%lu\\Partition%lu",
2520 PartEntry->DiskEntry->DiskNumber,
2521 PartEntry->PartitionNumber);
2538 DPRINT1(
"ERROR: Cannot open volume %wZ for dismounting! (Status 0x%lx)\n", &
Name,
Status);
2555 DPRINT1(
"WARNING: Failed to lock volume! Operations may fail! (Status 0x%lx)\n", LockStatus);
2571 DPRINT1(
"Failed to unmount volume (Status 0x%lx)\n",
Status);
2587 DPRINT1(
"Failed to unlock volume (Status 0x%lx)\n", LockStatus);
2605 if ((PartEntry ==
NULL) ||
2606 (PartEntry->DiskEntry ==
NULL))
2638 if (VolumeEntry ==
NULL)
2646 if (VolumeEntry->pszLabel)
2647 RtlFreeHeap(RtlGetProcessHeap(), 0, VolumeEntry->pszLabel);
2649 if (VolumeEntry->pszFilesystem)
2650 RtlFreeHeap(RtlGetProcessHeap(), 0, VolumeEntry->pszFilesystem);
2652 if (VolumeEntry->pExtents)
2653 RtlFreeHeap(RtlGetProcessHeap(), 0, VolumeEntry->pExtents);
#define FILE_DIRECTORY_FILE
#define PARTITION_ENTRY_UNUSED
#define PARTITION_EXTENDED
#define PARTITION_FAT32_XINT13
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
while(CdLookupNextInitialFileDirent(IrpContext, Fcb, FileContext))
_In_ PFCB _In_ LONGLONG FileOffset
#define IOCTL_DISK_GET_DRIVE_GEOMETRY
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
BOOL WINAPI DeviceIoControl(IN HANDLE hDevice, IN DWORD dwIoControlCode, IN LPVOID lpInBuffer OPTIONAL, IN DWORD nInBufferSize OPTIONAL, OUT LPVOID lpOutBuffer OPTIONAL, IN DWORD nOutBufferSize OPTIONAL, OUT LPDWORD lpBytesReturned OPTIONAL, IN LPOVERLAPPED lpOverlapped OPTIONAL)
#define NT_SUCCESS(StatCode)
#define INVALID_HANDLE_VALUE
static DWORD DWORD * dwLength
DWORD WINAPI QueryDosDeviceW(LPCWSTR lpDeviceName, LPWSTR lpTargetPath, DWORD ucchMax)
BOOL WINAPI FindNextVolumeW(IN HANDLE handle, IN LPWSTR volume, IN DWORD len)
BOOL WINAPI GetVolumeInformationW(IN LPCWSTR lpRootPathName, IN LPWSTR lpVolumeNameBuffer, IN DWORD nVolumeNameSize, OUT LPDWORD lpVolumeSerialNumber OPTIONAL, OUT LPDWORD lpMaximumComponentLength OPTIONAL, OUT LPDWORD lpFileSystemFlags OPTIONAL, OUT LPWSTR lpFileSystemNameBuffer OPTIONAL, IN DWORD nFileSystemNameSize)
HANDLE WINAPI FindFirstVolumeW(IN LPWSTR volume, IN DWORD len)
BOOL WINAPI FindVolumeClose(IN HANDLE hFindVolume)
BOOL WINAPI GetVolumePathNamesForVolumeNameW(IN LPCWSTR lpszVolumeName, IN LPWSTR lpszVolumePathNames, IN DWORD cchBufferLength, OUT PDWORD lpcchReturnLength)
static const WCHAR Signature[]
#define RemoveEntryList(Entry)
#define InsertTailList(ListHead, Entry)
#define IsListEmpty(ListHead)
#define RemoveHeadList(ListHead)
#define InitializeListHead(ListHead)
#define IOCTL_DISK_GET_DRIVE_LAYOUT_EX
@ SystemDeviceInformation
_Must_inspect_result_ _In_opt_ PFLT_INSTANCE _Out_ PHANDLE FileHandle
_Must_inspect_result_ _Out_ PHANDLE VolumeHandle
#define FILE_SYNCHRONOUS_IO_NONALERT
@ FileFsDeviceInformation
#define FILE_OPEN_FOR_BACKUP_INTENT
union Alignment_ Alignment
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
_In_ GUID _In_ PVOID ValueData
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define OBJ_CASE_INSENSITIVE
NTSYSAPI PVOID WINAPI RtlReAllocateHeap(HANDLE, ULONG, PVOID, SIZE_T) __WINE_ALLOC_SIZE(4) __WINE_DEALLOC(RtlFreeHeap
NTSYSAPI NTSTATUS WINAPI RtlQueryRegistryValues(ULONG, PCWSTR, PRTL_QUERY_REGISTRY_TABLE, PVOID, PVOID)
struct _BIOSDISKENTRY * PBIOSDISKENTRY
struct _BIOSDISKENTRY BIOSDISKENTRY
#define InsertAscendingList(ListHead, NewEntry, Type, ListEntryField, SortField)
#define memcpy(s1, s2, n)
struct _PARTITION_INFORMATION_EX PARTITION_INFORMATION_EX
#define InitializeObjectAttributes(p, n, a, r, s)
_In_ PCWSTR _Inout_ _At_ QueryTable EntryContext
_In_ PCWSTR _Inout_ _At_ QueryTable _Pre_unknown_ PRTL_QUERY_REGISTRY_TABLE QueryTable
NTSYSAPI NTSTATUS NTAPI NtOpenFile(OUT PHANDLE phFile, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG ShareMode, IN ULONG OpenMode)
#define FSCTL_LOCK_VOLUME
#define FILE_READ_ATTRIBUTES
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RTL_REGISTRY_ABSOLUTE
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToInteger(PUNICODE_STRING String, ULONG Base, PULONG Value)
NTSYSAPI NTSTATUS NTAPI NtDeviceIoControlFile(IN HANDLE hFile, IN HANDLE hEvent OPTIONAL, IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL, IN PVOID IoApcContext OPTIONAL, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG DeviceIoControlCode, IN PVOID InBuffer OPTIONAL, IN ULONG InBufferLength, OUT PVOID OutBuffer OPTIONAL, IN ULONG OutBufferLength)
#define RTL_REGISTRY_DEVICEMAP
#define RTL_QUERY_REGISTRY_DIRECT
#define FSCTL_UNLOCK_VOLUME
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
#define FSCTL_DISMOUNT_VOLUME
NTSYSAPI NTSTATUS NTAPI NtFsControlFile(IN HANDLE hFile, IN HANDLE hEvent OPTIONAL, IN PIO_APC_ROUTINE IoApcRoutine OPTIONAL, IN PVOID IoApcContext OPTIONAL, OUT PIO_STATUS_BLOCK pIoStatusBlock, IN ULONG DeviceIoControlCode, IN PVOID InBuffer OPTIONAL, IN ULONG InBufferLength, OUT PVOID OutBuffer OPTIONAL, IN ULONG OutBufferLength)
#define FILE_REMOVABLE_MEDIA
#define REG_FULL_RESOURCE_DESCRIPTOR
#define IsContainerPartition(PartitionType)
#define IsRecognizedPartition(PartitionType)
#define IOCTL_DISK_SET_DRIVE_LAYOUT_EX
struct _VOLUME_DISK_EXTENTS VOLUME_DISK_EXTENTS
struct _DISK_EXTENT DISK_EXTENT
#define IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS
static OUT PIO_STATUS_BLOCK IoStatusBlock
#define IsEqualGUID(rguid1, rguid2)
#define FILE_DEVICE_DISK_FILE_SYSTEM
#define FILE_DEVICE_CD_ROM
#define FILE_DEVICE_CD_ROM_FILE_SYSTEM
struct _CM_FULL_RESOURCE_DESCRIPTOR * PCM_FULL_RESOURCE_DESCRIPTOR
#define CmResourceTypeDeviceSpecific
#define IOCTL_SCSI_GET_ADDRESS
static VOID GetDriverName(IN PDISKENTRY DiskEntry)
VOID NTAPI DestroyPartitionList(IN PPARTLIST List)
static BOOLEAN IsSamePrimaryLayoutEntry(_In_ PPARTITION_INFORMATION PartitionInfo, _In_ PPARTENTRY PartEntry)
ULONGLONG AlignDown(IN ULONGLONG Value, IN ULONG Alignment)
static NTSTATUS NTAPI DiskConfigurationDataQueryRoutine(PWSTR ValueName, ULONG ValueType, PVOID ValueData, ULONG ValueLength, PVOID Context, PVOID EntryContext)
static VOID AddDiskToList(IN HANDLE FileHandle, IN ULONG DiskNumber, IN PPARTLIST List)
static NTSTATUS NTAPI SystemConfigurationDataQueryRoutine(PWSTR ValueName, ULONG ValueType, PVOID ValueData, ULONG ValueLength, PVOID Context, PVOID EntryContext)
PPARTLIST NTAPI CreatePartitionList(VOID)
static VOID EnumerateBiosDiskEntries(IN PPARTLIST PartList)
static BOOLEAN IsEmptyLayoutEntry(_In_ PPARTITION_INFORMATION PartitionInfo)
static BOOLEAN ReAllocateLayoutBuffer(IN PDISKENTRY DiskEntry)
#define GetLogicalPartitionCount(DiskEntry)
#define GetPrimaryPartitionCount(DiskEntry)
static NTSTATUS NTAPI DiskIdentifierQueryRoutine(PWSTR ValueName, ULONG ValueType, PVOID ValueData, ULONG ValueLength, PVOID Context, PVOID EntryContext)
NTSTATUS NTAPI NtQueryVolumeInformationFile(HANDLE FileHandle, PIO_STATUS_BLOCK IoStatusBlock, PVOID FsInformation, ULONG Length, FS_INFORMATION_CLASS FsInformationClass)
#define STATUS_BUFFER_TOO_SMALL
NTSTATUS NTAPI NtReadFile(HANDLE FileHandle, HANDLE Event, PIO_APC_ROUTINE ApcRoutine, PVOID ApcContext, PIO_STATUS_BLOCK IoStatusBlock, PVOID Buffer, ULONG Length, PLARGE_INTEGER ByteOffset, PULONG Key)
NTSYSAPI NTSTATUS NTAPI NtQuerySystemInformation(IN SYSTEM_INFORMATION_CLASS SystemInfoClass, OUT PVOID SystemInfoBuffer, IN ULONG SystemInfoBufferSize, OUT PULONG BytesReturned OPTIONAL)
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
base of all file and directory entries
CM_DISK_GEOMETRY_DEVICE_DATA DiskGeometry
CM_PARTIAL_RESOURCE_LIST PartialResourceList
union _CM_PARTIAL_RESOURCE_DESCRIPTOR::@432 u
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR::@432::@441 DeviceSpecificData
CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1]
ULARGE_INTEGER SectorCount
UNICODE_STRING DriverName
PPARTENTRY ExtendedPartition
LIST_ENTRY LogicalPartListHead
ULARGE_INTEGER StartSector
LIST_ENTRY PrimaryPartListHead
PDRIVE_LAYOUT_INFORMATION LayoutBuffer
LARGE_INTEGER StartingOffset
LARGE_INTEGER ExtentLength
struct _LIST_ENTRY * Flink
ULARGE_INTEGER SectorCount
struct _DISKENTRY * DiskEntry
ULONG OnDiskPartitionNumber
ULARGE_INTEGER StartSector
PARTITION Partition[PARTITION_TBL_SIZE]
unsigned char PartitionType
unsigned char EndingSector
unsigned char StartingHead
unsigned int StartingBlock
unsigned char EndingCylinder
unsigned char StartingSector
unsigned char StartingCylinder
PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
PVOLUME_DISK_EXTENTS pExtents
WCHAR VolumeName[MAX_PATH]
LIST_ENTRY ListEntry
Entry in VolumesList.
WCHAR DeviceName[MAX_PATH]
ULONG NumberOfDiskExtents
VOID UpdateMbrDiskLayout(_In_ PDISKENTRY DiskEntry)
VOID RemoveVolume(_In_ PVOLENTRY VolumeEntry)
LIST_ENTRY VolumeListHead
static VOID GetVolumeType(_In_ HANDLE VolumeHandle, _In_ PVOLENTRY VolumeEntry)
struct _PARTITION * PPARTITION
static VOID AddGptPartitionToDisk(ULONG DiskNumber, PDISKENTRY DiskEntry, ULONG PartitionIndex)
LIST_ENTRY BiosDiskListHead
PPARTENTRY GetPrevUnpartitionedEntry(_In_ PPARTENTRY PartEntry)
VOID UpdateGptDiskLayout(_In_ PDISKENTRY DiskEntry, _In_ BOOL DeleteEntry)
VOID DestroyVolumeList(VOID)
struct _PARTITION_SECTOR * PPARTITION_SECTOR
static VOID AddMbrPartitionToDisk(ULONG DiskNumber, PDISKENTRY DiskEntry, ULONG PartitionIndex, BOOLEAN LogicalPartition)
#define PARTITION_TBL_SIZE
static VOID AddVolumeToList(ULONG ulVolumeNumber, PWSTR pszVolumeName)
NTSTATUS CreateVolumeList(VOID)
NTSTATUS WriteMbrPartitions(_In_ PDISKENTRY DiskEntry)
VOID ReadLayoutBuffer(_In_ HANDLE FileHandle, _In_ PDISKENTRY DiskEntry)
struct _PARTITION_SECTOR PARTITION_SECTOR
VOID ScanForUnpartitionedMbrDiskSpace(PDISKENTRY DiskEntry)
PPARTENTRY CurrentPartition
NTSTATUS WriteGptPartitions(_In_ PDISKENTRY DiskEntry)
PVOLENTRY GetVolumeFromPartition(_In_ PPARTENTRY PartEntry)
PPARTENTRY GetNextUnpartitionedEntry(_In_ PPARTENTRY PartEntry)
VOID ScanForUnpartitionedGptDiskSpace(PDISKENTRY DiskEntry)
static VOID GetVolumeExtents(_In_ HANDLE VolumeHandle, _In_ PVOLENTRY VolumeEntry)
struct _PARTITION PARTITION
#define RtlZeroMemory(Destination, Length)
#define CONTAINING_RECORD(address, type, field)
#define STATUS_UNSUCCESSFUL
NTSTATUS DismountVolume(_Inout_ PVOLINFO Volume, _In_ BOOLEAN Force)
Attempts to dismount the designated volume.
_In_ WDFCOLLECTION _In_ ULONG Index
_Must_inspect_result_ _In_ WDFDEVICE _In_ PCUNICODE_STRING KeyName
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _In_ ULONG _Out_opt_ PULONG _Out_opt_ PULONG ValueType
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _In_ ULONG ValueLength
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
DWORD WINAPI GetLastError(void)
_Reserved_ PVOID Reserved
#define ERROR_UNRECOGNIZED_VOLUME
struct _CM_DISK_GEOMETRY_DEVICE_DATA * PCM_DISK_GEOMETRY_DEVICE_DATA
_In_ ULONG _In_ struct _SET_PARTITION_INFORMATION_EX * PartitionInfo
_In_ ULONG _In_ ULONG PartitionNumber