\f
NTSTATUS
-STDCALL
+NTAPI
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
);
BOOLEAN
-STDCALL
+NTAPI
ScsiDiskDeviceVerification(
IN PINQUIRYDATA InquiryData
);
BOOLEAN
-STDCALL
+NTAPI
FindScsiDisks(
IN PDRIVER_OBJECT DriveObject,
IN PUNICODE_STRING RegistryPath,
);
NTSTATUS
-STDCALL
+NTAPI
ScsiDiskCreateClose (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
-STDCALL
+NTAPI
ScsiDiskReadWriteVerification(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
-STDCALL
+NTAPI
ScsiDiskDeviceControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
VOID
-STDCALL
+NTAPI
ScsiDiskProcessError(
PDEVICE_OBJECT DeviceObject,
PSCSI_REQUEST_BLOCK Srb,
);
NTSTATUS
-STDCALL
+NTAPI
ScsiDiskShutdownFlush(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
VOID
-STDCALL
+NTAPI
DisableWriteCache(
IN PDEVICE_OBJECT DeviceObject,
IN PSCSI_INQUIRY_DATA LunInfo
);
BOOLEAN
-STDCALL
+NTAPI
ScsiDiskModeSelect(
IN PDEVICE_OBJECT DeviceObject,
IN PCHAR ModeSelectBuffer,
);
BOOLEAN
-STDCALL
+NTAPI
IsFloppyDevice(
IN PDEVICE_OBJECT DeviceObject
);
BOOLEAN
-STDCALL
+NTAPI
CalculateMbrCheckSum(
IN PDEVICE_EXTENSION DeviceExtension,
OUT PULONG Checksum
);
BOOLEAN
-STDCALL
+NTAPI
EnumerateBusKey(
IN PDEVICE_EXTENSION DeviceExtension,
HANDLE BusKey,
);
VOID
-STDCALL
+NTAPI
UpdateGeometry(
IN PDEVICE_EXTENSION DeviceExtension
);
NTSTATUS
-STDCALL
+NTAPI
UpdateRemovableGeometry (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
NTSTATUS
-STDCALL
+NTAPI
CreateDiskDeviceObject(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath,
);
NTSTATUS
-STDCALL
+NTAPI
CreatePartitionDeviceObjects(
IN PDEVICE_OBJECT PhysicalDeviceObject,
IN PUNICODE_STRING RegistryPath
);
VOID
-STDCALL
+NTAPI
UpdateDeviceObjects(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
);
VOID
-STDCALL
+NTAPI
ScanForSpecial(
PDEVICE_OBJECT DeviceObject,
PSCSI_INQUIRY_DATA LunInfo,
);
VOID
-STDCALL
+NTAPI
ResetScsiBus(
IN PDEVICE_OBJECT DeviceObject
);
\f
NTSTATUS
-STDCALL
+NTAPI
DriverEntry(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
\f
BOOLEAN
-STDCALL
+NTAPI
ScsiDiskDeviceVerification(
IN PINQUIRYDATA InquiryData
)
\f
BOOLEAN
-STDCALL
+NTAPI
FindScsiDisks(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath,
\f
NTSTATUS
-STDCALL
+NTAPI
CreateDiskDeviceObject(
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath,
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) {
\f
NTSTATUS
-STDCALL
+NTAPI
CreatePartitionDeviceObjects(
IN PDEVICE_OBJECT PhysicalDeviceObject,
IN PUNICODE_STRING RegistryPath
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;
\f
NTSTATUS
-STDCALL
+NTAPI
ScsiDiskReadWriteVerification(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
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.
\f
NTSTATUS
-STDCALL
+NTAPI
ScsiDiskDeviceControl(
PDEVICE_OBJECT DeviceObject,
PIRP Irp
break;
}
- length += (sizeof(SENDCMDOUTPARAMS) > sizeof(SENDCMDINPARAMS)) ? sizeof(SENDCMDOUTPARAMS) : sizeof(SENDCMDINPARAMS);;
+ length += (sizeof(SENDCMDOUTPARAMS) > sizeof(SENDCMDINPARAMS)) ? sizeof(SENDCMDOUTPARAMS) : sizeof(SENDCMDINPARAMS);
srbControl = ExAllocatePool(NonPagedPool,
sizeof(SRB_IO_CONTROL) + length);
}
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;
break;
+ case IOCTL_DISK_GET_PARTITION_INFO_EX:
+
+ //
+ // Return the information about the partition specified by the device
+ // object. Note that no information is ever returned about the size
+ // or partition type of the physical disk, as this doesn't make any
+ // sense.
+ //
+
+ if (irpStack->Parameters.DeviceIoControl.OutputBufferLength <
+ sizeof(PARTITION_INFORMATION_EX)) {
+
+ status = STATUS_INFO_LENGTH_MISMATCH;
+
+ }
+ else if (diskData->PartitionNumber == 0) {
+
+ //
+ // Paritition zero is not a partition so this is not a
+ // reasonable request.
+ //
+
+ status = STATUS_INVALID_DEVICE_REQUEST;
+
+ }
+ else {
+
+ PPARTITION_INFORMATION_EX outputBuffer;
+
+ //
+ // Update the geometry in case it has changed.
+ //
+
+ status = UpdateRemovableGeometry (DeviceObject, Irp);
+
+ if (!NT_SUCCESS(status)) {
+
+ //
+ // Note the drive is not ready.
+ //
+
+ diskData->DriveNotReady = TRUE;
+ break;
+ }
+
+ //
+ // Note the drive is now ready.
+ //
+
+ diskData->DriveNotReady = FALSE;
+
+ if (diskData->PartitionType == 0 && (diskData->PartitionNumber > 0)) {
+
+ status = STATUS_INVALID_DEVICE_REQUEST;
+ break;
+ }
+
+ outputBuffer =
+ (PPARTITION_INFORMATION_EX)Irp->AssociatedIrp.SystemBuffer;
+
+ //
+ // FIXME: hack of the year, assume that partition is MBR
+ // Thing that can obviously be wrong...
+ //
+
+ outputBuffer->PartitionStyle = PARTITION_STYLE_MBR;
+ outputBuffer->Mbr.PartitionType = diskData->PartitionType;
+ outputBuffer->StartingOffset = deviceExtension->StartingOffset;
+ outputBuffer->PartitionLength.QuadPart = deviceExtension->PartitionLength.QuadPart;
+ outputBuffer->Mbr.HiddenSectors = diskData->HiddenSectors;
+ outputBuffer->PartitionNumber = diskData->PartitionNumber;
+ outputBuffer->Mbr.BootIndicator = diskData->BootIndicator;
+ outputBuffer->RewritePartition = FALSE;
+ outputBuffer->Mbr.RecognizedPartition =
+ IsRecognizedPartition(diskData->PartitionType);
+
+ status = STATUS_SUCCESS;
+ Irp->IoStatus.Information = sizeof(PARTITION_INFORMATION_EX);
+ }
+
+ break;
+
case IOCTL_DISK_SET_PARTITION_INFO:
if (diskData->PartitionNumber == 0) {
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);
}
// Fall through and let the class driver process the request.
//
+ case IOCTL_DISK_GET_LENGTH_INFO:
+
+ //
+ // Validate buffer length.
+ //
+
+ if (irpStack->Parameters.DeviceIoControl.OutputBufferLength <
+ sizeof(GET_LENGTH_INFORMATION)) {
+ status = STATUS_BUFFER_TOO_SMALL;
+
+ } else {
+
+ PGET_LENGTH_INFORMATION lengthInformation = Irp->AssociatedIrp.SystemBuffer;
+
+ //
+ // Update the geometry in case it has changed.
+ //
+
+ status = UpdateRemovableGeometry (DeviceObject, Irp);
+
+ if (!NT_SUCCESS(status)) {
+
+ //
+ // Note the drive is not ready.
+ //
+
+ diskData->DriveNotReady = TRUE;
+ break;
+ }
+
+ //
+ // Note the drive is now ready.
+ //
+
+ diskData->DriveNotReady = FALSE;
+
+ //
+ // Output data, and return
+ //
+
+ lengthInformation->Length.QuadPart = deviceExtension->PartitionLength.QuadPart;
+ status = STATUS_SUCCESS;
+ Irp->IoStatus.Information = sizeof(GET_LENGTH_INFORMATION);
+ }
+
+ break;
+
default:
//
} // end ScsiDiskDeviceControl()
\f
NTSTATUS
-STDCALL
+NTAPI
ScsiDiskShutdownFlush (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
\f
BOOLEAN
-STDCALL
+NTAPI
IsFloppyDevice(
PDEVICE_OBJECT DeviceObject
)
\f
BOOLEAN
-STDCALL
+NTAPI
ScsiDiskModeSelect(
IN PDEVICE_OBJECT DeviceObject,
IN PCHAR ModeSelectBuffer,
\f
VOID
-STDCALL
+NTAPI
DisableWriteCache(
IN PDEVICE_OBJECT DeviceObject,
IN PSCSI_INQUIRY_DATA LunInfo
\f
BOOLEAN
-STDCALL
+NTAPI
CalculateMbrCheckSum(
IN PDEVICE_EXTENSION DeviceExtension,
OUT PULONG Checksum
// Get sector size.
//
- sectorSize = DeviceExtension->DiskGeometry->BytesPerSector;
+ sectorSize = DeviceExtension->DiskGeometry->Geometry.BytesPerSector;
//
// Make sure sector size is at least 512 bytes.
\f
BOOLEAN
-STDCALL
+NTAPI
EnumerateBusKey(
IN PDEVICE_EXTENSION DeviceExtension,
HANDLE BusKey,
\f
VOID
-STDCALL
+NTAPI
UpdateGeometry(
IN PDEVICE_EXTENSION DeviceExtension
)
// 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;
}
\f
NTSTATUS
-STDCALL
+NTAPI
UpdateRemovableGeometry (
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
//
status = IoReadPartitionTable(deviceExtension->PhysicalDevice,
- deviceExtension->DiskGeometry->BytesPerSector,
+ deviceExtension->DiskGeometry->Geometry.BytesPerSector,
TRUE,
&partitionList);
\f
VOID
-STDCALL
+NTAPI
ScsiDiskProcessError(
PDEVICE_OBJECT DeviceObject,
PSCSI_REQUEST_BLOCK Srb,
}
\f
VOID
-STDCALL
+NTAPI
ScanForSpecial(
PDEVICE_OBJECT DeviceObject,
PSCSI_INQUIRY_DATA LunInfo,
}
\f
VOID
-STDCALL
+NTAPI
ResetScsiBus(
IN PDEVICE_OBJECT DeviceObject
)
\f
VOID
-STDCALL
+NTAPI
UpdateDeviceObjects(
IN PDEVICE_OBJECT PhysicalDisk,
IN PIRP Irp