Switch use from DISK_GEOMETRY to DISK_GEOMETRY_EX. It's needed to handle some Windows 2003's kernel routines.
[CDROM]
Reflect changes in Class2.
[DISK]
Reflect changes in Class2.
Also added support for IOCTL_DISK_GET_DRIVE_GEOMETRY_EX.
svn path=/trunk/; revision=49129
//
deviceExtension->DiskGeometry =
- ExAllocatePool(NonPagedPool, sizeof(DISK_GEOMETRY));
+ ExAllocatePool(NonPagedPool, sizeof(DISK_GEOMETRY_EX));
if (deviceExtension->DiskGeometry == NULL) {
//
status = ScsiClassReadDriveCapacity(deviceObject);
- bps = deviceExtension->DiskGeometry->BytesPerSector;
+ bps = deviceExtension->DiskGeometry->Geometry.BytesPerSector;
if (!NT_SUCCESS(status) || !bps) {
bps = 1 << lastBit;
}
- deviceExtension->DiskGeometry->BytesPerSector = bps;
+ deviceExtension->DiskGeometry->Geometry.BytesPerSector = bps;
DebugPrint((2, "CreateCdRomDeviceObject: Calc'd bps = %x\n", bps));
//
startingOffset.QuadPart = currentIrpStack->Parameters.Read.ByteOffset.QuadPart +
transferByteCount;
- if (!deviceExtension->DiskGeometry->BytesPerSector) {
- deviceExtension->DiskGeometry->BytesPerSector = 2048;
+ if (!deviceExtension->DiskGeometry->Geometry.BytesPerSector) {
+ deviceExtension->DiskGeometry->Geometry.BytesPerSector = 2048;
}
if ((startingOffset.QuadPart > deviceExtension->PartitionLength.QuadPart) ||
- (transferByteCount & (deviceExtension->DiskGeometry->BytesPerSector - 1))) {
+ (transferByteCount & (deviceExtension->DiskGeometry->Geometry.BytesPerSector - 1))) {
DebugPrint((1,"ScsiCdRomRead: Invalid I/O parameters\n"));
DebugPrint((1, "\toffset %x:%x, Length %x:%x\n",
startingOffset.u.LowPart,
deviceExtension->PartitionLength.u.HighPart,
deviceExtension->PartitionLength.u.LowPart));
- DebugPrint((1, "\tbps %x\n", deviceExtension->DiskGeometry->BytesPerSector));
+ DebugPrint((1, "\tbps %x\n", deviceExtension->DiskGeometry->Geometry.BytesPerSector));
//
// Fail request with status of invalid parameters.
bps = 1 << lastBit;
}
- deviceExtension->DiskGeometry->BytesPerSector = bps;
+ deviceExtension->DiskGeometry->Geometry.BytesPerSector = bps;
DebugPrint((2,
"CdRomDeviceControlCompletion: Calculated bps %#x\n",
- deviceExtension->DiskGeometry->BytesPerSector));
+ deviceExtension->DiskGeometry->Geometry.BytesPerSector));
//
// Copy last sector in reverse byte order.
WHICH_BIT(bps, deviceExtension->SectorShift);
DebugPrint((2,"SCSI ScsiClassReadDriveCapacity: Sector size is %d\n",
- deviceExtension->DiskGeometry->BytesPerSector));
+ deviceExtension->DiskGeometry->Geometry.BytesPerSector));
DebugPrint((2,"SCSI ScsiClassReadDriveCapacity: Number of Sectors is %d\n",
lastSector + 1));
// Calculate number of cylinders.
//
- deviceExtension->DiskGeometry->Cylinders.QuadPart = (LONGLONG)((lastSector + 1)/(32 * 64));
+ deviceExtension->DiskGeometry->Geometry.Cylinders.QuadPart = (LONGLONG)((lastSector + 1)/(32 * 64));
deviceExtension->PartitionLength.QuadPart =
(deviceExtension->PartitionLength.QuadPart << deviceExtension->SectorShift);
// This device supports removable media.
//
- deviceExtension->DiskGeometry->MediaType = RemovableMedia;
+ deviceExtension->DiskGeometry->Geometry.MediaType = RemovableMedia;
} else {
// Assume media type is fixed disk.
//
- deviceExtension->DiskGeometry->MediaType = FixedMedia;
+ deviceExtension->DiskGeometry->Geometry.MediaType = FixedMedia;
}
//
// Assume sectors per track are 32;
//
- deviceExtension->DiskGeometry->SectorsPerTrack = 32;
+ deviceExtension->DiskGeometry->Geometry.SectorsPerTrack = 32;
//
// Assume tracks per cylinder (number of heads) is 64.
//
- deviceExtension->DiskGeometry->TracksPerCylinder = 64;
+ deviceExtension->DiskGeometry->Geometry.TracksPerCylinder = 64;
//
// Copy the device extension's geometry info into the user buffer.
//
from = (PFOUR_BYTE) &readCapacityBuffer->BytesPerBlock;
- to = (PFOUR_BYTE) &deviceExtension->DiskGeometry->BytesPerSector;
+ to = (PFOUR_BYTE) &deviceExtension->DiskGeometry->Geometry.BytesPerSector;
to->Byte0 = from->Byte3;
to->Byte1 = from->Byte2;
to->Byte2 = from->Byte1;
// Using the new BytesPerBlock, calculate and store the SectorShift.
//
- WHICH_BIT(deviceExtension->DiskGeometry->BytesPerSector, deviceExtension->SectorShift);
+ WHICH_BIT(deviceExtension->DiskGeometry->Geometry.BytesPerSector, deviceExtension->SectorShift);
//
// Copy last sector in reverse byte order.
// Calculate number of cylinders.
//
- deviceExtension->DiskGeometry->Cylinders.QuadPart = (LONGLONG)((lastSector + 1)/(32 * 64));
+ deviceExtension->DiskGeometry->Geometry.Cylinders.QuadPart = (LONGLONG)((lastSector + 1)/(32 * 64));
deviceExtension->PartitionLength.QuadPart =
(deviceExtension->PartitionLength.QuadPart << deviceExtension->SectorShift);
- deviceExtension->DiskGeometry->MediaType = RemovableMedia;
+ deviceExtension->DiskGeometry->Geometry.MediaType = RemovableMedia;
//
// Assume sectors per track are 32;
//
- deviceExtension->DiskGeometry->SectorsPerTrack = 32;
+ deviceExtension->DiskGeometry->Geometry.SectorsPerTrack = 32;
//
// Assume tracks per cylinder (number of heads) is 64.
//
- deviceExtension->DiskGeometry->TracksPerCylinder = 64;
+ deviceExtension->DiskGeometry->Geometry.TracksPerCylinder = 64;
} else {
//
originalIrp->IoStatus.Status = STATUS_INSUFFICIENT_RESOURCES;
- RtlZeroMemory(deviceExtension->DiskGeometry, sizeof(DISK_GEOMETRY));
- deviceExtension->DiskGeometry->BytesPerSector = 2048;
+ RtlZeroMemory(deviceExtension->DiskGeometry, sizeof(DISK_GEOMETRY_EX));
+ deviceExtension->DiskGeometry->Geometry.BytesPerSector = 2048;
deviceExtension->SectorShift = 11;
deviceExtension->PartitionLength.QuadPart = (LONGLONG)(0x7fffffff);
- deviceExtension->DiskGeometry->MediaType = RemovableMedia;
+ deviceExtension->DiskGeometry->Geometry.MediaType = RemovableMedia;
}
} else {
// Set up reasonable defaults
//
- RtlZeroMemory(deviceExtension->DiskGeometry, sizeof(DISK_GEOMETRY));
- deviceExtension->DiskGeometry->BytesPerSector = 2048;
+ RtlZeroMemory(deviceExtension->DiskGeometry, sizeof(DISK_GEOMETRY_EX));
+ deviceExtension->DiskGeometry->Geometry.BytesPerSector = 2048;
deviceExtension->SectorShift = 11;
deviceExtension->PartitionLength.QuadPart = (LONGLONG)(0x7fffffff);
- deviceExtension->DiskGeometry->MediaType = RemovableMedia;
+ deviceExtension->DiskGeometry->Geometry.MediaType = RemovableMedia;
}
}
// in reverse byte order.
//
- ((PFOUR_BYTE)&deviceExtension->DiskGeometry->BytesPerSector)->Byte0 =
+ ((PFOUR_BYTE)&deviceExtension->DiskGeometry->Geometry.BytesPerSector)->Byte0 =
((PFOUR_BYTE)&readCapacityBuffer->BytesPerBlock)->Byte3;
- ((PFOUR_BYTE)&deviceExtension->DiskGeometry->BytesPerSector)->Byte1 =
+ ((PFOUR_BYTE)&deviceExtension->DiskGeometry->Geometry.BytesPerSector)->Byte1 =
((PFOUR_BYTE)&readCapacityBuffer->BytesPerBlock)->Byte2;
- ((PFOUR_BYTE)&deviceExtension->DiskGeometry->BytesPerSector)->Byte2 =
+ ((PFOUR_BYTE)&deviceExtension->DiskGeometry->Geometry.BytesPerSector)->Byte2 =
((PFOUR_BYTE)&readCapacityBuffer->BytesPerBlock)->Byte1;
- ((PFOUR_BYTE)&deviceExtension->DiskGeometry->BytesPerSector)->Byte3 =
+ ((PFOUR_BYTE)&deviceExtension->DiskGeometry->Geometry.BytesPerSector)->Byte3 =
((PFOUR_BYTE)&readCapacityBuffer->BytesPerBlock)->Byte0;
//
// Calculate sector to byte shift.
//
- WHICH_BIT(deviceExtension->DiskGeometry->BytesPerSector, deviceExtension->SectorShift);
+ WHICH_BIT(deviceExtension->DiskGeometry->Geometry.BytesPerSector, deviceExtension->SectorShift);
DebugPrint((2,"SCSI ScsiClassReadDriveCapacity: Sector size is %d\n",
- deviceExtension->DiskGeometry->BytesPerSector));
+ deviceExtension->DiskGeometry->Geometry.BytesPerSector));
DebugPrint((2,"SCSI ScsiClassReadDriveCapacity: Number of Sectors is %d\n",
lastSector + 1));
// Calculate number of cylinders.
//
- deviceExtension->DiskGeometry->Cylinders.QuadPart = (LONGLONG)((lastSector + 1)/(32 * 64));
+ deviceExtension->DiskGeometry->Geometry.Cylinders.QuadPart = (LONGLONG)((lastSector + 1)/(32 * 64));
deviceExtension->PartitionLength.QuadPart =
(deviceExtension->PartitionLength.QuadPart << deviceExtension->SectorShift);
// This device supports removable media.
//
- deviceExtension->DiskGeometry->MediaType = RemovableMedia;
+ deviceExtension->DiskGeometry->Geometry.MediaType = RemovableMedia;
} else {
// Assume media type is fixed disk.
//
- deviceExtension->DiskGeometry->MediaType = FixedMedia;
+ deviceExtension->DiskGeometry->Geometry.MediaType = FixedMedia;
}
//
// Assume sectors per track are 32;
//
- deviceExtension->DiskGeometry->SectorsPerTrack = 32;
+ deviceExtension->DiskGeometry->Geometry.SectorsPerTrack = 32;
//
// Assume tracks per cylinder (number of heads) is 64.
//
- deviceExtension->DiskGeometry->TracksPerCylinder = 64;
+ deviceExtension->DiskGeometry->Geometry.TracksPerCylinder = 64;
}
if (status == STATUS_VERIFY_REQUIRED) {
// except for the bytes per sector and sector shift.
//
- RtlZeroMemory(deviceExtension->DiskGeometry, sizeof(DISK_GEOMETRY));
- deviceExtension->DiskGeometry->BytesPerSector = 512;
+ RtlZeroMemory(deviceExtension->DiskGeometry, sizeof(DISK_GEOMETRY_EX));
+ deviceExtension->DiskGeometry->Geometry.BytesPerSector = 512;
deviceExtension->SectorShift = 9;
deviceExtension->PartitionLength.QuadPart = (LONGLONG) 0;
// This device supports removable media.
//
- deviceExtension->DiskGeometry->MediaType = RemovableMedia;
+ deviceExtension->DiskGeometry->Geometry.MediaType = RemovableMedia;
} else {
// Assume media type is fixed disk.
//
- deviceExtension->DiskGeometry->MediaType = FixedMedia;
+ deviceExtension->DiskGeometry->Geometry.MediaType = FixedMedia;
}
}
errorLogEntry->DeviceOffset.QuadPart = (LONGLONG) badSector;
errorLogEntry->DeviceOffset = RtlExtendedIntegerMultiply(
errorLogEntry->DeviceOffset,
- deviceExtension->DiskGeometry->BytesPerSector);
+ deviceExtension->DiskGeometry->Geometry.BytesPerSector);
}
errorLogEntry->ErrorCode = logStatus;
NTSTATUS status;
PDEVICE_OBJECT deviceObject = NULL;
PDEVICE_OBJECT physicalDevice;
- PDISK_GEOMETRY diskGeometry = NULL;
+ PDISK_GEOMETRY_EX diskGeometry = NULL;
PDEVICE_EXTENSION deviceExtension = NULL;
PDEVICE_EXTENSION physicalDeviceExtension;
UCHAR pathId = LunInfo->PathId;
// Allocate buffer for drive geometry.
//
- diskGeometry = ExAllocatePool(NonPagedPool, sizeof(DISK_GEOMETRY));
+ diskGeometry = ExAllocatePool(NonPagedPool, sizeof(DISK_GEOMETRY_EX));
if (diskGeometry == NULL) {
ULONG partitionNumber = 0;
NTSTATUS status;
PDEVICE_OBJECT deviceObject = NULL;
- PDISK_GEOMETRY diskGeometry = NULL;
+ PDISK_GEOMETRY_EX diskGeometry = NULL;
PDRIVE_LAYOUT_INFORMATION partitionList = NULL;
PDEVICE_EXTENSION deviceExtension;
PDEVICE_EXTENSION physicalDeviceExtension;
physicalDeviceExtension = PhysicalDeviceObject->DeviceExtension;
diskGeometry = physicalDeviceExtension->DiskGeometry;
- bytesPerSector = diskGeometry->BytesPerSector;
+ bytesPerSector = diskGeometry->Geometry.BytesPerSector;
//
// Make sure sector size is not zero.
// Default sector size for disk is 512.
//
- bytesPerSector = diskGeometry->BytesPerSector = 512;
+ bytesPerSector = diskGeometry->Geometry.BytesPerSector = 512;
}
sectorShift = physicalDeviceExtension->SectorShift;
//
HalExamineMBR(PhysicalDeviceObject,
- physicalDeviceExtension->DiskGeometry->BytesPerSector,
+ physicalDeviceExtension->DiskGeometry->Geometry.BytesPerSector,
(ULONG)0x54,
(PVOID)&dmSkew);
//
status = IoReadPartitionTable(PhysicalDeviceObject,
- physicalDeviceExtension->DiskGeometry->BytesPerSector,
+ physicalDeviceExtension->DiskGeometry->Geometry.BytesPerSector,
TRUE,
(PVOID)&partitionList);
//
deviceExtension->TimeOutValue = physicalDeviceExtension->TimeOutValue;
- deviceExtension->DiskGeometry->BytesPerSector = bytesPerSector;
+ deviceExtension->DiskGeometry->Geometry.BytesPerSector = bytesPerSector;
deviceExtension->SectorShift = sectorShift;
deviceExtension->DeviceObject = deviceObject;
deviceExtension->DeviceFlags |= physicalDeviceExtension->DeviceFlags;
transferByteCount);
if ((startingOffset.QuadPart > deviceExtension->PartitionLength.QuadPart) ||
- (transferByteCount & (deviceExtension->DiskGeometry->BytesPerSector - 1))) {
+ (transferByteCount & (deviceExtension->DiskGeometry->Geometry.BytesPerSector - 1))) {
//
// This error maybe caused by the fact that the drive is not ready.
}
case IOCTL_DISK_GET_DRIVE_GEOMETRY:
+ case IOCTL_DISK_GET_DRIVE_GEOMETRY_EX:
{
PDEVICE_EXTENSION physicalDeviceExtension;
BOOLEAN removable = FALSE;
BOOLEAN listInitialized = FALSE;
- if ( irpStack->Parameters.DeviceIoControl.OutputBufferLength <
- sizeof( DISK_GEOMETRY ) ) {
+ if ((irpStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_DISK_GET_DRIVE_GEOMETRY &&
+ irpStack->Parameters.DeviceIoControl.OutputBufferLength <
+ sizeof(DISK_GEOMETRY)) ||
+ (irpStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_DISK_GET_DRIVE_GEOMETRY_EX &&
+ irpStack->Parameters.DeviceIoControl.OutputBufferLength <
+ sizeof(DISK_GEOMETRY_EX))) {
status = STATUS_INFO_LENGTH_MISMATCH;
break;
RtlMoveMemory(Irp->AssociatedIrp.SystemBuffer,
deviceExtension->DiskGeometry,
- sizeof(DISK_GEOMETRY));
+ (irpStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_DISK_GET_DRIVE_GEOMETRY) ?
+ sizeof(DISK_GEOMETRY) :
+ sizeof(DISK_GEOMETRY_EX));
status = STATUS_SUCCESS;
- Irp->IoStatus.Information = sizeof(DISK_GEOMETRY);
+ Irp->IoStatus.Information =
+ (irpStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_DISK_GET_DRIVE_GEOMETRY) ?
+ sizeof(DISK_GEOMETRY) :
+ sizeof(DISK_GEOMETRY_EX);
}
break;
status = IoSetPartitionInformation(
deviceExtension->PhysicalDevice,
- deviceExtension->DiskGeometry->BytesPerSector,
+ deviceExtension->DiskGeometry->Geometry.BytesPerSector,
diskData->PartitionOrdinal,
inputBuffer->PartitionType);
//
status = IoReadPartitionTable(deviceExtension->PhysicalDevice,
- deviceExtension->DiskGeometry->BytesPerSector,
+ deviceExtension->DiskGeometry->Geometry.BytesPerSector,
FALSE,
&partitionList);
status = IoWritePartitionTable(
deviceExtension->DeviceObject,
- deviceExtension->DiskGeometry->BytesPerSector,
- deviceExtension->DiskGeometry->SectorsPerTrack,
- deviceExtension->DiskGeometry->TracksPerCylinder,
+ deviceExtension->DiskGeometry->Geometry.BytesPerSector,
+ deviceExtension->DiskGeometry->Geometry.SectorsPerTrack,
+ deviceExtension->DiskGeometry->Geometry.TracksPerCylinder,
partitionList);
}
// Get sector size.
//
- sectorSize = DeviceExtension->DiskGeometry->BytesPerSector;
+ sectorSize = DeviceExtension->DiskGeometry->Geometry.BytesPerSector;
//
// Make sure sector size is at least 512 bytes.
// Update the actual geometry information.
//
- DeviceExtension->DiskGeometry->SectorsPerTrack = sectorsPerTrack;
- DeviceExtension->DiskGeometry->TracksPerCylinder = tracksPerCylinder;
- DeviceExtension->DiskGeometry->Cylinders.QuadPart = (LONGLONG)cylinders;
+ DeviceExtension->DiskGeometry->Geometry.SectorsPerTrack = sectorsPerTrack;
+ DeviceExtension->DiskGeometry->Geometry.TracksPerCylinder = tracksPerCylinder;
+ DeviceExtension->DiskGeometry->Geometry.Cylinders.QuadPart = (LONGLONG)cylinders;
+ DeviceExtension->DiskGeometry->DiskSize.QuadPart = cylinders * tracksPerCylinder * sectorsPerTrack *
+ DeviceExtension->DiskGeometry->Geometry.BytesPerSector;
DebugPrint((3,
"SCSIDISK: UpdateGeometry: BIOS spt %x, #heads %x, #cylinders %x\n",
if (!DeviceExtension->DMActive) {
HalExamineMBR(DeviceExtension->DeviceObject,
- DeviceExtension->DiskGeometry->BytesPerSector,
+ DeviceExtension->DiskGeometry->Geometry.BytesPerSector,
(ULONG)0x55,
&tmpPtr
);
cylinders -= 1;
- DeviceExtension->DiskGeometry->Cylinders.QuadPart = cylinders + 1;
- DeviceExtension->DiskGeometry->TracksPerCylinder = tracksPerCylinder + 1;
+ DeviceExtension->DiskGeometry->Geometry.Cylinders.QuadPart = cylinders + 1;
+ DeviceExtension->DiskGeometry->Geometry.TracksPerCylinder = tracksPerCylinder + 1;
DeviceExtension->PartitionLength.QuadPart =
- DeviceExtension->DiskGeometry->Cylinders.QuadPart *
- DeviceExtension->DiskGeometry->SectorsPerTrack *
- DeviceExtension->DiskGeometry->BytesPerSector *
- DeviceExtension->DiskGeometry->TracksPerCylinder;
+ DeviceExtension->DiskGeometry->DiskSize.QuadPart =
+ DeviceExtension->DiskGeometry->Geometry.Cylinders.QuadPart *
+ DeviceExtension->DiskGeometry->Geometry.SectorsPerTrack *
+ DeviceExtension->DiskGeometry->Geometry.BytesPerSector *
+ DeviceExtension->DiskGeometry->Geometry.TracksPerCylinder;
if (DeviceExtension->DMActive) {
- DeviceExtension->DMByteSkew = DeviceExtension->DMSkew * DeviceExtension->DiskGeometry->BytesPerSector;
+ DeviceExtension->DMByteSkew = DeviceExtension->DMSkew * DeviceExtension->DiskGeometry->Geometry.BytesPerSector;
}
//
status = IoReadPartitionTable(deviceExtension->PhysicalDevice,
- deviceExtension->DiskGeometry->BytesPerSector,
+ deviceExtension->DiskGeometry->Geometry.BytesPerSector,
TRUE,
&partitionList);
PCLASS_CREATE_CLOSE ClassCreateClose;
PDRIVER_STARTIO ClassStartIo;
PIO_SCSI_CAPABILITIES PortCapabilities;
- PDISK_GEOMETRY DiskGeometry;
+ PDISK_GEOMETRY_EX DiskGeometry;
PDEVICE_OBJECT PhysicalDevice;
PSENSE_DATA SenseData;
ULONG TimeOutValue;