ReactOS 0.4.15-dev-6656-gbbb33a6
part_xbox.c File Reference
#include "halxbox.h"
#include <internal/tag.h>
#include <debug.h>
Include dependency graph for part_xbox.c:

Go to the source code of this file.

Macros

#define NDEBUG
 
#define XBOX_SIGNATURE_SECTOR   3
 
#define XBOX_SIGNATURE   ('B' | ('R' << 8) | ('F' << 16) | ('R' << 24))
 
#define PARTITION_SIGNATURE   0xaa55
 
#define XBOX_PARTITION_COUNT   (sizeof(XboxPartitions) / sizeof(XboxPartitions[0]))
 
#define HalExamineMBR   HALDISPATCH->HalExamineMBR
 
#define HalIoReadPartitionTable   HALDISPATCH->HalIoReadPartitionTable
 
#define HalIoSetPartitionInformation   HALDISPATCH->HalIoSetPartitionInformation
 
#define HalIoWritePartitionTable   HALDISPATCH->HalIoWritePartitionTable
 

Functions

static NTSTATUS HalpXboxReadSector (IN PDEVICE_OBJECT DeviceObject, IN ULONG SectorSize, IN PLARGE_INTEGER SectorOffset, OUT PVOID Sector)
 
static NTSTATUS FASTCALL HalpXboxDeviceHasXboxPartitioning (IN PDEVICE_OBJECT DeviceObject, IN ULONG SectorSize, OUT BOOLEAN *HasXboxPartitioning)
 
static VOID FASTCALL HalpXboxExamineMBR (IN PDEVICE_OBJECT DeviceObject, IN ULONG SectorSize, IN ULONG MBRTypeIdentifier, OUT PVOID *Buffer)
 
static NTSTATUS FASTCALL HalpXboxIoReadPartitionTable (IN PDEVICE_OBJECT DeviceObject, IN ULONG SectorSize, IN BOOLEAN ReturnRecognizedPartitions, OUT PDRIVE_LAYOUT_INFORMATION *PartitionBuffer)
 
static NTSTATUS FASTCALL HalpXboxIoSetPartitionInformation (IN PDEVICE_OBJECT DeviceObject, IN ULONG SectorSize, IN ULONG PartitionNumber, IN ULONG PartitionType)
 
static NTSTATUS FASTCALL HalpXboxIoWritePartitionTable (IN PDEVICE_OBJECT DeviceObject, IN ULONG SectorSize, IN ULONG SectorsPerTrack, IN ULONG NumberOfHeads, IN PDRIVE_LAYOUT_INFORMATION PartitionBuffer)
 
void HalpXboxInitPartIo (void)
 

Variables

static pHalExamineMBR NtoskrnlExamineMBR
 
static pHalIoReadPartitionTable NtoskrnlIoReadPartitionTable
 
static pHalIoSetPartitionInformation NtoskrnlIoSetPartitionInformation
 
static pHalIoWritePartitionTable NtoskrnlIoWritePartitionTable
 
struct {
   ULONG   SectorStart
 
   ULONG   SectorCount
 
