DiskDeviceExtension->TargetId = InquiryData->TargetId;
DiskDeviceExtension->Lun = InquiryData->Lun;
+ /* Initialize the lookaside list for SRBs */
+ ScsiClassInitializeSrbLookasideList(DiskDeviceExtension,
+ 4);
+
/* zero-out disk data */
DiskData = (PDISK_DATA)(DiskDeviceExtension + 1);
RtlZeroMemory(DiskData,
{
DPRINT("Failed to allocate geometry buffer!\n");
+ ExDeleteNPagedLookasideList(&DiskDeviceExtension->SrbLookasideListHead);
+
IoDeleteDevice(DiskDeviceObject);
/* Release (unclaim) the disk */
}
else
{
- /* Read partition table */
- Status = IoReadPartitionTable(DiskDeviceObject,
- DiskDeviceExtension->DiskGeometry->BytesPerSector,
- TRUE,
- &PartitionList);
+ /* Read partition table */
+ Status = IoReadPartitionTable(DiskDeviceObject,
+ DiskDeviceExtension->DiskGeometry->BytesPerSector,
+ TRUE,
+ &PartitionList);
- DPRINT("IoReadPartitionTable(): Status: %lx\n", Status);
+ DPRINT("IoReadPartitionTable(): Status: %lx\n", Status);
- if ((!NT_SUCCESS(Status) || PartitionList->PartitionCount == 0) &&
- DiskDeviceObject->Characteristics & FILE_REMOVABLE_MEDIA)
- {
- if (!NT_SUCCESS(Status))
+ if ((!NT_SUCCESS(Status) || PartitionList->PartitionCount == 0) &&
+ DiskDeviceObject->Characteristics & FILE_REMOVABLE_MEDIA)
{
- /* Drive is not ready. */
- DPRINT("Drive not ready\n");
- DiskData->DriveNotReady = TRUE;
- }
- else
- {
- ExFreePool(PartitionList);
- }
+ if (!NT_SUCCESS(Status))
+ {
+ /* Drive is not ready. */
+ DPRINT("Drive not ready\n");
+ DiskData->DriveNotReady = TRUE;
+ }
+ else
+ {
+ ExFreePool(PartitionList);
+ }
- /* Allocate a partition list for a single entry. */
- PartitionList = ExAllocatePool(NonPagedPool,
- sizeof(DRIVE_LAYOUT_INFORMATION));
- if (PartitionList != NULL)
- {
- RtlZeroMemory(PartitionList,
- sizeof(DRIVE_LAYOUT_INFORMATION));
- PartitionList->PartitionCount = 1;
+ /* Allocate a partition list for a single entry. */
+ PartitionList = ExAllocatePool(NonPagedPool,
+ sizeof(DRIVE_LAYOUT_INFORMATION));
+ if (PartitionList != NULL)
+ {
+ RtlZeroMemory(PartitionList,
+ sizeof(DRIVE_LAYOUT_INFORMATION));
+ PartitionList->PartitionCount = 1;
- Status = STATUS_SUCCESS;
+ Status = STATUS_SUCCESS;
+ }
}
}
- }
if (NT_SUCCESS(Status))
{
PartitionDeviceExtension->Lun = InquiryData->Lun;
PartitionDeviceExtension->SectorShift = DiskDeviceExtension->SectorShift;
+ /* Initialize lookaside list for SRBs */
+ ScsiClassInitializeSrbLookasideList(PartitionDeviceExtension,
+ 8);
+
DiskData = (PDISK_DATA)(PartitionDeviceExtension + 1);
DiskData->PartitionType = PartitionEntry->PartitionType;
DiskData->PartitionNumber = PartitionNumber + 1;
Srb->TargetId = DeviceExtension->TargetId;
Srb->Lun = DeviceExtension->Lun;
-
- /* FIXME: Flush write cache */
-
+ /* Flush write cache */
+ Srb->Function = SRB_FUNCTION_EXECUTE_SCSI;
+ Srb->SrbFlags = SRB_FLAGS_NO_DATA_TRANSFER;
+ Srb->CdbLength = 10;
+ Srb->Cdb[0] = SCSIOP_SYNCHRONIZE_CACHE;
+ ScsiClassSendSrbSynchronous(DeviceObject,
+ Srb,
+ NULL,
+ 0,
+ TRUE);
/* Get current stack location */
IrpStack = IoGetCurrentIrpStackLocation(Irp);
-
/* FIXME: Unlock removable media upon shutdown */