21#define EFI_PMBR_OSTYPE_EFI 0xEE
230 if (LayoutInfo ==
NULL)
276 if (LayoutInfo ==
NULL)
286 if (LayoutInfo->PartitionEntry[
i].StartingOffset.QuadPart ==
PartitionInfo.StartingOffset.QuadPart)
332 sizeof(
ULONG) * DiskCount,
340 for (
i = 0;
i < DiskCount; ++
i)
401 for (
i = 0;
i < DiskCount; ++
i)
404 for (
j = 0;
j < DiskCount; ++
j)
416 while (Devices[
k] != -1)
418 if (++
k >= DiskCount)
621 if (NtDeviceName ==
NULL || NtSystemPath ==
NULL)
638 for (
i = DriveLetter;
i <=
'Z'; ++
i)
656 for (
i = DriveLetter;
i <=
'Z'; ++
i)
907 ULONG i,
Increment, DiskCount, RealDiskCount, HarddiskCount, PartitionCount;
910 WCHAR Buffer[
sizeof(
"\\Device\\Harddisk4294967295\\Partition4294967295")];
933 Last =
strrchr(LoaderBlock->NtBootPathName,
'\\');
947 Last =
strrchr(LoaderBlock->NtBootPathName,
'\\');
958 NtSystemPath[0] =
'X';
959 NtSystemPath[1] =
':';
975 for (
i = 0;
i < DiskCount; ++
i)
997 swprintf(Buffer2,
L"\\DosDevices\\PhysicalDrive%d",
i);
1003 RealDiskCount =
i + 1;
1020 if (LoaderBlock->LoadOptions !=
NULL)
1021 LoadOptions =
_strupr(LoaderBlock->LoadOptions);
1027 if (LoadOptions !=
NULL &&
1032 *NtSystemPath =
'X';
1039 DiskCount =
max(DiskCount, RealDiskCount);
1044 for (
i = 0;
i < DiskCount; ++
i)
1047 HarddiskCount = (Devices ? Devices[
i] :
i);
1057 BootableFound =
FALSE;
1058 for (PartitionCount = 1; ; ++PartitionCount)
1060 swprintf(
Buffer,
L"\\Device\\Harddisk%d\\Partition%d", HarddiskCount, PartitionCount);
1072 BootableFound =
TRUE;
1085 for (PartitionCount = 1; ; ++PartitionCount)
1087 swprintf(
Buffer,
L"\\Device\\Harddisk%d\\Partition%d", HarddiskCount, PartitionCount);
1103 if (LayoutInfo !=
NULL)
1108 for (
i = 0;
i < DiskCount; ++
i)
1111 HarddiskCount = (Devices ? Devices[
i] :
i);
1121 for (PartitionCount = 1; ; ++PartitionCount)
1123 swprintf(
Buffer,
L"\\Device\\Harddisk%d\\Partition%d", HarddiskCount, PartitionCount);
1136 if (LayoutInfo !=
NULL)
1141 for (
i = 0;
i < DiskCount; ++
i)
1144 HarddiskCount = (Devices ? Devices[
i] :
i);
1155 for (PartitionCount = 1; ; ++PartitionCount)
1157 swprintf(
Buffer,
L"\\Device\\Harddisk%d\\Partition%d", HarddiskCount, PartitionCount);
1166 SkipPartition = PartitionCount;
1171 for (PartitionCount = 1; ; ++PartitionCount)
1173 if (PartitionCount == SkipPartition)
1176 swprintf(
Buffer,
L"\\Device\\Harddisk%d\\Partition%d", HarddiskCount, PartitionCount);
1189 if (LayoutInfo !=
NULL)
1194 if (Devices !=
NULL)
1227 if (DriveLetter != 0)
1229 if (DriveLetter != 0xFF)
1230 *NtSystemPath = DriveLetter;
1246 if (DriveLetter >
'Z')
1252 if (DriveLetter >
'Z')
1260 *NtSystemPath = DriveLetter;
1340 if (EndingSector > MaxSector)
1343 DPRINT1(
"FSTUB: entry is invalid\n");
1346 DPRINT1(
"FSTUB: end %#I64x\n", EndingSector);
1347 DPRINT1(
"FSTUB: max %#I64x\n", MaxSector);
1353 DPRINT1(
"FSTUB: entry is invalid\n");
1356 DPRINT1(
"FSTUB: end %#I64x\n", EndingSector);
1357 DPRINT1(
"FSTUB: maxOffset %#I64x\n", MaxOffset);
1377 ULONG StartingCylinder, EndingCylinder;
1378 ULONG StartingTrack, EndingTrack;
1379 ULONG StartingSector, EndingSector;
1387 FirstSector.
QuadPart = PartitionOffset->QuadPart >> ShiftCount;
1388 SectorCount.QuadPart = PartitionLength->QuadPart >> ShiftCount;
1394 StartingCylinder = FirstSector.
LowPart / SectorsPerCylinder;
1395 EndingCylinder = LastSector / SectorsPerCylinder;
1398 if (!ConventionalCylinders) ConventionalCylinders = 1024;
1401 if (StartingCylinder >= ConventionalCylinders)
1404 StartingCylinder = ConventionalCylinders - 1;
1406 if (EndingCylinder >= ConventionalCylinders)
1409 EndingCylinder = ConventionalCylinders - 1;
1418 Remainder = LastSector % SectorsPerCylinder;
1423 PartitionDescriptor->StartingCylinderMsb = (
UCHAR)StartingCylinder;
1424 PartitionDescriptor->EndingCylinderMsb = (
UCHAR)EndingCylinder;
1427 PartitionDescriptor->StartingTrack = (
UCHAR)StartingTrack;
1428 PartitionDescriptor->EndingTrack = (
UCHAR)EndingTrack;
1431 StartingCylinder = ((StartingSector + 1) & 0x3F) |
1432 ((StartingCylinder >> 2) & 0xC0);
1433 EndingCylinder = ((EndingSector + 1) & 0x3F) |
1434 ((EndingCylinder >> 2) & 0xC0);
1437 PartitionDescriptor->StartingCylinderLsb = (
UCHAR)StartingCylinder;
1438 PartitionDescriptor->EndingCylinderLsb = (
UCHAR)EndingCylinder;
1454 *ConventionalCylinders = 0;
1461 if (!DiskGeometry)
goto Cleanup;
1509 *ConventionalCylinders = 1024;
1604 if (PartitionDescriptor->
PartitionType != MbrTypeIdentifier)
1638 ULONG PartitionMaxOffset, PartitionLength;
1644 if (PartitionMaxOffset > MaxOffset)
1671 LONGLONG EndSector, MaxSector, StartOffset;
1714 MaxSector = EndSector << 1;
1715 DPRINT(
"FSTUB: DiskSize = %#I64x, MaxSector = %#I64x\n",
1716 DiskGeometryEx.
DiskSize, MaxSector);
1771 if (IsEzDrive && (
Offset.QuadPart == 512))
Offset.QuadPart = 0;
1777 DPRINT1(
"FSTUB: (IoReadPartitionTable) No 0xaa55 found in "
1778 "partition table %d\n",
j + 1);
1797 DPRINT(
"FSTUB: Partition Table %d:\n",
j);
1804 DPRINT(
"Partition Entry %d,%d: type %#x %s\n",
1808 (PartitionDescriptor->
ActiveFlag) ?
"Active" :
"");
1809 DPRINT(
"\tOffset %#08lx for %#08lx Sectors\n",
1823 MaxSector)) && (
j == 0))
1837 DPRINT1(
"FSTUB: Multiple container partitions found in "
1838 "partition table %d\n - table is invalid\n",
1878 if (!DriveLayoutInfo)
1915 StartOffset = VolumeOffset.
QuadPart;
1921 StartOffset =
Offset.QuadPart;
1989 if (IsPrimary) VolumeOffset =
Offset;
1993 DPRINT1(
"FSTUB: MaxSector now = %I64d\n", MaxSector);
2004 (
j == 0) && (MbrFound) && (
IsEmpty))
2009 if ((BootSectorInfo->
JumpByte[0] == 0xeb) ||
2010 (BootSectorInfo->
JumpByte[0] == 0xe9))
2013 DPRINT1(
"FSTUB: Jump byte %#x found along with empty partition "
2014 "table - disk is a super floppy and has no valid MBR\n",
2027 DPRINT1(
"FSTUB: Drive %#p has no valid MBR. Make it into a "
2030 DPRINT1(
"FSTUB: Drive has %I64d sectors and is %#016I64x "
2032 EndSector, DiskGeometryEx.
DiskSize);
2053 (*PartitionBuffer)->Signature = 1;
2065 (*PartitionBuffer)->PartitionCount = ++
i;
2068 if (!
i) (*PartitionBuffer)->Signature = 0;
2163 if (IsEzDrive && (
Offset.QuadPart == 512))
Offset.QuadPart = 0;
2247 if (IsPrimary) VolumeOffset =
Offset;
2290 ULONG ConventionalCylinders;
2396 if (IsEzDrive && (
Offset.QuadPart == 512))
Offset.QuadPart = 0;
2472 ConventionalCylinders,
2479 Entry[
j].StartingSector = 0;
2480 Entry[
j].PartitionLength = 0;
2481 Entry[
j].StartingTrack = 0;
2482 Entry[
j].EndingTrack = 0;
2483 Entry[
j].StartingCylinder = 0;
2484 Entry[
j].EndingCylinder = 0;
2507 if (IsEzDrive && !
Offset.QuadPart)
Offset.QuadPart = 512;
2545 if (IsEzDrive && (
Offset.QuadPart == 512))
Offset.QuadPart = 0;
2550 if (IsMbr) ExtendedOffset = NextOffset;
2639 NtSystemPathString);
DECLSPEC_NORETURN VOID NTAPI KeBugCheck(ULONG BugCheckCode)
_In_ PFCB _In_ LONGLONG StartingOffset
#define IOCTL_DISK_GET_DRIVE_GEOMETRY
_In_ PCHAR _In_ ULONG DeviceNumber
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
static NTSTATUS HalpQueryDriveLayout(_In_ PUNICODE_STRING DeviceName, _Outptr_ PDRIVE_LAYOUT_INFORMATION *LayoutInfo)
enum _PARTITION_TYPE PARTITION_TYPE
VOID FASTCALL IoAssignDriveLetters(IN PLOADER_PARAMETER_BLOCK LoaderBlock, IN PSTRING NtDeviceName, OUT PUCHAR NtSystemPath, OUT PSTRING NtSystemPathString)
NTSTATUS FASTCALL xHalIoReadPartitionTable(IN PDEVICE_OBJECT DeviceObject, IN ULONG SectorSize, IN BOOLEAN ReturnRecognizedPartitions, OUT PDRIVE_LAYOUT_INFORMATION *PartitionBuffer)
enum _PARTITION_TYPE * PPARTITION_TYPE
static VOID HalpEnableAutomaticDriveLetterAssignment(VOID)
static VOID HalpCalculateChsValues(_In_ PLARGE_INTEGER PartitionOffset, _In_ PLARGE_INTEGER PartitionLength, _In_ CCHAR ShiftCount, _In_ ULONG SectorsPerTrack, _In_ ULONG NumberOfTracks, _In_ ULONG ConventionalCylinders, _Out_ PPARTITION_DESCRIPTOR PartitionDescriptor)
VOID FASTCALL xHalIoAssignDriveLetters(IN PLOADER_PARAMETER_BLOCK LoaderBlock, IN PSTRING NtDeviceName, OUT PUCHAR NtSystemPath, OUT PSTRING NtSystemPathString)
static PULONG IopComputeHarddiskDerangements(_In_ ULONG DiskCount)
static BOOLEAN HalpIsValidPartitionEntry(_In_ PPARTITION_DESCRIPTOR Entry, _In_ ULONGLONG MaxOffset, _In_ ULONGLONG MaxSector)
VOID FASTCALL xHalGetPartialGeometry(IN PDEVICE_OBJECT DeviceObject, IN PULONG ConventionalCylinders, IN PLONGLONG DiskSize)
NTSTATUS FASTCALL IoWritePartitionTable(IN PDEVICE_OBJECT DeviceObject, IN ULONG SectorSize, IN ULONG SectorsPerTrack, IN ULONG NumberOfHeads, IN PDRIVE_LAYOUT_INFORMATION PartitionBuffer)
VOID NTAPI FstubFixupEfiPartition(IN PPARTITION_DESCRIPTOR PartitionDescriptor, IN ULONGLONG MaxOffset)
VOID FASTCALL xHalExamineMBR(IN PDEVICE_OBJECT DeviceObject, IN ULONG SectorSize, IN ULONG MbrTypeIdentifier, OUT PVOID *MbrBuffer)
static NTSTATUS HalpSetMountLetter(_In_ PUNICODE_STRING DeviceName, _In_ UCHAR DriveLetter)
NTSTATUS FASTCALL xHalIoSetPartitionInformation(IN PDEVICE_OBJECT DeviceObject, IN ULONG SectorSize, IN ULONG PartitionNumber, IN ULONG PartitionType)
static const UNICODE_STRING CdPrefix
#define EFI_PMBR_OSTYPE_EFI
enum _DISK_MANAGER DISK_MANAGER
static const UNICODE_STRING FloppyPrefix
static NTSTATUS HalpGetFullGeometry(_In_ PDEVICE_OBJECT DeviceObject, _Out_ PDISK_GEOMETRY_EX Geometry)
static BOOLEAN HalpIsOldStyleFloppy(_In_ PUNICODE_STRING DeviceName)
static NTSTATUS HalpNextMountLetter(_In_ PUNICODE_STRING DeviceName, _Out_ PUCHAR DriveLetter)
NTSTATUS FASTCALL IoSetPartitionInformation(IN PDEVICE_OBJECT DeviceObject, IN ULONG SectorSize, IN ULONG PartitionNumber, IN ULONG PartitionType)
NTSTATUS FASTCALL IoReadPartitionTable(IN PDEVICE_OBJECT DeviceObject, IN ULONG SectorSize, IN BOOLEAN ReturnRecognizedPartitions, OUT PDRIVE_LAYOUT_INFORMATION *PartitionBuffer)
static NTSTATUS HalpDeleteMountLetter(_In_ UCHAR DriveLetter)
static NTSTATUS HalpQueryPartitionType(_In_ PUNICODE_STRING DeviceName, _In_opt_ PDRIVE_LAYOUT_INFORMATION LayoutInfo, _Out_ PPARTITION_TYPE PartitionType)
static UCHAR HalpNextDriveLetter(_In_ PUNICODE_STRING DeviceName, _In_ PSTRING NtDeviceName, _Out_ PUCHAR NtSystemPath, _In_ BOOLEAN IsRemovable)
NTSTATUS FASTCALL xHalIoWritePartitionTable(IN PDEVICE_OBJECT DeviceObject, IN ULONG SectorSize, IN ULONG SectorsPerTrack, IN ULONG NumberOfHeads, IN PDRIVE_LAYOUT_INFORMATION PartitionBuffer)
#define NT_SUCCESS(StatCode)
#define RTL_CONSTANT_STRING(s)
_ACRTIMP size_t __cdecl strlen(const char *)
_ACRTIMP char *__cdecl strstr(const char *, const char *)
_ACRTIMP char *__cdecl strrchr(const char *, int)
static const WCHAR Cleanup[]
#define ExAllocatePoolWithTag(hernya, size, tag)
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
#define KeInitializeEvent(pEvt, foo, foo2)
#define NonPagedPoolCacheAligned
VOID NTAPI KeClearEvent(IN PKEVENT Event)
#define BooleanFlagOn(F, SF)
IN OUT PLONG IN OUT PLONG Addend IN OUT PLONG IN LONG Increment
#define IOCTL_DISK_GET_DRIVE_GEOMETRY_EX
#define IOCTL_DISK_GET_PARTITION_INFO_EX
_Must_inspect_result_ _In_opt_ PFLT_INSTANCE _Out_ PHANDLE FileHandle
#define FILE_SYNCHRONOUS_IO_NONALERT
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
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 GLint GLint j
#define UInt32x32To64(a, b)
PCONFIGURATION_INFORMATION NTAPI IoGetConfigurationInformation(VOID)
Returns a pointer to the I/O manager's global configuration information structure.
#define ExFreePoolWithTag(_P, _T)
#define IOCTL_MOUNTMGR_DELETE_POINTS
#define IOCTL_MOUNTDEV_QUERY_DEVICE_NAME
struct _MOUNTMGR_CREATE_POINT_INPUT MOUNTMGR_CREATE_POINT_INPUT
struct _MOUNTMGR_MOUNT_POINT MOUNTMGR_MOUNT_POINT
#define IOCTL_MOUNTMGR_CREATE_POINT
#define InitializeObjectAttributes(p, n, a, r, s)
#define IOCTL_MOUNTMGR_AUTO_DL_ASSIGNMENTS
#define IOCTL_MOUNTMGR_NEXT_DRIVE_LETTER
NTSYSAPI NTSTATUS NTAPI ZwOpenFile(_Out_ PHANDLE FileHandle, _In_ ACCESS_MASK DesiredAccess, _In_ POBJECT_ATTRIBUTES ObjectAttributes, _Out_ PIO_STATUS_BLOCK IoStatusBlock, _In_ ULONG ShareAccess, _In_ ULONG OpenOptions)
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
NTSYSAPI VOID NTAPI RtlInitString(PSTRING DestinationString, PCSZ SourceString)
#define FILE_READ_ATTRIBUTES
NTSYSAPI NTSTATUS NTAPI RtlAnsiStringToUnicodeString(PUNICODE_STRING DestinationString, PANSI_STRING SourceString, BOOLEAN AllocateDestinationString)
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSYSAPI BOOLEAN NTAPI RtlEqualUnicodeString(PUNICODE_STRING String1, PUNICODE_STRING String2, BOOLEAN CaseInSensitive)
NTSYSAPI VOID NTAPI RtlFreeUnicodeString(PUNICODE_STRING UnicodeString)
NTSYSAPI BOOLEAN NTAPI RtlPrefixUnicodeString(IN PUNICODE_STRING String1, IN PUNICODE_STRING String2, IN BOOLEAN CaseInSensitive)
#define FILE_REMOVABLE_MEDIA
__GNU_EXTENSION typedef __int64 * PLONGLONG
#define IsFTPartition(PartitionType)
#define PARTITION_EZDRIVE
#define IsContainerPartition(PartitionType)
#define IsRecognizedPartition(PartitionType)
#define IOCTL_DISK_GET_DRIVE_LAYOUT
_In_ ULONG _In_ ULONG Offset
static OUT PIO_STATUS_BLOCK IoStatusBlock
BOOLEAN IoRemoteBootClient
struct _PARTITION_DESCRIPTOR * PPARTITION_DESCRIPTOR
struct _DISK_LAYOUT * PDISK_LAYOUT
#define PARTITION_TABLE_OFFSET
#define BOOT_SIGNATURE_OFFSET
#define DISK_SIGNATURE_OFFSET
#define SET_PARTITION_LENGTH(p, l)
#define GET_PARTITION_LENGTH(p)
#define GET_STARTING_SECTOR(p)
struct _BOOT_SECTOR_INFO * PBOOT_SECTOR_INFO
#define NUM_PARTITION_TABLE_ENTRIES
NTSTATUS NTAPI IoGetDeviceObjectPointer(IN PUNICODE_STRING ObjectName, IN ACCESS_MASK DesiredAccess, OUT PFILE_OBJECT *FileObject, OUT PDEVICE_OBJECT *DeviceObject)
PDEVICE_OBJECT NTAPI IoGetAttachedDeviceReference(PDEVICE_OBJECT DeviceObject)
PIRP NTAPI IoBuildSynchronousFsdRequest(IN ULONG MajorFunction, IN PDEVICE_OBJECT DeviceObject, IN PVOID Buffer, IN ULONG Length, IN PLARGE_INTEGER StartingOffset, IN PKEVENT Event, IN PIO_STATUS_BLOCK IoStatusBlock)
PIRP NTAPI IoBuildDeviceIoControlRequest(IN ULONG IoControlCode, IN PDEVICE_OBJECT DeviceObject, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, IN BOOLEAN InternalDeviceIoControl, IN PKEVENT Event, IN PIO_STATUS_BLOCK IoStatusBlock)
NTSTATUS NTAPI IoCreateSymbolicLink(IN PUNICODE_STRING SymbolicLinkName, IN PUNICODE_STRING DeviceName)
#define STATUS_BAD_MASTER_BOOT_RECORD
#define PARTITION_ENTRY_UNUSED
#define BOOT_RECORD_SIGNATURE
#define IsEqualGUID(rguid1, rguid2)
#define IOCTL_STORAGE_GET_DEVICE_NUMBER
#define OBJ_CASE_INSENSITIVE
BOOLEAN IsSuperFloppy(_In_ PDISKENTRY DiskEntry)
#define STATUS_BUFFER_TOO_SMALL
#define STATUS_BUFFER_OVERFLOW
PARTITION_TABLE PartitionTable[1]
PARTITION_INFORMATION PartitionEntry[4]
#define FIELD_OFFSET(t, f)
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define RtlMoveMemory(Destination, Source, Length)
#define STATUS_INVALID_PARAMETER
#define STATUS_NO_DATA_DETECTED
#define STATUS_INSUFFICIENT_RESOURCES
_In_ PIO_STACK_LOCATION IoStackLocation
_In_ PDEVICE_OBJECT DeviceObject
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
_In_ WDFREQUEST _In_ size_t _In_ size_t InputBufferLength
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR OutputBuffer
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR InputBuffer
_In_ WDFMEMORY _Out_opt_ size_t * BufferSize
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
_In_ ULONG _In_ ULONG _In_ ULONG NumberOfHeads
_In_ ULONG _In_ BOOLEAN ReturnRecognizedPartitions
_In_ ULONG _In_ ULONG SectorsPerTrack
_In_ ULONG _In_ struct _SET_PARTITION_INFORMATION_EX * PartitionInfo
_In_ ULONG _In_ BOOLEAN _Out_ struct _DRIVE_LAYOUT_INFORMATION ** PartitionBuffer
_In_ ULONG _In_ ULONG PartitionNumber
#define SL_OVERRIDE_VERIFY_VOLUME
_Must_inspect_result_ typedef _In_ ULONG TableEntry
#define POOL_COLD_ALLOCATION
#define ObDereferenceObject
_In_ LARGE_INTEGER _Out_opt_ PLARGE_INTEGER Remainder