1 /* $Id: disk.c,v 1.7 2002/03/04 22:31:35 ekohl Exp $
5 /* INCLUDES *****************************************************************/
9 #include "../include/scsi.h"
10 #include "../include/class2.h"
11 #include "../include/ntddscsi.h"
16 #define VERSION "V0.0.1"
19 typedef struct _DISK_DATA
22 ULONG PartitionNumber
;
24 BOOLEAN BootIndicator
;
25 BOOLEAN DriveNotReady
;
26 } DISK_DATA
, *PDISK_DATA
;
30 DiskClassFindDevices(PDRIVER_OBJECT DriverObject
,
31 PUNICODE_STRING RegistryPath
,
32 PCLASS_INIT_DATA InitializationData
,
33 PDEVICE_OBJECT PortDeviceObject
,
37 DiskClassCheckDevice(IN PINQUIRYDATA InquiryData
);
40 DiskClassCheckReadWrite(IN PDEVICE_OBJECT DeviceObject
,
45 DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject
,
46 IN PUNICODE_STRING RegistryPath
, /* what's this used for? */
47 IN PDEVICE_OBJECT PortDeviceObject
,
50 IN PIO_SCSI_CAPABILITIES Capabilities
,
51 IN PSCSI_INQUIRY_DATA InquiryData
,
52 IN PCLASS_INIT_DATA InitializationData
);
55 DiskClassDeviceControl(IN PDEVICE_OBJECT DeviceObject
,
59 DiskClassShutdownFlush(IN PDEVICE_OBJECT DeviceObject
,
64 /* FUNCTIONS ****************************************************************/
69 // This function initializes the driver, locates and claims
70 // hardware resources, and creates various NT objects needed
71 // to process I/O requests.
77 // IN PDRIVER_OBJECT DriverObject System allocated Driver Object
79 // IN PUNICODE_STRING RegistryPath Name of registry driver service
86 DriverEntry(IN PDRIVER_OBJECT DriverObject
,
87 IN PUNICODE_STRING RegistryPath
)
89 CLASS_INIT_DATA InitData
;
91 DbgPrint("Disk Class Driver %s\n",
93 DPRINT("RegistryPath '%wZ'\n",
96 RtlZeroMemory(&InitData
,
97 sizeof(CLASS_INIT_DATA
));
99 InitData
.InitializationDataSize
= sizeof(CLASS_INIT_DATA
);
100 InitData
.DeviceExtensionSize
= sizeof(DEVICE_EXTENSION
) + sizeof(DISK_DATA
);
101 InitData
.DeviceType
= FILE_DEVICE_DISK
;
102 InitData
.DeviceCharacteristics
= 0;
104 InitData
.ClassError
= NULL
; // DiskClassProcessError;
105 InitData
.ClassReadWriteVerification
= DiskClassCheckReadWrite
;
106 InitData
.ClassFindDeviceCallBack
= DiskClassCheckDevice
;
107 InitData
.ClassFindDevices
= DiskClassFindDevices
;
108 InitData
.ClassDeviceControl
= DiskClassDeviceControl
;
109 InitData
.ClassShutdownFlush
= DiskClassShutdownFlush
;
110 InitData
.ClassCreateClose
= NULL
;
111 InitData
.ClassStartIo
= NULL
;
113 return(ScsiClassInitialize(DriverObject
,
119 /**********************************************************************
121 * DiskClassFindDevices
124 * This function searches for device that are attached to the
132 * System allocated Driver Object for this driver
135 * Name of registry driver service key
138 * Pointer to the main initialization data
141 * Pointer to the port Device Object
147 * TRUE: At least one disk drive was found
148 * FALSE: No disk drive found
152 DiskClassFindDevices(PDRIVER_OBJECT DriverObject
,
153 PUNICODE_STRING RegistryPath
,
154 PCLASS_INIT_DATA InitializationData
,
155 PDEVICE_OBJECT PortDeviceObject
,
158 PCONFIGURATION_INFORMATION ConfigInfo
;
159 PIO_SCSI_CAPABILITIES PortCapabilities
;
160 PSCSI_ADAPTER_BUS_INFO AdapterBusInfo
;
161 PSCSI_INQUIRY_DATA UnitInfo
;
162 PINQUIRYDATA InquiryData
;
169 DPRINT("DiskClassFindDevices() called.\n");
171 /* Get port capabilities */
172 Status
= ScsiClassGetCapabilities(PortDeviceObject
,
174 if (!NT_SUCCESS(Status
))
176 DPRINT("ScsiClassGetCapabilities() failed! (Status 0x%lX)\n", Status
);
180 DPRINT("MaximumTransferLength: %lu\n", PortCapabilities
->MaximumTransferLength
);
182 /* Get inquiry data */
183 Status
= ScsiClassGetInquiryData(PortDeviceObject
,
184 (PSCSI_ADAPTER_BUS_INFO
*)&Buffer
);
185 if (!NT_SUCCESS(Status
))
187 DPRINT("ScsiClassGetInquiryData() failed! (Status %x)\n", Status
);
191 /* Check whether there are unclaimed devices */
192 AdapterBusInfo
= (PSCSI_ADAPTER_BUS_INFO
)Buffer
;
193 DeviceCount
= ScsiClassFindUnclaimedDevices(InitializationData
,
195 if (DeviceCount
== 0)
197 DPRINT1("No unclaimed devices!\n");
201 DPRINT1("Found %lu unclaimed devices!\n", DeviceCount
);
203 ConfigInfo
= IoGetConfigurationInformation();
205 /* Search each bus of this adapter */
206 for (Bus
= 0; Bus
< (ULONG
)AdapterBusInfo
->NumberOfBuses
; Bus
++)
208 DPRINT("Searching bus %lu\n", Bus
);
210 UnitInfo
= (PSCSI_INQUIRY_DATA
)(Buffer
+ AdapterBusInfo
->BusData
[Bus
].InquiryDataOffset
);
212 while (AdapterBusInfo
->BusData
[Bus
].InquiryDataOffset
)
214 InquiryData
= (PINQUIRYDATA
)UnitInfo
->InquiryData
;
216 if (((InquiryData
->DeviceType
== DIRECT_ACCESS_DEVICE
) ||
217 (InquiryData
->DeviceType
== OPTICAL_DEVICE
)) &&
218 (InquiryData
->DeviceTypeQualifier
== 0) &&
219 (UnitInfo
->DeviceClaimed
== FALSE
))
221 DPRINT1("Vendor: '%.24s'\n",
222 InquiryData
->VendorId
);
224 /* Create device objects for disk */
225 Status
= DiskClassCreateDeviceObject(DriverObject
,
229 ConfigInfo
->DiskCount
,
233 if (NT_SUCCESS(Status
))
235 ConfigInfo
->DiskCount
++;
240 if (UnitInfo
->NextInquiryDataOffset
== 0)
243 UnitInfo
= (PSCSI_INQUIRY_DATA
)(Buffer
+ UnitInfo
->NextInquiryDataOffset
);
248 ExFreePool(PortCapabilities
);
250 DPRINT("DiskClassFindDevices() done\n");
256 /**********************************************************************
258 * DiskClassCheckDevice
261 * This function checks the InquiryData for the correct device
262 * type and qualifier.
269 * Pointer to the inquiry data for the device in question.
272 * TRUE: A disk device was found.
277 DiskClassCheckDevice(IN PINQUIRYDATA InquiryData
)
279 return((InquiryData
->DeviceType
== DIRECT_ACCESS_DEVICE
||
280 InquiryData
->DeviceType
== OPTICAL_DEVICE
) &&
281 InquiryData
->DeviceTypeQualifier
== 0);
286 DiskClassCheckReadWrite(IN PDEVICE_OBJECT DeviceObject
,
289 DPRINT("DiskClassCheckReadWrite() called\n");
291 return(STATUS_SUCCESS
);
295 // DiskClassCreateDeviceObject
298 // Create the raw device and any partition devices on this drive
304 // IN PDRIVER_OBJECT DriverObject The system created driver object
305 // IN PCONTROLLER_OBJECT ControllerObject
306 // IN PIDE_CONTROLLER_EXTENSION ControllerExtension
307 // The IDE controller extension for
309 // IN int DriveIdx The index of the drive on this
311 // IN int HarddiskIdx The NT device number for this
315 // TRUE Drive exists and devices were created
316 // FALSE no devices were created for this device
320 DiskClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject
,
321 IN PUNICODE_STRING RegistryPath
, /* what's this used for? */
322 IN PDEVICE_OBJECT PortDeviceObject
,
325 IN PIO_SCSI_CAPABILITIES Capabilities
,
326 IN PSCSI_INQUIRY_DATA InquiryData
,
327 IN PCLASS_INIT_DATA InitializationData
)
329 OBJECT_ATTRIBUTES ObjectAttributes
;
330 UNICODE_STRING UnicodeDeviceDirName
;
331 WCHAR NameBuffer
[80];
332 CHAR NameBuffer2
[80];
333 PDEVICE_OBJECT DiskDeviceObject
;
334 PDEVICE_OBJECT PartitionDeviceObject
;
335 PDEVICE_EXTENSION DiskDeviceExtension
; /* defined in class2.h */
336 PDEVICE_EXTENSION PartitionDeviceExtension
; /* defined in class2.h */
337 PDRIVE_LAYOUT_INFORMATION PartitionList
= NULL
;
339 PPARTITION_INFORMATION PartitionEntry
;
341 ULONG PartitionNumber
;
344 WCHAR ArcNameBuffer
[120];
345 UNICODE_STRING ArcName
;
346 ANSI_STRING DeviceNameA
;
347 UNICODE_STRING DeviceName
;
349 DPRINT1("DiskClassCreateDeviceObject() called\n");
351 /* Create the harddisk device directory */
353 L
"\\Device\\Harddisk%lu",
355 RtlInitUnicodeString(&UnicodeDeviceDirName
,
357 InitializeObjectAttributes(&ObjectAttributes
,
358 &UnicodeDeviceDirName
,
362 Status
= ZwCreateDirectoryObject(&Handle
,
365 if (!NT_SUCCESS(Status
))
367 DbgPrint("Could not create device dir object\n");
371 /* Claim the disk device */
372 Status
= ScsiClassClaimDevice(PortDeviceObject
,
376 if (!NT_SUCCESS(Status
))
378 DbgPrint("Could not claim disk device\n");
380 ZwMakeTemporaryObject(Handle
);
386 /* Create disk device (Partition 0) */
388 "\\Device\\Harddisk%lu\\Partition0",
391 Status
= ScsiClassCreateDeviceObject(DriverObject
,
396 if (!NT_SUCCESS(Status
))
398 DPRINT1("ScsiClassCreateDeviceObject() failed (Status %x)\n", Status
);
400 /* Release (unclaim) the disk */
401 ScsiClassClaimDevice(PortDeviceObject
,
406 /* Delete the harddisk device directory */
407 ZwMakeTemporaryObject(Handle
);
413 DiskDeviceObject
->Flags
|= DO_DIRECT_IO
;
414 if (((PINQUIRYDATA
)InquiryData
->InquiryData
)->RemovableMedia
)
416 DiskDeviceObject
->Characteristics
|= FILE_REMOVABLE_MEDIA
;
418 DiskDeviceObject
->StackSize
= (CCHAR
)PortDeviceObject
->StackSize
+ 1;
420 if (PortDeviceObject
->AlignmentRequirement
> DiskDeviceObject
->AlignmentRequirement
)
422 DiskDeviceObject
->AlignmentRequirement
= PortDeviceObject
->AlignmentRequirement
;
425 DiskDeviceExtension
= DiskDeviceObject
->DeviceExtension
;
426 DiskDeviceExtension
->LockCount
= 0;
427 DiskDeviceExtension
->DeviceNumber
= DiskNumber
;
428 DiskDeviceExtension
->PortDeviceObject
= PortDeviceObject
;
430 /* FIXME: Not yet! Will cause pointer corruption! */
431 // DiskDeviceExtension->PortCapabilities = PortCapabilities;
433 DiskDeviceExtension
->StartingOffset
.QuadPart
= 0;
434 DiskDeviceExtension
->PortNumber
= (UCHAR
)PortNumber
;
435 DiskDeviceExtension
->PathId
= InquiryData
->PathId
;
436 DiskDeviceExtension
->TargetId
= InquiryData
->TargetId
;
437 DiskDeviceExtension
->Lun
= InquiryData
->Lun
;
439 /* zero-out disk data */
440 DiskData
= (PDISK_DATA
)(DiskDeviceExtension
+ 1);
441 RtlZeroMemory(DiskData
,
444 /* Get disk geometry */
445 DiskDeviceExtension
->DiskGeometry
= ExAllocatePool(NonPagedPool
,
446 sizeof(DISK_GEOMETRY
));
447 if (DiskDeviceExtension
->DiskGeometry
== NULL
)
449 DPRINT1("Failed to allocate geometry buffer!\n");
451 IoDeleteDevice(DiskDeviceObject
);
453 /* Release (unclaim) the disk */
454 ScsiClassClaimDevice(PortDeviceObject
,
459 /* Delete the harddisk device directory */
460 ZwMakeTemporaryObject(Handle
);
463 return(STATUS_INSUFFICIENT_RESOURCES
);
466 /* Read the drive's capacity */
467 Status
= ScsiClassReadDriveCapacity(DiskDeviceObject
);
468 if (!NT_SUCCESS(Status
) &&
469 (DiskDeviceObject
->Characteristics
& FILE_REMOVABLE_MEDIA
) == 0)
471 DPRINT1("Failed to retrieve drive capacity!\n");
472 return(STATUS_SUCCESS
);
476 /* Clear the verify flag for non-removable media drives. */
477 DiskDeviceObject
->Flags
&= ~DO_VERIFY_VOLUME
;
480 DPRINT1("SectorSize: %lu\n", DiskDeviceExtension
->DiskGeometry
->BytesPerSector
);
482 /* assign arc name */
483 RtlInitAnsiString(&DeviceNameA
,
485 RtlAnsiStringToUnicodeString(&DeviceName
,
488 swprintf(ArcNameBuffer
,
489 L
"\\ArcName\\multi(0)disk(0)rdisk(%lu)",
491 RtlInitUnicodeString(&ArcName
,
493 DPRINT1("ArcNameBuffer '%S'\n", ArcNameBuffer
);
494 DPRINT1("%wZ ==> %wZ\n", &ArcName
, &DeviceName
);
495 Status
= IoAssignArcName(&ArcName
,
497 RtlFreeUnicodeString(&DeviceName
);
499 if (!NT_SUCCESS(Status
))
501 DbgPrint("IoAssignArcName (%wZ) failed (Status %x)\n", &ArcName
, Status
);
506 /* Read partition table */
507 Status
= IoReadPartitionTable(DiskDeviceObject
,
508 DiskDeviceExtension
->DiskGeometry
->BytesPerSector
,
512 DPRINT1("IoReadPartitionTable(): Status: %lx\n", Status
);
514 if ((!NT_SUCCESS(Status
) || PartitionList
->PartitionCount
== 0) &&
515 DiskDeviceObject
->Characteristics
& FILE_REMOVABLE_MEDIA
)
517 if (!NT_SUCCESS(Status
))
519 /* Drive is not ready. */
520 DPRINT1("Drive not ready\n");
521 DiskData
->DriveNotReady
= TRUE
;
525 ExFreePool(PartitionList
);
528 /* Allocate a partition list for a single entry. */
529 PartitionList
= ExAllocatePool(NonPagedPool
,
530 sizeof(DRIVE_LAYOUT_INFORMATION
));
531 if (PartitionList
!= NULL
)
533 RtlZeroMemory(PartitionList
,
534 sizeof(DRIVE_LAYOUT_INFORMATION
));
535 PartitionList
->PartitionCount
= 1;
537 Status
= STATUS_SUCCESS
;
541 if (NT_SUCCESS(Status
))
543 DPRINT1("Read partition table!\n");
545 DPRINT(" Number of partitions: %u\n", PartitionList
->PartitionCount
);
547 for (PartitionNumber
= 0; PartitionNumber
< PartitionList
->PartitionCount
; PartitionNumber
++)
549 PartitionEntry
= &PartitionList
->PartitionEntry
[PartitionNumber
];
551 DPRINT1("Partition %02ld: nr: %d boot: %1x type: %x offset: %I64d size: %I64d\n",
553 PartitionEntry
->PartitionNumber
,
554 PartitionEntry
->BootIndicator
,
555 PartitionEntry
->PartitionType
,
556 PartitionEntry
->StartingOffset
.QuadPart
/ 512 /*DrvParms.BytesPerSector*/,
557 PartitionEntry
->PartitionLength
.QuadPart
/ 512 /* DrvParms.BytesPerSector*/);
559 /* Create partition device (Partition 0) */
561 "\\Device\\Harddisk%lu\\Partition%lu",
563 PartitionNumber
+ 1);
565 Status
= ScsiClassCreateDeviceObject(DriverObject
,
568 &PartitionDeviceObject
,
570 DPRINT1("ScsiClassCreateDeviceObject(): Status %x\n", Status
);
571 if (NT_SUCCESS(Status
))
573 PartitionDeviceObject
->Flags
= DiskDeviceObject
->Flags
;
574 PartitionDeviceObject
->Characteristics
= DiskDeviceObject
->Characteristics
;
575 PartitionDeviceObject
->StackSize
= DiskDeviceObject
->StackSize
;
576 PartitionDeviceObject
->AlignmentRequirement
= DiskDeviceObject
->AlignmentRequirement
;
578 PartitionDeviceExtension
= PartitionDeviceObject
->DeviceExtension
;
579 PartitionDeviceExtension
->LockCount
= 0;
580 PartitionDeviceExtension
->DeviceNumber
= DiskNumber
;
581 PartitionDeviceExtension
->PortDeviceObject
= PortDeviceObject
;
582 PartitionDeviceExtension
->DiskGeometry
= DiskDeviceExtension
->DiskGeometry
;
584 /* FIXME: Not yet! Will cause pointer corruption! */
585 // PartitionDeviceExtension->PortCapabilities = PortCapabilities;
587 PartitionDeviceExtension
->StartingOffset
.QuadPart
=
588 PartitionEntry
->StartingOffset
.QuadPart
;
589 PartitionDeviceExtension
->PartitionLength
.QuadPart
=
590 PartitionEntry
->PartitionLength
.QuadPart
;
591 PartitionDeviceExtension
->PortNumber
= (UCHAR
)PortNumber
;
592 PartitionDeviceExtension
->PathId
= InquiryData
->PathId
;
593 PartitionDeviceExtension
->TargetId
= InquiryData
->TargetId
;
594 PartitionDeviceExtension
->Lun
= InquiryData
->Lun
;
596 DiskData
= (PDISK_DATA
)(PartitionDeviceExtension
+ 1);
597 DiskData
->PartitionType
= PartitionEntry
->PartitionType
;
598 DiskData
->PartitionNumber
= PartitionNumber
+ 1;
599 DiskData
->HiddenSectors
= PartitionEntry
->HiddenSectors
;
600 DiskData
->BootIndicator
= PartitionEntry
->BootIndicator
;
601 DiskData
->DriveNotReady
= FALSE
;
604 /* assign arc name */
605 RtlInitAnsiString(&DeviceNameA
,
607 RtlAnsiStringToUnicodeString(&DeviceName
,
610 swprintf(ArcNameBuffer
,
611 L
"\\ArcName\\multi(0)disk(0)rdisk(%lu)partition(%lu)",
613 PartitionNumber
+ 1);
614 RtlInitUnicodeString(&ArcName
,
616 DPRINT1("ArcNameBuffer '%S'\n", ArcNameBuffer
);
617 DPRINT1("%wZ ==> %wZ\n", &ArcName
, &DeviceName
);
618 Status
= IoAssignArcName(&ArcName
,
620 RtlFreeUnicodeString(&DeviceName
);
622 if (!NT_SUCCESS(Status
))
624 DbgPrint("IoAssignArcName (%wZ) failed (Status %x)\n", &ArcName
, Status
);
631 DPRINT1("ScsiClassCreateDeviceObject() failed to create partition device object (Status %x)\n", Status
);
640 if (PartitionList
!= NULL
)
641 ExFreePool(PartitionList
);
643 DPRINT1("DiskClassCreateDeviceObjects() done\n");
645 return(STATUS_SUCCESS
);
652 // DiskClassDeviceControl
655 // Answer requests for device control calls
661 // Standard dispatch arguments
668 DiskClassDeviceControl(IN PDEVICE_OBJECT DeviceObject
,
671 PDEVICE_EXTENSION DeviceExtension
;
672 PIO_STACK_LOCATION IrpStack
;
673 ULONG ControlCode
, InputLength
, OutputLength
;
677 DPRINT1("DiskClassDeviceControl() called!\n");
679 Status
= STATUS_SUCCESS
;
680 IrpStack
= IoGetCurrentIrpStackLocation(Irp
);
681 ControlCode
= IrpStack
->Parameters
.DeviceIoControl
.IoControlCode
;
682 InputLength
= IrpStack
->Parameters
.DeviceIoControl
.InputBufferLength
;
683 OutputLength
= IrpStack
->Parameters
.DeviceIoControl
.OutputBufferLength
;
684 DeviceExtension
= (PDEVICE_EXTENSION
) DeviceObject
->DeviceExtension
;
685 DiskData
= (PDISK_DATA
)(DeviceExtension
+ 1);
687 /* A huge switch statement in a Windows program?! who would have thought? */
690 case IOCTL_DISK_GET_DRIVE_GEOMETRY
:
691 DPRINT1("IOCTL_DISK_GET_DRIVE_GEOMETRY\n");
692 if (IrpStack
->Parameters
.DeviceIoControl
.OutputBufferLength
< sizeof(DISK_GEOMETRY
))
694 Irp
->IoStatus
.Status
= STATUS_INVALID_PARAMETER
;
695 Irp
->IoStatus
.Information
= 0;
697 else if (DeviceExtension
->DiskGeometry
== NULL
)
699 DPRINT1("No disk geometry available!\n");
700 Irp
->IoStatus
.Status
= STATUS_NO_SUCH_DEVICE
;
701 Irp
->IoStatus
.Information
= 0;
705 PDISK_GEOMETRY Geometry
;
707 Geometry
= (PDISK_GEOMETRY
) Irp
->AssociatedIrp
.SystemBuffer
;
708 RtlMoveMemory(Geometry
,
709 DeviceExtension
->DiskGeometry
,
710 sizeof(DISK_GEOMETRY
));
714 RtlCopyMemory(DiskData
->Geometry
,
715 DiskDeviceExtension
->DiskGeometry
,
716 sizeof(DISK_GEOMETRY
));
717 Geometry
->MediaType
= FixedMedia
;
718 // FIXME: should report for RawDevice even on partition
719 Geometry
->Cylinders
.QuadPart
= DeviceExtension
->Size
/
720 DeviceExtension
->SectorsPerLogCyl
;
721 Geometry
->TracksPerCylinder
= DeviceExtension
->SectorsPerLogTrk
/
722 DeviceExtension
->SectorsPerLogCyl
;
723 Geometry
->SectorsPerTrack
= DeviceExtension
->SectorsPerLogTrk
;
724 Geometry
->BytesPerSector
= DeviceExtension
->BytesPerSector
;
726 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
727 Irp
->IoStatus
.Information
= sizeof(DISK_GEOMETRY
);
731 case IOCTL_DISK_GET_PARTITION_INFO
:
732 DPRINT1("IOCTL_DISK_GET_PARTITION_INFO\n");
733 if (IrpStack
->Parameters
.DeviceIoControl
.OutputBufferLength
<
734 sizeof(PARTITION_INFORMATION
))
736 Irp
->IoStatus
.Status
= STATUS_INFO_LENGTH_MISMATCH
;
737 Irp
->IoStatus
.Information
= 0;
739 else if (DiskData
->PartitionNumber
== 0)
741 Irp
->IoStatus
.Status
= STATUS_INVALID_DEVICE_REQUEST
;
742 Irp
->IoStatus
.Information
= 0;
746 PPARTITION_INFORMATION PartitionInfo
;
748 PartitionInfo
= (PPARTITION_INFORMATION
)Irp
->AssociatedIrp
.SystemBuffer
;
750 PartitionInfo
->PartitionType
= DiskData
->PartitionType
;
751 PartitionInfo
->StartingOffset
= DeviceExtension
->StartingOffset
;
752 PartitionInfo
->PartitionLength
= DeviceExtension
->PartitionLength
;
753 PartitionInfo
->HiddenSectors
= DiskData
->HiddenSectors
;
754 PartitionInfo
->PartitionNumber
= DiskData
->PartitionNumber
;
755 PartitionInfo
->BootIndicator
= DiskData
->BootIndicator
;
756 PartitionInfo
->RewritePartition
= FALSE
;
757 PartitionInfo
->RecognizedPartition
=
758 IsRecognizedPartition(DiskData
->PartitionType
);
760 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
761 Irp
->IoStatus
.Information
= sizeof(PARTITION_INFORMATION
);
765 case IOCTL_DISK_SET_PARTITION_INFO
:
766 case IOCTL_DISK_GET_DRIVE_LAYOUT
:
767 case IOCTL_DISK_SET_DRIVE_LAYOUT
:
768 case IOCTL_DISK_VERIFY
:
769 case IOCTL_DISK_FORMAT_TRACKS
:
770 case IOCTL_DISK_PERFORMANCE
:
771 case IOCTL_DISK_IS_WRITABLE
:
772 case IOCTL_DISK_LOGGING
:
773 case IOCTL_DISK_FORMAT_TRACKS_EX
:
774 case IOCTL_DISK_HISTOGRAM_STRUCTURE
:
775 case IOCTL_DISK_HISTOGRAM_DATA
:
776 case IOCTL_DISK_HISTOGRAM_RESET
:
777 case IOCTL_DISK_REQUEST_STRUCTURE
:
778 case IOCTL_DISK_REQUEST_DATA
:
780 /* If we get here, something went wrong. inform the requestor */
782 DPRINT1("Unhandled control code: %lx\n", ControlCode
);
783 Status
= STATUS_INVALID_DEVICE_REQUEST
;
784 Irp
->IoStatus
.Status
= Status
;
785 Irp
->IoStatus
.Information
= 0;
789 IoCompleteRequest(Irp
,
796 // DiskClassShutdownFlush
799 // Answer requests for shutdown and flush calls
805 // Standard dispatch arguments
812 DiskClassShutdownFlush(IN PDEVICE_OBJECT DeviceObject
,
815 DPRINT("DiskClassShutdownFlush() called!\n");
817 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
818 Irp
->IoStatus
.Information
= 0;
819 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
821 return(STATUS_SUCCESS
);