17#define InsertAscendingList(ListHead, NewEntry, Type, ListEntryField, SortField)\
21 current = (ListHead)->Flink;\
22 while (current != (ListHead))\
24 if (CONTAINING_RECORD(current, Type, ListEntryField)->SortField >=\
25 (NewEntry)->SortField)\
29 current = current->Flink;\
32 InsertTailList(current, &((NewEntry)->ListEntryField));\
36#define PARTITION_LINUX 0x83
38#define PARTITION_TBL_SIZE 4
40#define MBR_MAGIC 0xAA55
83#ifdef DUMP_PARTITION_TABLE
95 DbgPrint(
"Index Start Length Hidden Nr Type Boot RW\n");
96 DbgPrint(
"----- ------------ ------------ ---------- -- ---- ---- --\n");
98 for (
i = 0;
i < DiskEntry->LayoutBuffer->PartitionCount;
i++)
101 DbgPrint(
" %3lu %12I64u %12I64u %10lu %2lu %2x %c %c\n",
103 PartitionInfo->StartingOffset.QuadPart / DiskEntry->BytesPerSector,
104 PartitionInfo->PartitionLength.QuadPart / DiskEntry->BytesPerSector,
114 DbgPrint(
"Index Start Length Nr RW Type \n");
115 DbgPrint(
"----- ------------ ------------ -- -- --------\n");
116 for (
i = 0;
i < DiskEntry->LayoutBuffer->PartitionCount;
i++)
120 DbgPrint(
" %3lu %12I64u %12I64u %2lu %c %08lx\n",
122 PartitionInfo->StartingOffset.QuadPart / DiskEntry->BytesPerSector,
123 PartitionInfo->PartitionLength.QuadPart / DiskEntry->BytesPerSector,
159 L"\\Scsi\\Scsi Port %lu",
176 DPRINT1(
"RtlQueryRegistryValues() failed (Status %lx)\n",
Status);
290 if (*Int13Drives ==
NULL)
303#define ROOT_NAME L"\\Registry\\Machine\\HARDWARE\\DESCRIPTION\\System\\MultifunctionAdapter"
323 L"\\Registry\\Machine\\HARDWARE\\DESCRIPTION\\System",
329 DPRINT1(
"Unable to query the 'Configuration Data' key in '\\Registry\\Machine\\HARDWARE\\DESCRIPTION\\System', status=%lx\n",
Status);
349 L"%s\\%lu\\DiskController",
ROOT_NAME, AdapterCount);
360 L"%s\\%lu\\DiskController\\0",
ROOT_NAME, AdapterCount);
373 L"%s\\%lu\\DiskController\\0\\DiskPeripheral",
ROOT_NAME, AdapterCount);
390 if (BiosDiskEntry ==
NULL)
396 L"%s\\%lu\\DiskController\\0\\DiskPeripheral\\%lu",
ROOT_NAME, AdapterCount, DiskCount);
400 (
PVOID)BiosDiskEntry,
404 RtlFreeHeap(RtlGetProcessHeap(), 0, BiosDiskEntry);
408 BiosDiskEntry->DiskNumber = DiskCount;
409 BiosDiskEntry->Recognized =
FALSE;
411 if (DiskCount < Int13Drives[0].NumberDrives)
413 BiosDiskEntry->Int13DiskData = Int13Drives[DiskCount];
417 DPRINT1(
"Didn't find int13 drive datas for disk %u\n", DiskCount);
422 DPRINT(
"DiskNumber: %lu\n", BiosDiskEntry->DiskNumber);
423 DPRINT(
"Signature: %08lx\n", BiosDiskEntry->Signature);
424 DPRINT(
"Checksum: %08lx\n", BiosDiskEntry->Checksum);
425 DPRINT(
"BytesPerSector: %lu\n", BiosDiskEntry->DiskGeometry.BytesPerSector);
426 DPRINT(
"NumberOfCylinders: %lu\n", BiosDiskEntry->DiskGeometry.NumberOfCylinders);
427 DPRINT(
"NumberOfHeads: %lu\n", BiosDiskEntry->DiskGeometry.NumberOfHeads);
428 DPRINT(
"DriveSelect: %02x\n", BiosDiskEntry->Int13DiskData.DriveSelect);
429 DPRINT(
"MaxCylinders: %lu\n", BiosDiskEntry->Int13DiskData.MaxCylinders);
430 DPRINT(
"SectorsPerTrack: %d\n", BiosDiskEntry->Int13DiskData.SectorsPerTrack);
431 DPRINT(
"MaxHeads: %d\n", BiosDiskEntry->Int13DiskData.MaxHeads);
432 DPRINT(
"NumberDrives: %d\n", BiosDiskEntry->Int13DiskData.NumberDrives);
455 ULONG PartitionIndex,
469 if (PartEntry ==
NULL)
502 if (CheckFatFormat())
516 if (CheckExt2Format())
530 if (CheckNtfsFormat())
534 else if (CheckHpfsFormat())
571 DPRINT(
"ScanForUnpartitionedDiskSpace()\n");
575 DPRINT1(
"No primary partition!\n");
581 if (NewPartEntry ==
NULL)
605 LastSectorCount = 0
ULL;
606 LastUnusedSectorCount = 0
ULL;
616 LastUnusedSectorCount =
622 DPRINT(
"Unpartitioned disk space %I64u sectors\n", LastUnusedSectorCount);
627 if (NewPartEntry ==
NULL)
662 DPRINT1(
"Unpartitioned disk space: %I64u sectors\n", LastUnusedSectorCount);
667 if (NewPartEntry ==
NULL)
693 DPRINT1(
"No logical partition!\n");
699 if (NewPartEntry ==
NULL)
723 LastSectorCount = 0
ULL;
724 LastUnusedSectorCount = 0
ULL;
734 LastUnusedSectorCount =
740 DPRINT(
"Unpartitioned disk space %I64u sectors\n", LastUnusedSectorCount);
745 if (NewPartEntry ==
NULL)
782 DPRINT(
"Unpartitioned disk space: %I64u sectors\n", LastUnusedSectorCount);
787 if (NewPartEntry ==
NULL)
811 DPRINT(
"ScanForUnpartitionedDiskSpace() done\n");
820 ULONG LayoutBufferSize;
821 PDRIVE_LAYOUT_INFORMATION_EX NewLayoutBuffer;
826 LayoutBufferSize =
sizeof(DRIVE_LAYOUT_INFORMATION_EX) +
831 if (DiskEntry->LayoutBuffer ==
NULL)
833 DPRINT1(
"Failed to allocate the disk layout buffer!\n");
839 DPRINT1(
"Buffer size: %lu\n", LayoutBufferSize);
848 DiskEntry->LayoutBuffer,
855 DPRINT1(
"NtDeviceIoControlFile() failed (Status: 0x%08lx)\n",
Status);
862 DiskEntry->LayoutBuffer,
864 if (NewLayoutBuffer ==
NULL)
866 DPRINT1(
"Failed to reallocate the disk layout buffer!\n");
870 DiskEntry->LayoutBuffer = NewLayoutBuffer;
961 for (
i = 0;
i < 128;
i++)
965 Checksum = ~Checksum + 1;
974 if (DiskEntry ==
NULL)
986 DPRINT(
"Partition style: RAW\n");
993 DPRINT(
"Partition style: GPT\n");
998 DPRINT(
"Partition style: MBR\n");
1017 BiosDiskEntry->
Checksum == Checksum &&
1030 ListEntry = ListEntry->
Flink;
1039 DPRINT1(
"WARNING: Setup could not find a matching BIOS disk entry. Disk %d is not be bootable by the BIOS!\n", DiskNumber);
1073 DiskEntry->
Lun = ScsiAddress.
Lun;
1083#ifdef DUMP_PARTITION_TABLE
1084 DumpPartitionTable(DiskEntry);
1106 DPRINT1(
"No valid partition table found! Use megabyte (%lu Sectors) alignment!\n", (1024 * 1024) / DiskEntry->
BytesPerSector);
1115 for (
i = 0;
i < 4;
i++)
1120 for (
i = 0;
i < 4;
i++)
1172 for (DiskNumber = 0; DiskNumber < Sdi.
NumberOfDisks; DiskNumber++)
1175 L"\\Device\\Harddisk%d\\Partition0",
1262 RtlFreeHeap(RtlGetProcessHeap(), 0, BiosDiskEntry);
1280 if (pExtents ==
NULL)
1305 if (pExtents ==
NULL)
1329 VolumeEntry->pExtents = pExtents;
1376 ULONG ulVolumeNumber,
1377 PWSTR pszVolumeName)
1387 DWORD CharCount = 0;
1395 DPRINT(
"AddVolumeToList(%S)\n", pszVolumeName);
1400 if (VolumeEntry ==
NULL)
1408 pszVolumeName[
Index] =
L'\0';
1412 pszVolumeName[
Index] =
L'\\';
1471 (3 + 1) *
sizeof(
WCHAR));
1495 ULONG ulVolumeNumber = 0;
1568 ULONG PartitionCount;
1573 DPRINT(
"WritePartitions() Disk: %lu\n", DiskEntry->DiskNumber);
1576 if (!DiskEntry->Dirty)
1580 L"\\Device\\Harddisk%lu\\Partition0",
1581 DiskEntry->DiskNumber);
1609 PartitionCount = DiskEntry->LayoutBuffer->PartitionCount;
1612 BufferSize =
sizeof(DRIVE_LAYOUT_INFORMATION_EX) +
1620 DiskEntry->LayoutBuffer,
1622 DiskEntry->LayoutBuffer,
1633 DiskEntry->LayoutBuffer->PartitionCount = PartitionCount;
1638 DPRINT1(
"IOCTL_DISK_SET_DRIVE_LAYOUT failed (Status 0x%08lx)\n",
Status);
1645 for (ListEntry = DiskEntry->PrimaryPartListHead.
Flink;
1646 ListEntry != &DiskEntry->PrimaryPartListHead;
1647 ListEntry = ListEntry->
Flink)
1660 for (ListEntry = DiskEntry->LogicalPartListHead.
Flink;
1661 ListEntry != &DiskEntry->LogicalPartListHead;
1662 ListEntry = ListEntry->
Flink)
1675 DiskEntry->Dirty =
FALSE;
1703 if ((
PartitionInfo->StartingOffset.QuadPart == PartEntry->StartSector.QuadPart * DiskEntry->BytesPerSector) &&
1704 (
PartitionInfo->PartitionLength.QuadPart == PartEntry->SectorCount.QuadPart * DiskEntry->BytesPerSector))
1721 for (
Entry = DiskEntry->PrimaryPartListHead.Flink;
1722 Entry != &DiskEntry->PrimaryPartListHead;
1743 for (ListEntry = DiskEntry->LogicalPartListHead.
Flink;
1744 ListEntry != &DiskEntry->LogicalPartListHead;
1745 ListEntry = ListEntry->
Flink)
1761 PDRIVE_LAYOUT_INFORMATION_EX NewLayoutBuffer;
1762 ULONG NewPartitionCount;
1763 ULONG CurrentPartitionCount = 0;
1764 ULONG LayoutBufferSize;
1767 DPRINT1(
"ReAllocateLayoutBuffer()\n");
1771 if (DiskEntry->LayoutBuffer)
1772 CurrentPartitionCount = DiskEntry->LayoutBuffer->PartitionCount;
1774 DPRINT1(
"CurrentPartitionCount: %lu ; NewPartitionCount: %lu\n",
1775 CurrentPartitionCount, NewPartitionCount);
1777 if (CurrentPartitionCount == NewPartitionCount)
1780 LayoutBufferSize =
sizeof(DRIVE_LAYOUT_INFORMATION_EX) +
1784 DiskEntry->LayoutBuffer,
1786 if (NewLayoutBuffer ==
NULL)
1788 DPRINT1(
"Failed to allocate the new layout buffer (size: %lu)\n", LayoutBufferSize);
1792 NewLayoutBuffer->PartitionCount = NewPartitionCount;
1795 if (NewPartitionCount > CurrentPartitionCount)
1797 for (
i = CurrentPartitionCount;
i < NewPartitionCount;
i++)
1799 NewLayoutBuffer->PartitionEntry[
i].RewritePartition =
TRUE;
1803 DiskEntry->LayoutBuffer = NewLayoutBuffer;
1821 DPRINT1(
"UpdateDiskLayout()\n");
1826 DPRINT(
"ReAllocateLayoutBuffer() failed.\n");
1834 for (ListEntry = DiskEntry->PrimaryPartListHead.
Flink;
1835 ListEntry != &DiskEntry->PrimaryPartListHead;
1836 ListEntry = ListEntry->
Flink)
1855 DPRINT1(
"Updating primary partition entry %lu\n",
Index);
1879 for (ListEntry = DiskEntry->LogicalPartListHead.
Flink;
1880 ListEntry != &DiskEntry->LogicalPartListHead;
1881 ListEntry = ListEntry->
Flink)
1898 DPRINT1(
"Updating logical partition entry %lu\n",
Index);
1903 PartitionInfo->Mbr.HiddenSectors = DiskEntry->SectorAlignment;
1911 if (LinkInfo !=
NULL)
1916 HiddenSectors64.
QuadPart = PartEntry->
StartSector.
QuadPart - DiskEntry->SectorAlignment - DiskEntry->ExtendedPartition->StartSector.QuadPart;
1926 LinkInfo = &DiskEntry->LayoutBuffer->PartitionEntry[
Index + 1];
1942 DPRINT1(
"Wiping primary partition entry %lu\n",
Index);
1957 for (
Index = 4;
Index < DiskEntry->LayoutBuffer->PartitionCount;
Index++)
1982 DiskEntry->Dirty =
TRUE;
1994 if (PartEntry->LogicalPartition)
1999 if (PartEntry->ListEntry.Blink != ListHead)
2007 return PrevPartEntry;
2023 if (PartEntry->LogicalPartition)
2028 if (PartEntry->ListEntry.Flink != ListHead)
2036 return NextPartEntry;
2057 if (!PartEntry->IsPartitioned ||
2064 PartEntry->PartitionNumber == 0)
2074 L"\\Device\\Harddisk%lu\\Partition%lu",
2075 PartEntry->DiskEntry->DiskNumber,
2076 PartEntry->PartitionNumber);
2093 DPRINT1(
"ERROR: Cannot open volume %wZ for dismounting! (Status 0x%lx)\n", &
Name,
Status);
2110 DPRINT1(
"WARNING: Failed to lock volume! Operations may fail! (Status 0x%lx)\n", LockStatus);
2126 DPRINT1(
"Failed to unmount volume (Status 0x%lx)\n",
Status);
2142 DPRINT1(
"Failed to unlock volume (Status 0x%lx)\n", LockStatus);
2160 if ((PartEntry ==
NULL) ||
2161 (PartEntry->DiskEntry ==
NULL))
2193 if (VolumeEntry ==
NULL)
2201 if (VolumeEntry->pszLabel)
2202 RtlFreeHeap(RtlGetProcessHeap(), 0, VolumeEntry->pszLabel);
2204 if (VolumeEntry->pszFilesystem)
2205 RtlFreeHeap(RtlGetProcessHeap(), 0, VolumeEntry->pszFilesystem);
2207 if (VolumeEntry->pExtents)
2208 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 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 AddPartitionToDisk(IN ULONG DiskNumber, IN PDISKENTRY DiskEntry, IN ULONG PartitionIndex, IN BOOLEAN LogicalPartition)
static VOID GetDriverName(IN PDISKENTRY DiskEntry)
static VOID UpdateDiskLayout(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 VOID ScanForUnpartitionedDiskSpace(IN PDISKENTRY DiskEntry)
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 WritePartitions(IN PDISKENTRY DiskEntry)
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
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR::@430::@439 DeviceSpecificData
union _CM_PARTIAL_RESOURCE_DESCRIPTOR::@430 u
CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1]
ULARGE_INTEGER SectorCount
UNICODE_STRING DriverName
PPARTENTRY ExtendedPartition
LIST_ENTRY LogicalPartListHead
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 RemoveVolume(_In_ PVOLENTRY VolumeEntry)
LIST_ENTRY VolumeListHead
static VOID GetVolumeType(_In_ HANDLE VolumeHandle, _In_ PVOLENTRY VolumeEntry)
struct _PARTITION * PPARTITION
LIST_ENTRY BiosDiskListHead
PPARTENTRY GetPrevUnpartitionedEntry(_In_ PPARTENTRY PartEntry)
VOID DestroyVolumeList(VOID)
struct _PARTITION_SECTOR * PPARTITION_SECTOR
#define PARTITION_TBL_SIZE
static VOID AddVolumeToList(ULONG ulVolumeNumber, PWSTR pszVolumeName)
NTSTATUS CreateVolumeList(VOID)
VOID ReadLayoutBuffer(_In_ HANDLE FileHandle, _In_ PDISKENTRY DiskEntry)
struct _PARTITION_SECTOR PARTITION_SECTOR
PPARTENTRY CurrentPartition
PVOLENTRY GetVolumeFromPartition(_In_ PPARTENTRY PartEntry)
PPARTENTRY GetNextUnpartitionedEntry(_In_ PPARTENTRY PartEntry)
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