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 104 L"\\Scsi\\Scsi Port %lu",
121 DPRINT1(
"RtlQueryRegistryValues() failed (Status %lx)\n",
Status);
235 if (*Int13Drives ==
NULL)
248 #define ROOT_NAME L"\\Registry\\Machine\\HARDWARE\\DESCRIPTION\\System\\MultifunctionAdapter" 268 L"\\Registry\\Machine\\HARDWARE\\DESCRIPTION\\System",
274 DPRINT1(
"Unable to query the 'Configuration Data' key in '\\Registry\\Machine\\HARDWARE\\DESCRIPTION\\System', status=%lx\n",
Status);
331 if (BiosDiskEntry ==
NULL)
340 (
PVOID)BiosDiskEntry,
344 RtlFreeHeap(RtlGetProcessHeap(), 0, BiosDiskEntry);
348 BiosDiskEntry->DiskNumber = DiskCount;
349 BiosDiskEntry->Recognized =
FALSE;
351 if (DiskCount < Int13Drives[0].NumberDrives)
353 BiosDiskEntry->Int13DiskData = Int13Drives[DiskCount];
357 DPRINT1(
"Didn't find int13 drive datas for disk %u\n", DiskCount);
362 DPRINT(
"DiskNumber: %lu\n", BiosDiskEntry->DiskNumber);
363 DPRINT(
"Signature: %08lx\n", BiosDiskEntry->Signature);
364 DPRINT(
"Checksum: %08lx\n", BiosDiskEntry->Checksum);
365 DPRINT(
"BytesPerSector: %lu\n", BiosDiskEntry->DiskGeometry.BytesPerSector);
366 DPRINT(
"NumberOfCylinders: %lu\n", BiosDiskEntry->DiskGeometry.NumberOfCylinders);
367 DPRINT(
"NumberOfHeads: %lu\n", BiosDiskEntry->DiskGeometry.NumberOfHeads);
368 DPRINT(
"DriveSelect: %02x\n", BiosDiskEntry->Int13DiskData.DriveSelect);
369 DPRINT(
"MaxCylinders: %lu\n", BiosDiskEntry->Int13DiskData.MaxCylinders);
370 DPRINT(
"SectorsPerTrack: %d\n", BiosDiskEntry->Int13DiskData.SectorsPerTrack);
371 DPRINT(
"MaxHeads: %d\n", BiosDiskEntry->Int13DiskData.MaxHeads);
372 DPRINT(
"NumberDrives: %d\n", BiosDiskEntry->Int13DiskData.NumberDrives);
395 ULONG PartitionIndex,
409 if (PartEntry ==
NULL)
443 if (CheckFatFormat())
457 if (CheckExt2Format())
471 if (CheckNtfsFormat())
475 else if (CheckHpfsFormat())
512 DPRINT(
"ScanForUnpartitionedDiskSpace()\n");
516 DPRINT1(
"No primary partition!\n");
522 if (NewPartEntry ==
NULL)
546 LastSectorCount = 0
ULL;
547 LastUnusedSectorCount = 0
ULL;
557 LastUnusedSectorCount =
563 DPRINT(
"Unpartitioned disk space %I64u sectors\n", LastUnusedSectorCount);
568 if (NewPartEntry ==
NULL)
603 DPRINT1(
"Unpartitioned disk space: %I64u sectors\n", LastUnusedSectorCount);
608 if (NewPartEntry ==
NULL)
634 DPRINT1(
"No logical partition!\n");
640 if (NewPartEntry ==
NULL)
664 LastSectorCount = 0
ULL;
665 LastUnusedSectorCount = 0
ULL;
675 LastUnusedSectorCount =
681 DPRINT(
"Unpartitioned disk space %I64u sectors\n", LastUnusedSectorCount);
686 if (NewPartEntry ==
NULL)
723 DPRINT(
"Unpartitioned disk space: %I64u sectors\n", LastUnusedSectorCount);
728 if (NewPartEntry ==
NULL)
752 DPRINT(
"ScanForUnpartitionedDiskSpace() done\n");
770 WCHAR Identifier[20];
776 ULONG LayoutBufferSize;
844 for (
i = 0;
i < 128;
i++)
848 Checksum = ~Checksum + 1;
851 DPRINT(
"Identifier: %S\n", Identifier);
856 if (DiskEntry ==
NULL)
866 if (Mbr->BootCode[0] == 0 && Mbr->BootCode[1] == 0)
885 BiosDiskEntry->
Checksum == Checksum &&
898 ListEntry = ListEntry->
Flink;
907 DPRINT1(
"WARNING: Setup could not find a matching BIOS disk entry. Disk %d is not be bootable by the BIOS!\n", DiskNumber);
952 DPRINT1(
"Failed to allocate the disk layout buffer!\n");
958 DPRINT1(
"Buffer size: %lu\n", LayoutBufferSize);
974 DPRINT1(
"NtDeviceIoControlFile() failed (Status: 0x%08lx)\n",
Status);
983 if (NewLayoutBuffer ==
NULL)
985 DPRINT1(
"Failed to reallocate the disk layout buffer!\n");
994 #ifdef DUMP_PARTITION_TABLE 995 DumpPartitionTable(DiskEntry);
1017 DPRINT1(
"No valid partition table found! Use megabyte (%lu Sectors) alignment!\n", (1024 * 1024) / DiskEntry->
BytesPerSector);
1026 for (
i = 0;
i < 4;
i++)
1031 for (
i = 0;
i < 4;
i++)
1083 for (DiskNumber = 0; DiskNumber < Sdi.
NumberOfDisks; DiskNumber++)
1086 L"\\Device\\Harddisk%d\\Partition0",
1172 RtlFreeHeap(RtlGetProcessHeap(), 0, BiosDiskEntry);
LIST_ENTRY PrimaryPartListHead
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
PPARTLIST CreatePartitionList(VOID)
#define CmResourceTypeDeviceSpecific
_In_ PCWSTR _Inout_ _At_ QueryTable _Pre_unknown_ PRTL_QUERY_REGISTRY_TABLE QueryTable
ULARGE_INTEGER StartSector
NTSYSAPI NTSTATUS NTAPI NtQuerySystemInformation(IN SYSTEM_INFORMATION_CLASS SystemInfoClass, OUT PVOID SystemInfoBuffer, IN ULONG SystemInfoBufferSize, OUT PULONG BytesReturned OPTIONAL)
#define IOCTL_SCSI_GET_ADDRESS
NTSYSAPI NTSTATUS WINAPI RtlQueryRegistryValues(ULONG, PCWSTR, PRTL_QUERY_REGISTRY_TABLE, PVOID, PVOID)
static NTSTATUS NTAPI DiskConfigurationDataQueryRoutine(PWSTR ValueName, ULONG ValueType, PVOID ValueData, ULONG ValueLength, PVOID Context, PVOID EntryContext)
LIST_ENTRY BiosDiskListHead
IN BOOLEAN OUT PSTR Buffer
unsigned char EndingSector
ULARGE_INTEGER SectorCount
struct _PARTITION_SECTOR * PPARTITION_SECTOR
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
#define PARTITION_TBL_SIZE
#define IsContainerPartition(PartitionType)
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR::@385::@394 DeviceSpecificData
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)
struct _CM_DISK_GEOMETRY_DEVICE_DATA * PCM_DISK_GEOMETRY_DEVICE_DATA
#define InsertTailList(ListHead, Entry)
struct _PARTITION_INFORMATION PARTITION_INFORMATION
struct _BIOSDISKENTRY * PBIOSDISKENTRY
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _In_ ULONG _Out_opt_ PULONG _Out_opt_ PULONG ValueType
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
unsigned char EndingCylinder
#define STATUS_BUFFER_TOO_SMALL
PPARTENTRY ExtendedPartition
#define PARTITION_ENTRY_UNUSED
struct _PARTITION * PPARTITION
CM_PARTIAL_RESOURCE_LIST PartialResourceList
static VOID AddDiskToList(HANDLE FileHandle, ULONG DiskNumber)
union _CM_PARTIAL_RESOURCE_DESCRIPTOR::@385 u
PRTL_QUERY_REGISTRY_ROUTINE QueryRoutine
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
static VOID EnumerateBiosDiskEntries(VOID)
struct _BIOSDISKENTRY BIOSDISKENTRY
struct _DRIVE_LAYOUT_INFORMATION DRIVE_LAYOUT_INFORMATION
struct _CM_FULL_RESOURCE_DESCRIPTOR * PCM_FULL_RESOURCE_DESCRIPTOR
union Alignment_ Alignment
_In_ PCWSTR _Inout_ _At_ QueryTable EntryContext
unsigned int StartingBlock
FORCEINLINE PLIST_ENTRY RemoveHeadList(_Inout_ PLIST_ENTRY ListHead)
_Reserved_ PVOID Reserved
#define REG_FULL_RESOURCE_DESCRIPTOR
_Must_inspect_result_ _In_ WDFDEVICE _In_ PCUNICODE_STRING KeyName
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
ULARGE_INTEGER SectorCount
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
struct _LIST_ENTRY * Flink
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)
struct _DISKENTRY * DiskEntry
#define NT_SUCCESS(StatCode)
UNICODE_STRING DriverName
unsigned char StartingCylinder
CM_DISK_GEOMETRY_DEVICE_DATA DiskGeometry
_In_ GUID _In_ PVOID ValueData
_In_ ULONG _In_ struct _SET_PARTITION_INFORMATION_EX * PartitionInfo
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
unsigned char PartitionType
struct _PARTITION PARTITION
ULONGLONG AlignDown(IN ULONGLONG Value, IN ULONG Alignment)
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
#define FILE_READ_ATTRIBUTES
#define STATUS_UNSUCCESSFUL
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING ValueName
CM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptors[1]
#define memcpy(s1, s2, n)
VOID DestroyPartitionList(IN PPARTLIST List)
#define RTL_REGISTRY_ABSOLUTE
#define InsertAscendingList(ListHead, NewEntry, Type, ListEntryField, SortField)
#define IOCTL_DISK_GET_DRIVE_LAYOUT
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
unsigned char StartingHead
_In_ PFCB _In_ LONGLONG FileOffset
#define InitializeListHead(ListHead)
PARTITION Partition[PARTITION_TBL_SIZE]
static VOID GetDriverName(PDISKENTRY DiskEntry)
LIST_ENTRY LogicalPartListHead
#define FILE_SYNCHRONOUS_IO_NONALERT
static VOID AddPartitionToDisk(ULONG DiskNumber, PDISKENTRY DiskEntry, ULONG PartitionIndex, BOOLEAN LogicalPartition)
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToInteger(PUNICODE_STRING String, ULONG Base, PULONG Value)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define RtlZeroMemory(Destination, Length)
NTSYSAPI PVOID WINAPI RtlReAllocateHeap(HANDLE, ULONG, PVOID, SIZE_T)
#define InitializeObjectAttributes(p, n, a, r, s)
struct _PARTITION_SECTOR PARTITION_SECTOR
#define PARTITION_FAT32_XINT13
unsigned char StartingSector
static NTSTATUS NTAPI DiskIdentifierQueryRoutine(PWSTR ValueName, ULONG ValueType, PVOID ValueData, ULONG ValueLength, PVOID Context, PVOID EntryContext)
#define RTL_REGISTRY_DEVICEMAP
static VOID ScanForUnpartitionedDiskSpace(PDISKENTRY DiskEntry)
static const WCHAR Signature[]
PDRIVE_LAYOUT_INFORMATION LayoutBuffer
static NTSTATUS NTAPI SystemConfigurationDataQueryRoutine(PWSTR ValueName, ULONG ValueType, PVOID ValueData, ULONG ValueLength, PVOID Context, PVOID EntryContext)
base of all file and directory entries
#define IOCTL_DISK_GET_DRIVE_GEOMETRY
#define RTL_QUERY_REGISTRY_DIRECT
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)
PPARTENTRY CurrentPartition
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _In_ ULONG ValueLength