   CHAR   PartitionType
 
XboxPartitions []
 

Macro Definition Documentation

◆ HalExamineMBR

#define HalExamineMBR   HALDISPATCH->HalExamineMBR

Definition at line 325 of file part_xbox.c.

◆ HalIoReadPartitionTable

#define HalIoReadPartitionTable   HALDISPATCH->HalIoReadPartitionTable

Definition at line 326 of file part_xbox.c.

◆ HalIoSetPartitionInformation

#define HalIoSetPartitionInformation   HALDISPATCH->HalIoSetPartitionInformation

Definition at line 327 of file part_xbox.c.

◆ HalIoWritePartitionTable

#define HalIoWritePartitionTable   HALDISPATCH->HalIoWritePartitionTable

Definition at line 328 of file part_xbox.c.

◆ NDEBUG

#define NDEBUG

Definition at line 14 of file part_xbox.c.

◆ PARTITION_SIGNATURE

#define PARTITION_SIGNATURE   0xaa55

Definition at line 19 of file part_xbox.c.

◆ XBOX_PARTITION_COUNT

#define XBOX_PARTITION_COUNT   (sizeof(XboxPartitions) / sizeof(XboxPartitions[0]))

Definition at line 43 of file part_xbox.c.

◆ XBOX_SIGNATURE

#define XBOX_SIGNATURE   ('B' | ('R' << 8) | ('F' << 16) | ('R' << 24))

Definition at line 18 of file part_xbox.c.

◆ XBOX_SIGNATURE_SECTOR

#define XBOX_SIGNATURE_SECTOR   3

Definition at line 17 of file part_xbox.c.

Function Documentation

◆ HalpXboxDeviceHasXboxPartitioning()

static NTSTATUS FASTCALL HalpXboxDeviceHasXboxPartitioning ( IN PDEVICE_OBJECT  DeviceObject,
IN ULONG  SectorSize,
OUT BOOLEAN HasXboxPartitioning 
)
static

Definition at line 101 of file part_xbox.c.

104{
105 PVOID SectorData;
108 BOOLEAN HasMBRPartitioning;
109
110 DPRINT("HalpXboxDeviceHasXboxPartitioning(%p %lu %p)\n",
113 HasXboxPartitioning);
114
116 if (!SectorData)
117 {
118 return STATUS_NO_MEMORY;
119 }
120
121 Offset.QuadPart = 0;
123 if (!NT_SUCCESS(Status))
124 {
125 goto Cleanup;
126 }
127
128 HasMBRPartitioning = (*((USHORT *)SectorData + (SectorSize / sizeof(USHORT)) - 1) == PARTITION_SIGNATURE);
129 if (HasMBRPartitioning)
130 {
131 *HasXboxPartitioning = FALSE;
132 goto Cleanup;
133 }
134
137 if (!NT_SUCCESS(Status))
138 {
139 goto Cleanup;
140 }
141
142 DPRINT("Signature 0x%02x 0x%02x 0x%02x 0x%02x\n",
143 *((UCHAR *) SectorData), *((UCHAR *) SectorData + 1), *((UCHAR *) SectorData + 2), *((UCHAR *) SectorData + 3));
144 *HasXboxPartitioning = (XBOX_SIGNATURE == *((ULONG *) SectorData));
145Cleanup:
146 ExFreePoolWithTag(SectorData, TAG_HAL_XBOX);
147 if (NT_SUCCESS(Status))
148 {
149 DPRINT("%s partitioning found\n", *HasXboxPartitioning ? "Xbox" : "MBR");
150 }
151
152 return Status;
153}
unsigned char BOOLEAN
LONG NTSTATUS
Definition: precomp.h:26
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
static const WCHAR Cleanup[]
Definition: register.c:80
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define PagedPool
Definition: env_spec_w32.h:308
Status
Definition: gdiplustypes.h:25
#define TAG_HAL_XBOX
Definition: halxbox.h:20
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
#define STATUS_NO_MEMORY
Definition: ntstatus.h:260
#define XBOX_SIGNATURE_SECTOR
Definition: part_xbox.c:17
static NTSTATUS HalpXboxReadSector(IN PDEVICE_OBJECT DeviceObject, IN ULONG SectorSize, IN PLARGE_INTEGER SectorOffset, OUT PVOID Sector)
Definition: part_xbox.c:49
#define XBOX_SIGNATURE
Definition: part_xbox.c:18
#define PARTITION_SIGNATURE
Definition: part_xbox.c:19
unsigned short USHORT
Definition: pedump.c:61
#define DPRINT
Definition: sndvol32.h:71
uint32_t ULONG
Definition: typedefs.h:59
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
_In_ ULONG SectorSize
Definition: halfuncs.h:291
unsigned char UCHAR
Definition: xmlstorage.h:181

Referenced by HalpXboxExamineMBR(), HalpXboxIoReadPartitionTable(), HalpXboxIoSetPartitionInformation(), and HalpXboxIoWritePartitionTable().

◆ HalpXboxExamineMBR()

static VOID FASTCALL HalpXboxExamineMBR ( IN PDEVICE_OBJECT  DeviceObject,
IN ULONG  SectorSize,
IN ULONG  MBRTypeIdentifier,
OUT PVOID Buffer 
)
static

Definition at line 156 of file part_xbox.c.

160{
161 BOOLEAN HasXboxPartitioning;
163
164 DPRINT("HalpXboxExamineMBR(%p %lu %lx %p)\n",
168 Buffer);
169
170 *Buffer = NULL;
171
173 if (!NT_SUCCESS(Status))
174 {
175 return;
176 }
177
178 if (!HasXboxPartitioning)
179 {
180 DPRINT("Delegating to standard MBR code\n");
182 return;
183 }
184
185 /* Buffer already set to NULL */
186 return;
187}
Definition: bufpool.h:45
#define NULL
Definition: types.h:112
static NTSTATUS FASTCALL HalpXboxDeviceHasXboxPartitioning(IN PDEVICE_OBJECT DeviceObject, IN ULONG SectorSize, OUT BOOLEAN *HasXboxPartitioning)
Definition: part_xbox.c:101
static pHalExamineMBR NtoskrnlExamineMBR
Definition: part_xbox.c:23
_In_ ULONG _In_ ULONG MBRTypeIdentifier
Definition: halfuncs.h:292

Referenced by HalpXboxInitPartIo().

◆ HalpXboxInitPartIo()

void HalpXboxInitPartIo ( void  )

Definition at line 331 of file part_xbox.c.

332{
341}
static pHalIoWritePartitionTable NtoskrnlIoWritePartitionTable
Definition: part_xbox.c:26
static NTSTATUS FASTCALL HalpXboxIoReadPartitionTable(IN PDEVICE_OBJECT DeviceObject, IN ULONG SectorSize, IN BOOLEAN ReturnRecognizedPartitions, OUT PDRIVE_LAYOUT_INFORMATION *PartitionBuffer)
Definition: part_xbox.c:190
static VOID FASTCALL HalpXboxExamineMBR(IN PDEVICE_OBJECT DeviceObject, IN ULONG SectorSize, IN ULONG MBRTypeIdentifier, OUT PVOID *Buffer)
Definition: part_xbox.c:156
#define HalIoWritePartitionTable
Definition: part_xbox.c:328
static NTSTATUS FASTCALL HalpXboxIoSetPartitionInformation(IN PDEVICE_OBJECT DeviceObject, IN ULONG SectorSize, IN ULONG PartitionNumber, IN ULONG PartitionType)
Definition: part_xbox.c:257
#define HalExamineMBR
Definition: part_xbox.c:325
#define HalIoSetPartitionInformation
Definition: part_xbox.c:327
#define HalIoReadPartitionTable
Definition: part_xbox.c:326
static NTSTATUS FASTCALL HalpXboxIoWritePartitionTable(IN PDEVICE_OBJECT DeviceObject, IN ULONG SectorSize, IN ULONG SectorsPerTrack, IN ULONG NumberOfHeads, IN PDRIVE_LAYOUT_INFORMATION PartitionBuffer)
Definition: part_xbox.c:290
static pHalIoReadPartitionTable NtoskrnlIoReadPartitionTable
Definition: part_xbox.c:24
static pHalIoSetPartitionInformation NtoskrnlIoSetPartitionInformation
Definition: part_xbox.c:25

Referenced by HalpInitPhase0().

◆ HalpXboxIoReadPartitionTable()

static NTSTATUS FASTCALL HalpXboxIoReadPartitionTable ( IN PDEVICE_OBJECT  DeviceObject,
IN ULONG  SectorSize,
IN BOOLEAN  ReturnRecognizedPartitions,
OUT PDRIVE_LAYOUT_INFORMATION PartitionBuffer 
)
static

Definition at line 190 of file part_xbox.c.

194{
195 BOOLEAN HasXboxPartitioning;
197 ULONG Part;
198 PPARTITION_INFORMATION PartInfo;
199
200 DPRINT("HalpXboxIoReadPartitionTable(%p %lu %x %p)\n",
205
207 if (!NT_SUCCESS(Status))
208 {
209 return Status;
210 }
211
212 if (!HasXboxPartitioning)
213 {
214 DPRINT("Delegating to standard MBR code\n");
217 }
218
220 PagedPool,
224 if (*PartitionBuffer == NULL)
225 {
226 return STATUS_NO_MEMORY;
227 }
228 (*PartitionBuffer)->PartitionCount = XBOX_PARTITION_COUNT;
229 (*PartitionBuffer)->Signature = PARTITION_SIGNATURE;
230 for (Part = 0; Part < XBOX_PARTITION_COUNT; Part++)
231 {
232 PartInfo = (*PartitionBuffer)->PartitionEntry + Part;
237 PartInfo->HiddenSectors = 0;
238 PartInfo->PartitionNumber = Part + 1;
239 PartInfo->PartitionType = XboxPartitions[Part].PartitionType;
240 PartInfo->BootIndicator = FALSE;
241 PartInfo->RecognizedPartition = TRUE;
242 PartInfo->RewritePartition = FALSE;
243 DPRINT(" %ld: nr: %d boot: %1x type: %x start: 0x%I64x count: 0x%I64x rec: %d\n",
244 Part,
245 PartInfo->PartitionNumber,
246 PartInfo->BootIndicator,
247 PartInfo->PartitionType,
248 PartInfo->StartingOffset.QuadPart,
249 PartInfo->PartitionLength.QuadPart,
250 PartInfo->RecognizedPartition);
251 }
252
253 return STATUS_SUCCESS;
254}
#define TRUE
Definition: types.h:120
struct _DRIVE_LAYOUT_INFORMATION * PDRIVE_LAYOUT_INFORMATION
struct _PARTITION_INFORMATION PARTITION_INFORMATION
#define XBOX_PARTITION_COUNT
Definition: part_xbox.c:43
ULONG SectorStart
Definition: part_xbox.c:30
ULONG SectorCount
Definition: part_xbox.c:31
static struct @1510 XboxPartitions[]
#define STATUS_SUCCESS
Definition: shellext.h:65
LARGE_INTEGER StartingOffset
Definition: ntdddisk.h:413
LARGE_INTEGER PartitionLength
Definition: ntdddisk.h:414
BOOLEAN RecognizedPartition
Definition: ntdddisk.h:419
BOOLEAN RewritePartition
Definition: ntdddisk.h:420
#define TAG_FILE_SYSTEM
Definition: tag.h:65
uint64_t ULONGLONG
Definition: typedefs.h:67
LONGLONG QuadPart
Definition: typedefs.h:114
_In_ ULONG _In_ BOOLEAN ReturnRecognizedPartitions
Definition: iofuncs.h:2051
_In_ ULONG _In_ BOOLEAN _Out_ struct _DRIVE_LAYOUT_INFORMATION ** PartitionBuffer
Definition: iofuncs.h:2052

Referenced by HalpXboxInitPartIo().

◆ HalpXboxIoSetPartitionInformation()

static NTSTATUS FASTCALL HalpXboxIoSetPartitionInformation ( IN PDEVICE_OBJECT  DeviceObject,
IN ULONG  SectorSize,
IN ULONG  PartitionNumber,
IN ULONG  PartitionType 
)
static

Definition at line 257 of file part_xbox.c.

261{
262 BOOLEAN HasXboxPartitioning;
264
265 DPRINT("HalpXboxIoSetPartitionInformation(%p %lu %lu %lu)\n",
270
272 if (!NT_SUCCESS(Status))
273 {
274 return Status;
275 }
276
277 if (!HasXboxPartitioning)
278 {
279 DPRINT("Delegating to standard MBR code\n");
282 }
283
284 /* Can't change the partitioning */
285 DPRINT1("Xbox partitions are fixed, can't change them\n");
287}
#define DPRINT1
Definition: precomp.h:8
CHAR PartitionType
Definition: part_xbox.c:32
#define STATUS_ACCESS_DENIED
Definition: udferr_usr.h:145
_In_ ULONG _In_ ULONG PartitionNumber
Definition: iofuncs.h:2061

Referenced by HalpXboxInitPartIo().

◆ HalpXboxIoWritePartitionTable()

static NTSTATUS FASTCALL HalpXboxIoWritePartitionTable ( IN PDEVICE_OBJECT  DeviceObject,
IN ULONG  SectorSize,
IN ULONG  SectorsPerTrack,
IN ULONG  NumberOfHeads,
IN PDRIVE_LAYOUT_INFORMATION  PartitionBuffer 
)
static

Definition at line 290 of file part_xbox.c.

295{
296 BOOLEAN HasXboxPartitioning;
298
299 DPRINT("HalpXboxIoWritePartitionTable(%p %lu %lu %lu %p)\n",
305
307 if (!NT_SUCCESS(Status))
308 {
309 return Status;
310 }
311
312 if (!HasXboxPartitioning)
313 {
314 DPRINT("Delegating to standard MBR code\n");
318 }
319
320 /* Can't change the partitioning */
321 DPRINT1("Xbox partitions are fixed, can't change them\n");
323}
_In_ ULONG _In_ ULONG _In_ ULONG NumberOfHeads
Definition: iofuncs.h:2072
_In_ ULONG _In_ ULONG SectorsPerTrack
Definition: iofuncs.h:2071

Referenced by HalpXboxInitPartIo().

◆ HalpXboxReadSector()

static NTSTATUS HalpXboxReadSector ( IN PDEVICE_OBJECT  DeviceObject,
IN ULONG  SectorSize,
IN PLARGE_INTEGER  SectorOffset,
OUT PVOID  Sector 
)
static

Definition at line 49 of file part_xbox.c.

53{
54 IO_STATUS_BLOCK StatusBlock;
56 PIRP Irp;
58
59 DPRINT("HalpXboxReadSector(%p %lu 0x%08x%08x %p)\n",
60 DeviceObject, SectorSize, SectorOffset->u.HighPart, SectorOffset->u.LowPart, Sector);
61
63 ASSERT(Sector);
64
67 FALSE);
68
69 /* Read the sector */
72 Sector,
75 &Event,
76 &StatusBlock);
78
80 Irp);
82 {
86 FALSE,
87 NULL);
88 Status = StatusBlock.Status;
89 }
90
91 if (!NT_SUCCESS(Status))
92 {
93 DPRINT("Reading sector failed (Status 0x%08lx)\n", Status);
94 return Status;
95 }
96
97 return Status;
98}
#define SectorOffset(L)
Definition: cdprocs.h:1622
_In_ PIRP Irp
Definition: csq.h:116
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
Definition: env_spec_w32.h:478
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
#define ASSERT(a)
Definition: mode.c:44
#define KernelMode
Definition: asm.h:34
@ NotificationEvent
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)
Definition: irp.c:1069
#define IoCallDriver
Definition: irp.c:1225
#define STATUS_PENDING
Definition: ntstatus.h:82
#define IRP_MJ_READ
Definition: rdpdr.c:46
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
@ Executive
Definition: ketypes.h:403

