15#define TAG_HW_RESOURCE_LIST 'lRwH'
16#define TAG_HW_DISK_CONTEXT 'cDwH'
17#define FIRST_BIOS_DISK 0x80
18#define FIRST_PARTITION 1
21#define MAX_SUPPORTED_BLOCK_SIZE 8192
24#define EFI_PARTITION_HEADER_SIGNATURE "EFI PART"
25#define EFI_HEADER_LOCATION 1ULL
26#define EFI_TABLE_REVISION 0x00010000
27#define EFI_PARTITION_ENTRIES_BLOCK 2ULL
28#define EFI_PARTITION_ENTRY_COUNT 128
29#define EFI_PARTITION_ENTRY_SIZE 128
30#define EFI_PARTITION_NAME_LENGTH 36
33#define EFI_PART_TYPE_UNUSED_GUID \
34 {0x00000000, 0x0000, 0x0000, {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
36#define EFI_PART_TYPE_EFI_SYSTEM_PART_GUID \
37 {0xc12a7328, 0xf81f, 0x11d2, {0xba, 0x4b, 0x00, 0xa0, 0xc9, 0x3e, 0xc9, 0x3b}}
175 WARN(
"Failed to allocate aligned disk read buffer using AllocatePool, trying MmAllocateMemoryWithType (buffer size = 0x%X, alignment %lu)\n",
182 ERR(
"Failed to allocate aligned disk read buffer (buffer size = 0x%X, alignment %lu)\n",
195 ERR(
"Aligned disk read buffer is not properly aligned (align %lu)\n", RequiredAlignment);
207 TRACE(
"GetHarddiskIdentifier: DriveNumber: %d\n", DriveNumber);
263 ERR(
"Failed to align disk read buffer for drive %d\n", DriveNumber);
287 TRACE(
"GPT header has unsupported revision: 0x%x\n", GptHeader->Revision);
308 ULONG EntriesPerBlock;
361 RtlZeroMemory(PartitionTableEntry,
sizeof(*PartitionTableEntry));
370 ULONGLONG StartSector = (StartLba * BlockSize) / 512;
373 PartitionTableEntry->SectorCountBeforePartition = (
ULONG)StartSector;
374 PartitionTableEntry->PartitionSectorCount = (
ULONG)SectorCount512;
407 (
VOID**)&BootBlockIo);
411 ERR(
"Failed to get Block I/O protocol for boot handle\n");
419 TRACE(
"Boot partition: Size=%llu blocks, BlockSize=%lu\n",
425 TRACE(
"Boot handle is root device, using partition 0\n");
427 if (PartitionTableEntry !=
NULL)
429 RtlZeroMemory(PartitionTableEntry,
sizeof(*PartitionTableEntry));
449 ULONG EntriesPerBlock;
455 ERR(
"Failed to read GPT header\n");
462 (
VOID**)&RootBlockIo);
497 TRACE(
"GPT Partition %lu: StartLba=%llu, EndLba=%llu, SizeBlocks=%llu\n",
501 if (PartitionSizeBlocks == BootPartitionSize ||
502 (PartitionSizeBlocks > 0 &&
503 (PartitionSizeBlocks - 1 <= BootPartitionSize &&
504 BootPartitionSize <= PartitionSizeBlocks + 1)))
506 TRACE(
"Found matching GPT partition %lu: Size matches (%llu blocks)\n",
507 i + 1, BootPartitionSize);
509 *BootPartition =
i + 1;
512 if (PartitionTableEntry !=
NULL)
514 RtlZeroMemory(PartitionTableEntry,
sizeof(*PartitionTableEntry));
517 PartitionTableEntry->SectorCountBeforePartition = (
ULONG)StartSector;
538 ULONGLONG PartitionSizeBytes = PartitionSizeSectors * 512ULL;
539 PartitionSizeBlocks = PartitionSizeBytes / BootBlockIo->
Media->
BlockSize;
541 TRACE(
"Partition %lu: SizeSectors=%llu, SizeBlocks=%llu\n",
542 PartitionNum, PartitionSizeSectors, PartitionSizeBlocks);
545 if (PartitionSizeBlocks == BootPartitionSize ||
546 (PartitionSizeBlocks > 0 &&
547 (PartitionSizeBlocks - 1 <= BootPartitionSize &&
548 BootPartitionSize <= PartitionSizeBlocks + 1)))
550 TRACE(
"Found matching partition %lu: Size matches (%llu blocks)\n",
551 PartitionNum, BootPartitionSize);
553 *BootPartition = PartitionNum;
554 if (PartitionTableEntry !=
NULL)
556 RtlCopyMemory(PartitionTableEntry, &TempPartitionEntry,
sizeof(*PartitionTableEntry));
568 TRACE(
"Boot device is CD-ROM, using partition 0xFF\n");
569 *BootPartition = 0xFF;
570 if (PartitionTableEntry !=
NULL)
572 RtlZeroMemory(PartitionTableEntry,
sizeof(*PartitionTableEntry));
578 ERR(
"Could not determine boot partition, using partition 1 as fallback\n");
582 *BootPartition = PartitionNum;
583 if (PartitionTableEntry !=
NULL)
585 RtlCopyMemory(PartitionTableEntry, &TempPartitionEntry,
sizeof(*PartitionTableEntry));
638 TRACE(
"UefiDiskOpen: File ID: %p, Path: %s\n", FileId,
Path);
642 ERR(
"DiskOpen(): DiskReadBufferSize is 0, something is wrong.\n");
650 TRACE(
"Opening disk: DriveNumber: %d, DrivePartition: %d\n", DriveNumber, DrivePartition);
667 ERR(
"Failed to get Block I/O protocol for drive %d\n", DriveNumber);
674 ERR(
"Media not present for drive %d\n", DriveNumber);
680 if (DrivePartition != 0xff && DrivePartition != 0)
696 ERR(
"SectorSize (%lu) != Geometry.BytesPerSector (%lu), expect problems!\n",
708 Context->DriveNumber = DriveNumber;
723 ULONG Length, TotalSectors, MaxSectors, ReadSectors;
743 ERR(
"MaxSectors is 0, cannot read\n");
751 ERR(
"Invalid drive number %d\n",
Context->DriveNumber);
764 ERR(
"Failed to get Block I/O protocol\n");
771 ERR(
"Failed to align disk read buffer\n");
780 ReadSectors =
min(TotalSectors, MaxSectors);
786 ReadSectors *
Context->SectorSize,
804 TotalSectors -= ReadSectors;
871 if (ArcDriveIndex >= 32)
882 ERR(
"Reading MBR failed\n");
896 for (
i = 0;
i < 512 /
sizeof(
ULONG);
i++)
900 Checksum = ~Checksum + 1;
901 TRACE(
"Checksum: %x\n", Checksum);
906 sprintf(ArcName,
"multi(0)disk(0)rdisk(%u)", ArcDriveIndex);
909 sprintf(ArcName,
"multi(0)disk(0)rdisk(%u)partition(0)", ArcDriveIndex);
919 sprintf(ArcName,
"multi(0)disk(0)rdisk(%u)partition(%lu)", ArcDriveIndex,
i);
950 Identifier[18] = (ValidPartitionTable ?
'A' :
'X');
959 ULONG BlockDeviceIndex;
960 ULONG SystemHandleCount;
963 UINTN HandleSize = 0;
979 ERR(
"Failed to get handle buffer size: Status = 0x%lx\n", (
ULONG)
Status);
983 SystemHandleCount = HandleSize /
sizeof(
EFI_HANDLE);
984 if (SystemHandleCount == 0)
986 ERR(
"No block devices found\n");
994 ERR(
"Failed to allocate memory for handles\n");
1008 ERR(
"Failed to locate block device handles: Status = 0x%lx\n", (
ULONG)
Status);
1021 ERR(
"Failed to allocate memory for internal disk structure\n");
1029 for (
i = 0;
i < SystemHandleCount;
i++)
1034 TRACE(
"Found boot handle at index %lu\n",
i);
1044 TRACE(
"Boot handle: LogicalPartition=%s, RemovableMedia=%s, BlockSize=%lu\n",
1045 BlockIo->Media->LogicalPartition ?
"TRUE" :
"FALSE",
1046 BlockIo->Media->RemovableMedia ?
"TRUE" :
"FALSE",
1047 BlockIo->Media->BlockSize);
1054 BlockDeviceIndex = 0;
1055 for (
i = 0;
i < SystemHandleCount;
i++)
1064 TRACE(
"HandleProtocol failed for handle %lu: Status = 0x%lx\n",
i, (
ULONG)
Status);
1068 if (BlockIo ==
NULL)
1070 TRACE(
"BlockIo is NULL for handle %lu\n",
i);
1074 if (!BlockIo->Media->MediaPresent)
1076 TRACE(
"Media not present for handle %lu\n",
i);
1080 if (BlockIo->Media->BlockSize == 0)
1082 TRACE(
"Invalid block size (0) for handle %lu\n",
i);
1089 TRACE(
"Block size too large (%lu) for handle %lu, skipping\n",
1090 BlockIo->Media->BlockSize,
i);
1095 if (BlockIo->Media->LogicalPartition)
1099 TRACE(
"Skipping logical partition handle %lu\n",
i);
1104 TRACE(
"Found root block device at index %lu: BlockSize=%lu, LastBlock=%llu\n",
1105 i, BlockIo->Media->BlockSize, BlockIo->Media->LastBlock);
1119 TRACE(
"Boot device is at ARC drive index %lu (root device)\n", BlockDeviceIndex);
1126 TRACE(
"Calling GetHarddiskInformation for drive %d (BlockDeviceIndex=%lu)\n",
1130 ERR(
"Failed to align disk read buffer for drive %d\n", BlockDeviceIndex +
FIRST_BIOS_DISK);
1148 TRACE(
"Boot handle is a logical partition, searching for parent root device\n");
1149 TRACE(
"Boot partition: BlockSize=%lu, RemovableMedia=%s\n",
1150 BlockIo->Media->BlockSize,
1151 BlockIo->Media->RemovableMedia ?
"TRUE" :
"FALSE");
1157 for (
i = 0;
i < BlockDeviceIndex;
i++)
1163 (
VOID**)&RootBlockIo);
1169 if (BlockIo->Media->BlockSize == 2048 && BlockIo->Media->RemovableMedia)
1177 FoundBootDevice =
TRUE;
1178 TRACE(
"Found CD-ROM boot device at ARC drive index %lu\n",
i);
1186 if (RootBlockIo->
Media->
BlockSize == BlockIo->Media->BlockSize &&
1193 FoundBootDevice =
TRUE;
1194 TRACE(
"Found potential hard disk boot device at ARC drive index %lu\n",
i);
1203 TRACE(
"Could not determine boot device, assuming first drive\n");
1218 ULONG ArcDriveIndex;
1220 TRACE(
"UefiSetBootpath: Setting up boot path\n");
1224 ERR(
"Invalid boot root index\n");
1231 ERR(
"Invalid boot arc disk index\n");
1238 (
VOID**)&BootBlockIo);
1242 ERR(
"Failed to get Block I/O protocol for boot handle\n");
1249 (
VOID**)&RootBlockIo);
1253 ERR(
"Failed to get Block I/O protocol for boot root device\n");
1266 "multi(0)disk(0)cdrom(%u)", ArcDriveIndex);
1271 ULONG BootPartition;
1282 TRACE(
"Boot handle is logical partition, using partition %lu\n", BootPartition);
1289 ERR(
"Failed to get boot partition entry\n");
1295 "multi(0)disk(0)rdisk(%u)partition(%lu)",
1296 ArcDriveIndex, BootPartition);
1308 ULONG ArcDriveIndex;
1322 ERR(
"Failed to allocate disk read buffer\n");
1330 ERR(
"No block devices found\n");
1336 ERR(
"Failed to set boot path\n");
1344 ERR(
"Invalid boot arc disk index\n");
1355 ERR(
"Failed to get Block I/O protocol\n");
1364 ERR(
"Reading MBR from CD-ROM failed\n");
1375 for (
i = 0;
i < 2048 /
sizeof(
ULONG);
i++)
1379 Checksum = ~Checksum + 1;
1380 TRACE(
"CD-ROM Checksum: %x\n", Checksum);
1406 ULONG ArcDriveIndex;
1419 ERR(
"InternalUefiDisk not initialized\n");
1423 if (ArcDriveIndex >= 32)
1425 ERR(
"Drive index out of bounds: %d (ArcDriveIndex=%lu)\n", DriveNumber, ArcDriveIndex);
1433 ERR(
"Invalid drive number: %d (ArcDriveIndex=%lu, PcBiosDiskCount=%lu, Handle=NULL)\n",
1445 ERR(
"Failed to get Block I/O protocol for drive %d\n", DriveNumber);
1451 ERR(
"Media not present for drive %d\n", DriveNumber);
1460 ERR(
"Failed to align disk read buffer for drive %d\n", DriveNumber);
1471 if (MaxSectors == 0)
1473 ERR(
"DiskReadBufferSize too small for block size %lu\n", BlockSize);
1477 while (TotalSectors)
1479 ULONG ReadSectors =
min(TotalSectors, MaxSectors);
1480 UINTN ReadSize = ReadSectors * BlockSize;
1491 ERR(
"ReadBlocks failed: DriveNumber=%d, SectorNumber=%llu, SectorCount=%lu, Status=0x%lx\n",
1492 DriveNumber, CurrentSector, ReadSectors, (
ULONG)
Status);
1493 ERR(
"ReadBlocks details: BlockSize=%lu, IoAlign=%lu, Buffer=%p, DiskReadBuffer=%p, MediaId=0x%lx\n",
1495 ERR(
"ReadBlocks media: LastBlock=%llu, LogicalPartition=%s, RemovableMedia=%s\n",
1504 CurrentSector += ReadSectors;
1505 TotalSectors -= ReadSectors;
1520 ERR(
"ReadBlocks failed: DriveNumber=%d, SectorNumber=%llu, SectorCount=%lu, Status=0x%lx\n",
1522 ERR(
"ReadBlocks details: BlockSize=%lu, IoAlign=%lu, Buffer=%p, DiskReadBuffer=%p, MediaId=0x%lx\n",
1524 ERR(
"ReadBlocks media: LastBlock=%llu, LogicalPartition=%s, RemovableMedia=%s\n",
1537 ULONG ArcDriveIndex;
1548 ERR(
"InternalUefiDisk not initialized\n");
1554 ERR(
"Invalid drive number: %d\n", DriveNumber);
1565 ERR(
"Failed to get Block I/O protocol for drive %d\n", DriveNumber);
1571 ERR(
"Media not present for drive %d\n", DriveNumber);
1576 Geometry->
Heads = 1;
1587 ULONG ArcDriveIndex;
1598 ERR(
"InternalUefiDisk not initialized\n");
1604 ERR(
"Invalid drive number: %d\n", DriveNumber);
1615 ERR(
"Failed to get Block I/O protocol for drive %d\n", DriveNumber);
1621 ERR(
"Media not present for drive %d\n", DriveNumber);
#define BLOCK_IO_PROTOCOL
PRTL_UNICODE_STRING_BUFFER Path
COMPILER_DEPENDENT_UINT64 UINT64
VOID AddReactOSArcDiskInfo(IN PSTR ArcName, IN ULONG Signature, IN ULONG Checksum, IN BOOLEAN ValidPartitionTable)
BOOLEAN DissectArcPath(IN PCSTR ArcPath, OUT PCSTR *Path OPTIONAL, OUT PUCHAR DriveNumber, OUT PULONG PartitionNumber)
BOOLEAN DiskGetPartitionEntry(IN UCHAR DriveNumber, IN ULONG PartitionNumber, OUT PPARTITION_TABLE_ENTRY PartitionTableEntry)
VOID DiskDetectPartitionType(IN UCHAR DriveNumber)
#define DBG_DEFAULT_CHANNEL(ch)
#define PARTITION_ENTRY_UNUSED
struct _MASTER_BOOT_RECORD * PMASTER_BOOT_RECORD
PVOID FsGetDeviceSpecific(ULONG FileId)
VOID FsSetDeviceSpecific(ULONG FileId, PVOID Specific)
VOID FsRegisterDevice(_In_ PCSTR DeviceName, _In_ const DEVVTBL *FuncTable)
#define MachDiskGetDriveGeometry(Drive, Geom)
#define MachDiskReadLogicalSectors(Drive, Start, Count, Buf)
VOID MmFreeMemory(PVOID MemoryPointer)
VOID FrLdrTempFree(PVOID Allocation, ULONG Tag)
PVOID MmAllocateMemoryWithType(SIZE_T MemorySize, TYPE_OF_MEMORY MemoryType)
PVOID FrLdrTempAlloc(_In_ SIZE_T Size, _In_ ULONG Tag)
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
static const WCHAR Signature[]
CCHAR FrLdrBootPath[MAX_PATH]
_Must_inspect_result_ _In_ PFSRTL_PER_STREAM_CONTEXT Ptr
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_ ULONG _In_ ULONG _In_ ULONG Length
NTSTRSAFEVAPI RtlStringCbPrintfA(_Out_writes_bytes_(cbDest) _Always_(_Post_z_) NTSTRSAFE_PSTR pszDest, _In_ size_t cbDest, _In_ _Printf_format_string_ NTSTRSAFE_PCSTR pszFormat,...)
@ LoaderFirmwareTemporary
EFI_LOCATE_HANDLE LocateHandle
EFI_HANDLE_PROTOCOL HandleProtocol
EFI_ALLOCATE_POOL AllocatePool
EFI_BOOT_SERVICES * BootServices
ULONG PartitionSectorCount
ULONG SectorCountBeforePartition
EFI_BLOCK_IO_MEDIA * Media
EFI_BLOCK_READ ReadBlocks
ULONG BytesPerSector
Number of bytes per sector.
ULONG Cylinders
Number of cylinders on the disk.
ULONGLONG Sectors
Total number of disk sectors/LBA blocks.
ULONG SectorsPerTrack
Number of sectors per track.
ULONG Heads
Number of heads on the disk.
EFI_GUID PartitionTypeGuid
EFI_GUID UniquePartitionGuid
CHAR16 PartitionName[EFI_PARTITION_NAME_LENGTH]
BOOLEAN IsThisTheBootDrive
USHORT MasterBootRecordMagic
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define EFI_PARTITION_HEADER_SIGNATURE
#define EFI_PARTITION_NAME_LENGTH
static ULONG PublicBootArcDisk
BOOLEAN UefiDiskGetDriveGeometry(UCHAR DriveNumber, PGEOMETRY Geometry)
static BOOLEAN UefiReadGptHeader(IN UCHAR DriveNumber, OUT PGPT_TABLE_HEADER GptHeader)
#define TAG_HW_DISK_CONTEXT
static BOOLEAN UefiGetBootPartitionEntry(IN UCHAR DriveNumber, OUT PPARTITION_TABLE_ENTRY PartitionTableEntry, OUT PULONG BootPartition)
BOOLEAN UefiDiskReadLogicalSectors(IN UCHAR DriveNumber, IN ULONGLONG SectorNumber, IN ULONG SectorCount, OUT PVOID Buffer)
struct tagDISKCONTEXT DISKCONTEXT
static BOOLEAN DiskReadBufferFromPool
struct _GPT_PARTITION_ENTRY GPT_PARTITION_ENTRY
static CHAR PcDiskIdentifier[32][20]
static EFI_GUID BlockIoGuid
BOOLEAN UefiInitializeBootDevices(VOID)
static ARC_STATUS UefiDiskGetFileInformation(ULONG FileId, FILEINFORMATION *Information)
static BOOLEAN DiskReadBufferFallbackPool
#define EFI_TABLE_REVISION
#define EFI_PART_TYPE_UNUSED_GUID
EFI_HANDLE PublicBootHandle
static ULONG DiskReadBufferAlignment
EFI_SYSTEM_TABLE * GlobalSystemTable
LONG DiskReportError(BOOLEAN bShowError)
static const DEVVTBL UefiDiskVtbl
static BOOLEAN UefiEnsureDiskReadBufferAligned(IN ULONG Alignment)
static VOID UefiSetupBlockDevices(VOID)
struct _GPT_TABLE_HEADER GPT_TABLE_HEADER
#define EFI_HEADER_LOCATION
BOOLEAN UefiGetGptPartitionEntry(IN UCHAR DriveNumber, IN ULONG PartitionNumber, OUT PPARTITION_TABLE_ENTRY PartitionTableEntry)
struct _GPT_TABLE_HEADER * PGPT_TABLE_HEADER
static ULONG UefiBootRootIndex
static PVOID DiskReadBufferRaw
#define MAX_SUPPORTED_BLOCK_SIZE
static ARC_STATUS UefiDiskOpen(CHAR *Path, OPENMODE OpenMode, ULONG *FileId)
static ARC_STATUS UefiDiskSeek(ULONG FileId, LARGE_INTEGER *Position, SEEKMODE SeekMode)
static INTERNAL_UEFI_DISK * InternalUefiDisk
static ARC_STATUS UefiDiskClose(ULONG FileId)
static VOID GetHarddiskInformation(UCHAR DriveNumber)
PCHAR GetHarddiskIdentifier(UCHAR DriveNumber)
static ARC_STATUS UefiDiskRead(ULONG FileId, VOID *Buffer, ULONG N, ULONG *Count)
EFI_HANDLE GlobalImageHandle
struct _INTERNAL_UEFI_DISK INTERNAL_UEFI_DISK
static EFI_HANDLE * handles
UCHAR UefiGetFloppyCount(VOID)
SIZE_T DiskReadBufferSize
struct _GPT_PARTITION_ENTRY * PGPT_PARTITION_ENTRY
static BOOLEAN UefiIsAlignedPointer(IN PVOID Pointer, IN ULONG Alignment)
ULONG UefiDiskGetCacheableBlockCount(UCHAR DriveNumber)
static BOOLEAN UefiSetBootpath(VOID)
struct _INTERNAL_UEFI_DISK * PINTERNAL_UEFI_DISK
#define ALIGN_UP_POINTER_BY(ptr, align)
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
_In_ WDFREQUEST _In_ NTSTATUS _In_ ULONG_PTR Information
_In_ ULONG _In_ ULONG PartitionNumber