-/* $Id: disk.c,v 1.4 2002/01/31 14:58:12 ekohl Exp $
+/* $Id: disk.c,v 1.5 2002/02/03 20:21:45 ekohl Exp $
*
*/
BOOLEAN FoundDevice;
NTSTATUS Status;
- DPRINT1("DiskClassFindDevices() called.\n");
+ DPRINT("DiskClassFindDevices() called.\n");
/* Get port capabilities */
Status = ScsiClassGetCapabilities(PortDeviceObject,
return(FALSE);
}
- DPRINT1("MaximumTransferLength: %lu\n", PortCapabilities->MaximumTransferLength);
+ DPRINT("MaximumTransferLength: %lu\n", PortCapabilities->MaximumTransferLength);
/* Get inquiry data */
Status = ScsiClassGetInquiryData(PortDeviceObject,
ExFreePool(Buffer);
ExFreePool(PortCapabilities);
- DPRINT1("DiskClassFindDevices() done\n");
+ DPRINT("DiskClassFindDevices() done\n");
return(FoundDevice);
}
DiskClassCheckReadWrite(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
- DPRINT1("DiskClassCheckReadWrite() called\n");
+ DPRINT("DiskClassCheckReadWrite() called\n");
return(STATUS_SUCCESS);
}
WCHAR NameBuffer[80];
CHAR NameBuffer2[80];
PDEVICE_OBJECT DiskDeviceObject;
+ PDEVICE_OBJECT PartitionDeviceObject;
PDEVICE_EXTENSION DiskDeviceExtension; /* defined in class2.h */
+ PDEVICE_EXTENSION PartitionDeviceExtension; /* defined in class2.h */
PDRIVE_LAYOUT_INFORMATION PartitionList = NULL;
HANDLE Handle;
-
-#if 0
- IDE_DRIVE_IDENTIFY DrvParms;
- PDEVICE_OBJECT PartitionDeviceObject;
- ULONG SectorCount = 0;
-#endif
PPARTITION_INFORMATION PartitionEntry;
+ PDISK_DEVICE_EXTENSION DiskData;
ULONG PartitionNumber;
NTSTATUS Status;
- DPRINT1("DiskClassCreateDeviceObjects() called\n");
+ WCHAR ArcNameBuffer[120];
+ UNICODE_STRING ArcName;
+ ANSI_STRING DeviceNameA;
+ UNICODE_STRING DeviceName;
+
+ DPRINT1("DiskClassCreateDeviceObject() called\n");
/* Create the harddisk device directory */
swprintf(NameBuffer,
- L"\\Device\\Harddisk%d",
+ L"\\Device\\Harddisk%lu",
DiskNumber);
RtlInitUnicodeString(&UnicodeDeviceDirName,
NameBuffer);
/* Create disk device (Partition 0) */
sprintf(NameBuffer2,
- "\\Device\\Harddisk%d\\Partition0",
+ "\\Device\\Harddisk%lu\\Partition0",
DiskNumber);
Status = ScsiClassCreateDeviceObject(DriverObject,
}
DiskDeviceExtension = DiskDeviceObject->DeviceExtension;
+// DiskData = (PDISK_DEVICE_EXTENSION)((PUCHAR)DiskDeviceExtension + sizeof(DEVICE_EXTENSION));
DiskDeviceExtension->LockCount = 0;
DiskDeviceExtension->DeviceNumber = DiskNumber;
DPRINT1("SectorSize: %lu\n", DiskDeviceExtension->DiskGeometry->BytesPerSector);
+ /* assign arc name */
+ RtlInitAnsiString(&DeviceNameA,
+ NameBuffer2);
+ RtlAnsiStringToUnicodeString(&DeviceName,
+ &DeviceNameA,
+ TRUE);
+ swprintf(ArcNameBuffer,
+ L"\\ArcName\\multi(0)disk(0)rdisk(%lu)",
+ DiskNumber);
+ RtlInitUnicodeString(&ArcName,
+ ArcNameBuffer);
+ DPRINT1("ArcNameBuffer '%S'\n", ArcNameBuffer);
+ DPRINT1("%wZ ==> %wZ\n", &ArcName, &DeviceName);
+ Status = IoAssignArcName(&ArcName,
+ &DeviceName);
+ RtlFreeUnicodeString(&DeviceName);
+
+ if (!NT_SUCCESS(Status))
+ {
+ DbgPrint("IoAssignArcName (%wZ) failed (Status %x)\n", &ArcName, Status);
+ KeBugCheck(0);
+ }
+
+
/* Read partition table */
Status = IoReadPartitionTable(DiskDeviceObject,
DiskDeviceExtension->DiskGeometry->BytesPerSector,
PartitionEntry->StartingOffset.QuadPart / 512 /*DrvParms.BytesPerSector*/,
PartitionEntry->PartitionLength.QuadPart / 512 /* DrvParms.BytesPerSector*/);
-#if 0
- /* Create device for partition */
- Status = IDECreateDevice(DriverObject,
- &PartitionDeviceObject,
- ControllerObject,
- DriveIdx,
- HarddiskIdx,
- &DrvParms,
- PartitionEntry->PartitionNumber,
- PartitionEntry->StartingOffset.QuadPart / 512 /* DrvParms.BytesPerSector*/,
- PartitionEntry->PartitionLength.QuadPart / 512 /*DrvParms.BytesPerSector*/);
- if (!NT_SUCCESS(Status))
- {
- DbgPrint("IDECreateDevice() failed\n");
- break;
- }
-
- /* Initialize pointer to disk device extension */
- PartitionDeviceExtension = (PIDE_DEVICE_EXTENSION)PartitionDeviceObject->DeviceExtension;
- PartitionDeviceExtension->DiskExtension = (PVOID)DiskDeviceExtension;
-#endif
+ /* Create partition device (Partition 0) */
+ sprintf(NameBuffer2,
+ "\\Device\\Harddisk%lu\\Partition%lu",
+ DiskNumber,
+ PartitionNumber + 1);
+
+ Status = ScsiClassCreateDeviceObject(DriverObject,
+ NameBuffer2,
+ DiskDeviceObject,
+ &PartitionDeviceObject,
+ InitializationData);
+ DPRINT1("ScsiClassCreateDeviceObject(): Status %x\n", Status);
+ if (NT_SUCCESS(Status))
+ {
+ PartitionDeviceObject->Flags = DiskDeviceObject->Flags;
+ PartitionDeviceObject->Characteristics = DiskDeviceObject->Characteristics;
+ PartitionDeviceObject->StackSize = DiskDeviceObject->StackSize;
+ PartitionDeviceObject->AlignmentRequirement = DiskDeviceObject->AlignmentRequirement;
+
+ PartitionDeviceExtension = PartitionDeviceObject->DeviceExtension;
+ PartitionDeviceExtension->LockCount = 0;
+ PartitionDeviceExtension->DeviceNumber = DiskNumber;
+ PartitionDeviceExtension->PortDeviceObject = PortDeviceObject;
+
+ /* FIXME: Not yet! Will cause pointer corruption! */
+// PartitionDeviceExtension->PortCapabilities = PortCapabilities;
+
+ PartitionDeviceExtension->StartingOffset.QuadPart =
+ PartitionEntry->StartingOffset.QuadPart;
+ PartitionDeviceExtension->PartitionLength.QuadPart =
+ PartitionEntry->PartitionLength.QuadPart;
+ PartitionDeviceExtension->PortNumber = (UCHAR)PortNumber;
+ PartitionDeviceExtension->PathId = InquiryData->PathId;
+ PartitionDeviceExtension->TargetId = InquiryData->TargetId;
+ PartitionDeviceExtension->Lun = InquiryData->Lun;
+
+
+ /* assign arc name */
+ RtlInitAnsiString(&DeviceNameA,
+ NameBuffer2);
+ RtlAnsiStringToUnicodeString(&DeviceName,
+ &DeviceNameA,
+ TRUE);
+ swprintf(ArcNameBuffer,
+ L"\\ArcName\\multi(0)disk(0)rdisk(%lu)partition(%lu)",
+ DiskNumber,
+ PartitionNumber + 1);
+ RtlInitUnicodeString(&ArcName,
+ ArcNameBuffer);
+ DPRINT1("ArcNameBuffer '%S'\n", ArcNameBuffer);
+ DPRINT1("%wZ ==> %wZ\n", &ArcName, &DeviceName);
+ Status = IoAssignArcName(&ArcName,
+ &DeviceName);
+ RtlFreeUnicodeString(&DeviceName);
+
+ if (!NT_SUCCESS(Status))
+ {
+ DbgPrint("IoAssignArcName (%wZ) failed (Status %x)\n", &ArcName, Status);
+ KeBugCheck(0);
+ }
+
+ }
+ else
+ {
+ DPRINT1("ScsiClassCreateDeviceObject() failed (Status %x)\n", Status);
+
+ break;
+ }
}
- ExFreePool(PartitionList);
}
+ if (PartitionList != NULL)
+ ExFreePool(PartitionList);
+
DPRINT1("DiskClassCreateDeviceObjects() done\n");
return(STATUS_SUCCESS);
DiskClassDeviceControl(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
- DPRINT("DiskClassDeviceControl() called!\n");
+ PDEVICE_EXTENSION DeviceExtension;
+ PIO_STACK_LOCATION IrpStack;
+ ULONG ControlCode, InputLength, OutputLength;
+ NTSTATUS Status;
-#if 0
- NTSTATUS RC;
- ULONG ControlCode, InputLength, OutputLength;
- PIO_STACK_LOCATION IrpStack;
- PIDE_DEVICE_EXTENSION DeviceExtension;
+ DPRINT1("DiskClassDeviceControl() called!\n");
- RC = STATUS_SUCCESS;
+ Status = STATUS_SUCCESS;
IrpStack = IoGetCurrentIrpStackLocation(Irp);
ControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode;
InputLength = IrpStack->Parameters.DeviceIoControl.InputBufferLength;
OutputLength = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;
- DeviceExtension = (PIDE_DEVICE_EXTENSION) DeviceObject->DeviceExtension;
+ DeviceExtension = (PDEVICE_EXTENSION) DeviceObject->DeviceExtension;
- // A huge switch statement in a Windows program?! who would have thought?
- switch (ControlCode)
+ /* A huge switch statement in a Windows program?! who would have thought? */
+ switch (ControlCode)
{
- case IOCTL_DISK_GET_DRIVE_GEOMETRY:
- if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(DISK_GEOMETRY))
- {
- Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
- }
- else
- {
- PDISK_GEOMETRY Geometry;
-
- Geometry = (PDISK_GEOMETRY) Irp->AssociatedIrp.SystemBuffer;
+ case IOCTL_DISK_GET_DRIVE_GEOMETRY:
+ if (IrpStack->Parameters.DeviceIoControl.OutputBufferLength < sizeof(DISK_GEOMETRY))
+ {
+ Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
+ Irp->IoStatus.Information = 0;
+ }
+ else
+ {
+ PDISK_GEOMETRY Geometry;
+
+ Geometry = (PDISK_GEOMETRY) Irp->AssociatedIrp.SystemBuffer;
+ RtlMoveMemory(Geometry,
+ DeviceExtension->DiskGeometry,
+ sizeof(DISK_GEOMETRY));
+
+#if 0
+
+ RtlCopyMemory(DiskData->Geometry,
+ DiskDeviceExtension->DiskGeometry,
+ sizeof(DISK_GEOMETRY));
Geometry->MediaType = FixedMedia;
// FIXME: should report for RawDevice even on partition
Geometry->Cylinders.QuadPart = DeviceExtension->Size /
DeviceExtension->SectorsPerLogCyl;
Geometry->SectorsPerTrack = DeviceExtension->SectorsPerLogTrk;
Geometry->BytesPerSector = DeviceExtension->BytesPerSector;
-
- Irp->IoStatus.Status = STATUS_SUCCESS;
- Irp->IoStatus.Information = sizeof(DISK_GEOMETRY);
- }
- break;
-
- case IOCTL_DISK_GET_PARTITION_INFO:
- case IOCTL_DISK_SET_PARTITION_INFO:
- case IOCTL_DISK_GET_DRIVE_LAYOUT:
- case IOCTL_DISK_SET_DRIVE_LAYOUT:
- case IOCTL_DISK_VERIFY:
- case IOCTL_DISK_FORMAT_TRACKS:
- case IOCTL_DISK_PERFORMANCE:
- case IOCTL_DISK_IS_WRITABLE:
- case IOCTL_DISK_LOGGING:
- case IOCTL_DISK_FORMAT_TRACKS_EX:
- case IOCTL_DISK_HISTOGRAM_STRUCTURE:
- case IOCTL_DISK_HISTOGRAM_DATA:
- case IOCTL_DISK_HISTOGRAM_RESET:
- case IOCTL_DISK_REQUEST_STRUCTURE:
- case IOCTL_DISK_REQUEST_DATA:
-
- // If we get here, something went wrong. inform the requestor
- default:
- RC = STATUS_INVALID_DEVICE_REQUEST;
- Irp->IoStatus.Status = RC;
- Irp->IoStatus.Information = 0;
- break;
- }
-
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
- return RC;
#endif
+ Irp->IoStatus.Status = STATUS_SUCCESS;
+ Irp->IoStatus.Information = sizeof(DISK_GEOMETRY);
+ }
+ break;
+
+ case IOCTL_DISK_GET_PARTITION_INFO:
+ case IOCTL_DISK_SET_PARTITION_INFO:
+ case IOCTL_DISK_GET_DRIVE_LAYOUT:
+ case IOCTL_DISK_SET_DRIVE_LAYOUT:
+ case IOCTL_DISK_VERIFY:
+ case IOCTL_DISK_FORMAT_TRACKS:
+ case IOCTL_DISK_PERFORMANCE:
+ case IOCTL_DISK_IS_WRITABLE:
+ case IOCTL_DISK_LOGGING:
+ case IOCTL_DISK_FORMAT_TRACKS_EX:
+ case IOCTL_DISK_HISTOGRAM_STRUCTURE:
+ case IOCTL_DISK_HISTOGRAM_DATA:
+ case IOCTL_DISK_HISTOGRAM_RESET:
+ case IOCTL_DISK_REQUEST_STRUCTURE:
+ case IOCTL_DISK_REQUEST_DATA:
+
+ /* If we get here, something went wrong. inform the requestor */
+ default:
+ DPRINT1("Unhandled control code: %lx\n", ControlCode);
+ Status = STATUS_INVALID_DEVICE_REQUEST;
+ Irp->IoStatus.Status = Status;
+ Irp->IoStatus.Information = 0;
+ break;
+ }
- Irp->IoStatus.Status = STATUS_SUCCESS;
- Irp->IoStatus.Information = 0;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ IoCompleteRequest(Irp,
+ IO_NO_INCREMENT);
- return(STATUS_SUCCESS);
+ return(Status);
}