Referenced by HalpXboxDeviceHasXboxPartitioning().

Variable Documentation

◆ NtoskrnlExamineMBR

pHalExamineMBR NtoskrnlExamineMBR
static

Definition at line 23 of file part_xbox.c.

Referenced by HalpXboxExamineMBR(), and HalpXboxInitPartIo().

◆ NtoskrnlIoReadPartitionTable

pHalIoReadPartitionTable NtoskrnlIoReadPartitionTable
static

Definition at line 24 of file part_xbox.c.

Referenced by HalpXboxInitPartIo(), and HalpXboxIoReadPartitionTable().

◆ NtoskrnlIoSetPartitionInformation

pHalIoSetPartitionInformation NtoskrnlIoSetPartitionInformation
static

Definition at line 25 of file part_xbox.c.

Referenced by HalpXboxInitPartIo(), and HalpXboxIoSetPartitionInformation().

◆ NtoskrnlIoWritePartitionTable

pHalIoWritePartitionTable NtoskrnlIoWritePartitionTable
static

Definition at line 26 of file part_xbox.c.

Referenced by HalpXboxInitPartIo(), and HalpXboxIoWritePartitionTable().

◆ PartitionType

◆ SectorCount

Definition at line 31 of file part_xbox.c.

Referenced by AddLogicalDiskSpace(), AtaAtapiReadLogicalSectorsLBA(), AtaReadLogicalSectorsLBA(), CacheReadDiskSectors(), CommandDumpSector(), CreateExtendedPartition(), CreateExtendedPartitionPage(), CreateInsertBlankRegion(), CreateLogicalPartition(), CreateLogicalPartitionPage(), CreatePrimaryPartition(), CreatePrimaryPartitionPage(), DeviceRequestReadWrite(), DiskOpen(), DiskPerformSmartCommand(), DiskReadSmartLog(), DiskWriteSmartLog(), Ext2ReadVolumeSectors(), Fat12Format(), Fat16Format(), FatAddMcbEntry(), FatMount(), FatReadPartialCluster(), FatReadVolumeSectors(), FatRemoveMcbEntry(), FatxFormat(), FileSystemToMBRPartitionType(), FsRecGetDeviceSectors(), FsRecNtfsFsControl(), FsRtlAddBaseMcbEntry(), FsRtlAddLargeMcbEntry(), FsRtlAddMcbEntry(), FsRtlGetNextBaseMcbEntry(), FsRtlGetNextLargeMcbEntry(), FsRtlGetNextMcbEntry(), FsRtlLargeMcbTest(), FsRtlLargeMcbTestsExt2(), FsRtlLargeMcbTestsFastFat_3(), FsRtlLookupMcbEntry(), FsRtlRemoveBaseMcbEntry(), FsRtlRemoveLargeMcbEntry(), FsRtlRemoveMcbEntry(), HalpCalculateChsValues(), HalpXboxIoReadPartitionTable(), InitializePartitionEntry(), IsoBufferDirectory(), main(), NtfsReadSectors(), Pc98DiskReadLogicalSectors(), Pc98DiskReadLogicalSectorsCHS(), Pc98DiskReadLogicalSectorsLBA(), PcDiskReadLogicalSectors(), PcDiskReadLogicalSectorsCHS(), PcDiskReadLogicalSectorsLBA(), ScanForUnpartitionedDiskSpace(), UefiDiskOpen(), UefiDiskReadLogicalSectors(), and XboxDiskReadLogicalSectors().

◆ SectorStart

ULONG SectorStart

Definition at line 30 of file part_xbox.c.

Referenced by HalpXboxIoReadPartitionTable().

◆ 

struct { ... } XboxPartitions[]
Initial value:
=
{
{ 0x0055F400, 0x0098f800, PARTITION_FAT32 },
{ 0x00465400, 0x000FA000, PARTITION_FAT_16 },
{ 0x00000400, 0x00177000, PARTITION_FAT_16 },
{ 0x00177400, 0x00177000, PARTITION_FAT_16 },
{ 0x002EE400, 0x00177000, PARTITION_FAT_16 }
}
#define PARTITION_FAT32
Definition: disk.h:95
#define PARTITION_FAT_16
Definition: disk.h:90

Referenced by HalpXboxIoReadPartitionTable().