27 #define ExAllocatePool(a,b) ExAllocatePoolWithTag(a,b,'DscS') 125 ULONG UpdateRemovableGeometryCount;
161 #define NUMBER_OF_BAD_CONTROLLERS (sizeof(ScsiDiskBadControllers) / sizeof(BAD_CONTROLLER_INFORMATION)) 162 #define DEVICE_EXTENSION_SIZE sizeof(DEVICE_EXTENSION) + sizeof(DISK_DATA) 164 #define MODE_DATA_SIZE 192 165 #define VALUE_BUFFER_SIZE 2048 166 #define SCSI_DISK_TIMEOUT 10 167 #define PARTITION0_LIST_SIZE 4 327 #pragma alloc_text(PAGE, DriverEntry) 328 #pragma alloc_text(PAGE, FindScsiDisks) 329 #pragma alloc_text(PAGE, CreateDiskDeviceObject) 330 #pragma alloc_text(PAGE, CalculateMbrCheckSum) 331 #pragma alloc_text(PAGE, EnumerateBusKey) 332 #pragma alloc_text(PAGE, UpdateGeometry) 333 #pragma alloc_text(PAGE, IsFloppyDevice) 334 #pragma alloc_text(PAGE, ScanForSpecial) 335 #pragma alloc_text(PAGE, ScsiDiskDeviceControl) 336 #pragma alloc_text(PAGE, ScsiDiskModeSelect) 431 InquiryData->DeviceTypeQualifier == 0) {
496 DebugPrint((1,
"FindScsiDevices: ScsiClassGetCapabilities failed\n"));
507 DebugPrint((1,
"FindScsiDevices: ScsiClassGetInquiryData failed\n"));
525 if (adapterDisk == 0) {
539 diskCount = &configurationInformation->
DiskCount;
567 "FindScsiDevices: Vendor string is %.24s\n",
670 UCHAR pathId = LunInfo->PathId;
671 UCHAR targetId = LunInfo->TargetId;
672 UCHAR lun = LunInfo->Lun;
688 "\\Device\\Harddisk%lu",
717 "CreateDiskDeviceObjects: Could not create directory %s\n",
746 "\\Device\\Harddisk%lu\\Partition0",
759 "CreateDiskDeviceObjects: Can not create device object %s\n",
762 goto CreateDiskDeviceObjectsExit;
785 if (((
PINQUIRYDATA)LunInfo->InquiryData)->RemovableMedia) {
810 deviceExtension->LockCount = 0;
822 deviceExtension->PortDeviceObject = PortDeviceObject;
829 if (PortDeviceObject->AlignmentRequirement >
deviceObject->AlignmentRequirement) {
830 deviceObject->AlignmentRequirement = PortDeviceObject->AlignmentRequirement;
844 deviceExtension->PortCapabilities = PortCapabilities;
854 srbListInitialized =
TRUE;
860 if (((
PINQUIRYDATA)LunInfo->InquiryData)->CommandQueue &&
861 PortCapabilities->TaggedQueuing) {
867 deviceExtension->SrbFlags = 0;
897 if (diskGeometry ==
NULL) {
900 "CreateDiskDeviceObjects: Can not allocate disk geometry buffer\n"));
902 goto CreateDiskDeviceObjectsExit;
905 deviceExtension->DiskGeometry = diskGeometry;
913 if (senseData ==
NULL) {
920 "CreateDiskDeviceObjects: Can not allocate request sense buffer\n"));
923 goto CreateDiskDeviceObjectsExit;
930 deviceExtension->SenseData = senseData;
937 deviceExtension->StartingOffset.QuadPart = (
LONGLONG)(0);
945 deviceExtension->PathId = pathId;
946 deviceExtension->TargetId = targetId;
947 deviceExtension->Lun = lun;
955 deviceExtension->TimeOutValue = timeOut;
977 goto CreateDiskDeviceObjectsExit;
1007 "CreateDiskDeviceObjects: Can't read capacity for device %s\n",
1028 CreateDiskDeviceObjectsExit:
1039 if (diskGeometry !=
NULL) {
1043 if (senseData !=
NULL) {
1049 if (srbListInitialized) {
1116 "ReportToMountMgr: Can't get MountMgr pointers %lx\n",
1123 diskLen = deviceExtension->DeviceName.Length;
1135 "ReportToMountMgr: Allocation of mountTarget failed\n"));
1163 "ReportToMountMgr: Allocation of irp failed\n"));
1202 ULONG partitionNumber = 0;
1212 ULONG bytesPerSector;
1215 ULONG dmByteSkew = 0;
1218 ULONG numberListElements = 0;
1226 diskGeometry = physicalDeviceExtension->DiskGeometry;
1233 if (bytesPerSector == 0) {
1242 sectorShift = physicalDeviceExtension->SectorShift;
1248 diskData = (
PDISK_DATA)(physicalDeviceExtension + 1);
1258 physicalDeviceExtension->DiskGeometry->Geometry.BytesPerSector,
1270 physicalDeviceExtension->DMSkew = *dmSkew;
1271 physicalDeviceExtension->DMActive =
TRUE;
1272 physicalDeviceExtension->DMByteSkew = physicalDeviceExtension->DMSkew * bytesPerSector;
1280 dmByteSkew = physicalDeviceExtension->DMByteSkew;
1290 diskData->UpdateRemovableGeometryCount = 0;
1298 physicalDeviceExtension->DiskGeometry->Geometry.BytesPerSector,
1300 (
PVOID)&partitionList);
1307 DPRINT(
"IoReadPartitionTable() status: 0x%08X\n",
status);
1335 if (partitionList !=
NULL) {
1345 partitionList->PartitionCount = 1;
1357 diskData->
Signature = partitionList->Signature;
1369 "SCSIDISK: Can't calculate MBR checksum for disk %x\n",
1370 physicalDeviceExtension->DeviceNumber));
1374 "SCSIDISK: MBR checksum for disk %x is %x\n",
1375 physicalDeviceExtension->DeviceNumber,
1387 srbFlags = physicalDeviceExtension->SrbFlags;
1393 "Disk.CreatePartitionDeviceObjects - Allocation of initData failed\n"));
1396 goto CreatePartitionDeviceObjectsExit;
1405 initData->
ClassError = physicalDeviceExtension->ClassError;
1411 initData->
ClassStartIo = physicalDeviceExtension->ClassStartIo;
1420 "CreateDiskDeviceObjects: Number of partitions is %d\n",
1421 partitionList->PartitionCount));
1423 for (partitionNumber = 0; partitionNumber <
1424 partitionList->PartitionCount; partitionNumber++) {
1431 "\\Device\\Harddisk%lu\\Partition%lu",
1432 physicalDeviceExtension->DeviceNumber,
1433 partitionNumber + 1);
1436 "CreateDiskDeviceObjects: Create device object %s\n",
1447 DebugPrint((1,
"CreateDiskDeviceObjects: Can't create device object for %s\n", ntNameBuffer));
1468 deviceObject->StackSize = (
CCHAR)physicalDeviceExtension->PortDeviceObject->StackSize + 1;
1482 deviceExtension->DMByteSkew = dmByteSkew;
1483 deviceExtension->DMSkew = *dmSkew;
1484 deviceExtension->DMActive =
TRUE;
1499 diskData = (
PDISK_DATA)(deviceExtension + 1);
1518 deviceExtension->PortDeviceObject = physicalDeviceExtension->PortDeviceObject;
1525 if (physicalDeviceExtension->PortDeviceObject->AlignmentRequirement >
deviceObject->AlignmentRequirement) {
1526 deviceObject->AlignmentRequirement = physicalDeviceExtension->PortDeviceObject->AlignmentRequirement;
1531 numberListElements = 30;
1533 numberListElements = 8;
1542 numberListElements);
1544 deviceExtension->SrbFlags = srbFlags;
1550 deviceExtension->SenseData = physicalDeviceExtension->SenseData;
1551 deviceExtension->PortCapabilities = physicalDeviceExtension->PortCapabilities;
1552 deviceExtension->DiskGeometry = diskGeometry;
1554 diskData->
PartitionType = partitionList->PartitionEntry[partitionNumber].PartitionType;
1555 diskData->
BootIndicator = partitionList->PartitionEntry[partitionNumber].BootIndicator;
1557 DebugPrint((2,
"CreateDiskDeviceObjects: Partition type is %x\n",
1560 deviceExtension->StartingOffset = partitionList->PartitionEntry[partitionNumber].StartingOffset;
1561 deviceExtension->PartitionLength = partitionList->PartitionEntry[partitionNumber].PartitionLength;
1562 diskData->
HiddenSectors = partitionList->PartitionEntry[partitionNumber].HiddenSectors;
1563 deviceExtension->PortNumber = physicalDeviceExtension->PortNumber;
1564 deviceExtension->PathId = physicalDeviceExtension->PathId;
1565 deviceExtension->TargetId = physicalDeviceExtension->TargetId;
1566 deviceExtension->Lun = physicalDeviceExtension->Lun;
1580 deviceExtension->TimeOutValue = physicalDeviceExtension->TimeOutValue;
1581 deviceExtension->DiskGeometry->Geometry.BytesPerSector = bytesPerSector;
1582 deviceExtension->SectorShift = sectorShift;
1584 deviceExtension->DeviceFlags |= physicalDeviceExtension->DeviceFlags;
1609 CreatePartitionDeviceObjectsExit:
1611 if (partitionList) {
1627 physicalDiskData = (
PDISK_DATA)(physicalDeviceExtension + 1);
1670 if (deviceExtension->DiskGeometry->Geometry.BytesPerSector == 0) {
1671 DPRINT1(
"Hack! Received invalid sector size\n");
1672 deviceExtension->DiskGeometry->Geometry.BytesPerSector = 512;
1685 if ((startingOffset.
QuadPart > deviceExtension->PartitionLength.QuadPart) ||
1686 (transferByteCount & (deviceExtension->DiskGeometry->Geometry.BytesPerSector - 1))) {
1692 if (((
PDISK_DATA)(deviceExtension + 1))->DriveNotReady) {
1711 if (startingOffset.
QuadPart > deviceExtension->PartitionLength.QuadPart) {
1712 DPRINT1(
"Reading beyond partition end! startingOffset: %I64d, PartitionLength: %I64d\n", startingOffset.
QuadPart, deviceExtension->PartitionLength.QuadPart);
1715 if (transferByteCount & (deviceExtension->DiskGeometry->Geometry.BytesPerSector - 1)) {
1716 DPRINT1(
"Not reading sectors! TransferByteCount: %lu, BytesPerSector: %lu\n", transferByteCount, deviceExtension->DiskGeometry->Geometry.BytesPerSector);
1720 DPRINT1(
"Failing due to device not ready!\n");
1795 if (irpStack->
Parameters.DeviceIoControl.OutputBufferLength <
1822 srbControl->
Timeout = deviceExtension->TimeOutValue;
1847 deviceExtension->PortDeviceObject,
1892 ULONG controlCode = 0;
1896 if (irpStack->
Parameters.DeviceIoControl.InputBufferLength <
1901 }
else if (irpStack->
Parameters.DeviceIoControl.OutputBufferLength <
1938 if (controlCode == 0) {
1957 srbControl->
Timeout = deviceExtension->TimeOutValue;
1971 cmdInParameters->
bDriveNumber = deviceExtension->TargetId;
1980 deviceExtension->PortDeviceObject,
2032 ULONG controlCode = 0;
2035 if (irpStack->
Parameters.DeviceIoControl.InputBufferLength <
2040 }
else if (irpStack->
Parameters.DeviceIoControl.OutputBufferLength <
2073 if (irpStack->
Parameters.DeviceIoControl.OutputBufferLength <
2105 if (controlCode == 0) {
2125 srbControl->
Timeout = deviceExtension->TimeOutValue;
2138 cmdInParameters->
bDriveNumber = deviceExtension->TargetId;
2149 deviceExtension->PortDeviceObject,
2233 physicalDeviceExtension = deviceExtension->PhysicalDevice->DeviceExtension;
2234 physicalDiskData = (
PDISK_DATA)(physicalDeviceExtension + 1);
2239 if (removable || (!listInitialized))
2285 deviceExtension->DiskGeometry,
2289 Irp->IoStatus.Information = copyLength;
2309 if (irpStack->
Parameters.DeviceIoControl.InputBufferLength <
2328 byteOffset.
QuadPart = deviceExtension->StartingOffset.QuadPart +
2335 sectorOffset = (
ULONG)(byteOffset.
QuadPart >> deviceExtension->SectorShift);
2363 deviceExtension->TimeOutValue;
2385 if (irpStack->
Parameters.DeviceIoControl.OutputBufferLength <
2474 if (irpStack->
Parameters.DeviceIoControl.OutputBufferLength <
2480 #if 0 // HACK: ReactOS partition numbers must be wrong 2497 DPRINT1(
"HACK: Handling partition 0 request!\n");
2569 if (irpStack->
Parameters.DeviceIoControl.InputBufferLength <
2586 deviceExtension->PhysicalDevice,
2587 deviceExtension->DiskGeometry->Geometry.BytesPerSector,
2607 if (irpStack->
Parameters.DeviceIoControl.OutputBufferLength <
2625 deviceExtension->DiskGeometry->Geometry.BytesPerSector,
2644 irpStack->
Parameters.DeviceIoControl.OutputBufferLength) {
2662 deviceExtension = physicalExtension;
2663 diskData = (
PDISK_DATA)(deviceExtension + 1);
2673 if (!deviceExtension) {
2681 diskData = (
PDISK_DATA)(deviceExtension + 1);
2687 if (!deviceExtension->PartitionLength.QuadPart) {
2707 deviceExtension->StartingOffset.QuadPart) {
2716 deviceExtension->PartitionLength.QuadPart) {
2738 Irp->IoStatus.Information = tempSize;
2764 if (irpStack->
Parameters.DeviceIoControl.InputBufferLength <
2775 if (irpStack->
Parameters.DeviceIoControl.InputBufferLength <
2786 if (deviceExtension->PhysicalDevice->DeviceExtension != deviceExtension) {
2805 deviceExtension->DeviceObject,
2806 deviceExtension->DiskGeometry->Geometry.BytesPerSector,
2807 deviceExtension->DiskGeometry->Geometry.SectorsPerTrack,
2808 deviceExtension->DiskGeometry->Geometry.TracksPerCylinder,
2839 if (irpStack->
Parameters.DeviceIoControl.InputBufferLength <
2849 if (irpStack->
Parameters.DeviceIoControl.InputBufferLength <
2868 blockCount = badBlocks->
Count;
2875 badBlocks->
Count = (
USHORT) ((blockCount >> 8) & 0XFF);
2876 badBlocks->
Count |= (
USHORT) ((blockCount << 8) & 0XFF00);
2884 for (; blockCount > 0; blockCount--) {
2886 blockNumber = badBlocks->
BlockNumber[blockCount-1];
2909 Irp->IoStatus.Information = 0;
2924 if (modeData ==
NULL) {
2994 DebugPrint((3,
"CdRomDeviceControl: Find devices\n"));
3024 if (irpStack->
Parameters.DeviceIoControl.OutputBufferLength <
3058 lengthInformation->
Length.
QuadPart = deviceExtension->PartitionLength.QuadPart;
3161 srb->
PathId = deviceExtension->PathId;
3162 srb->
TargetId = deviceExtension->TargetId;
3163 srb->
Lun = deviceExtension->Lun;
3172 srb->
SrbFlags = deviceExtension->SrbFlags;
3191 DebugPrint((1,
"ScsiDiskShutdownFlush: Synchronize cache sent. Status = %lx\n",
status ));
3219 DebugPrint((1,
"ScsiDiskShutdownFlush: Unlock device request sent. Status = %lx\n",
status ));
3308 if (modeData ==
NULL) {
3353 if (pageData !=
NULL) {
3355 DebugPrint((1,
"Scsidisk: Flexible disk page found, This is a floppy.\n"));
3376 if (pageData !=
NULL) {
3385 "SCSIDISK: Disk write cache enabled\n"));
3398 "SCSIDISK: Disk does not support FUA or DPO\n"));
3569 if (!controller->DisableWriteCache ||
strncmp(controller->InquiryString, (PCCHAR)InquiryData->
VendorId,
strlen(controller->InquiryString))) {
3573 DebugPrint((1,
"ScsiDisk.DisableWriteCache, Found bad controller! %s\n", controller->InquiryString));
3577 if (modeData ==
NULL) {
3580 "ScsiDisk.DisableWriteCache: Check for write-cache enable failed\n"));
3606 "ScsiDisk.DisableWriteCache: Mode Sense failed\n"));
3639 if (pageData !=
NULL) {
3686 "SCSIDISK: Disk write cache disabled\n"));
3698 "SCSIDISK: Disk write cache disabled\n"));
3707 "SCSIDISK: Mode select to disable write cache failed\n"));
3723 if (errorLogEntry !=
NULL) {
3733 errorLogEntry->
DumpData[0] = LunInfo->PathId;
3734 errorLogEntry->
DumpData[1] = LunInfo->TargetId;
3735 errorLogEntry->
DumpData[2] = LunInfo->Lun;
3804 sectorSize = DeviceExtension->DiskGeometry->Geometry.BytesPerSector;
3810 if (sectorSize < 512) {
3829 DeviceExtension->DeviceObject,
3868 for (
i = 0;
i < 128;
i++) {
3869 *Checksum += mbr[
i];
3872 *Checksum = ~*Checksum + 1;
3914 ULONG adapterNumber;
3929 for (busNumber = 0; ; busNumber++) {
3956 status = ZwOpenKey(&spareKey,
3977 status = ZwOpenKey(&adapterKey,
3990 for (adapterNumber = 0; ; adapterNumber++) {
3997 "%lu\\DiskPeripheral",
4017 status = ZwOpenKey(&diskKey,
4027 for (diskNumber = 0; ; diskNumber++) {
4050 status = ZwOpenKey(&targetKey,
4066 if (keyData ==
NULL) {
4076 status = ZwQueryValueKey(targetKey,
4094 DebugPrint((1,
"EnumerateBusKey: Saved data was invalid, " 4095 "not enough data in registry!\n"));
4149 anotherString.Buffer+=9;
4164 anotherString.Length =
string.Length;
4175 *DiskNumber = diskNumber;
4185 anotherString.Buffer-=9;
4242 ULONG numberOfDrives;
4245 ULONG sectorsPerTrack;
4246 ULONG tracksPerCylinder;
4257 DeviceExtension->DeviceObject->DriverObject->HardwareDatabase,
4266 status = ZwOpenKey(&hardwareKey,
4272 DebugPrint((1,
"ScsiDisk UpdateParameters: Cannot open hardware data. Name: %wZ\n", DeviceExtension->DeviceObject->DriverObject->HardwareDatabase));
4285 if (keyData ==
NULL) {
4290 status = ZwQueryValueKey(hardwareKey,
4299 "SCSIDISK: ExtractBiosGeometry: Can't query configuration data (%x)\n",
4318 status = ZwOpenKey(&busKey,
4327 "SCSIDISK: UpdateGeometry: Opened EisaAdapter key\n"));
4350 status = ZwOpenKey(&busKey,
4357 "SCSIDISK: UpdateGeometry: Opened MultifunctionAdapter key\n"));
4386 DebugPrint((1,
"SCSIDISK: ExtractBiosGeometry: BIOS header data too small or invalid\n"));
4410 if (numberOfDrives <= diskNumber) {
4422 tracksPerCylinder = driveParameters->
MaxHeads +1;
4428 sectors = (
ULONG)(DeviceExtension->PartitionLength.QuadPart >>
4429 DeviceExtension->SectorShift);
4432 if (
sectors >= cylinders * tracksPerCylinder * sectorsPerTrack) {
4433 DebugPrint((1,
"ScsiDisk: UpdateGeometry: Disk smaller than BIOS indicated\n" 4434 "SCSIDISK: Sectors: %x, Cylinders: %x, Track per Cylinder: %x Sectors per track: %x\n",
4435 sectors, cylinders, tracksPerCylinder, sectorsPerTrack));
4445 length = tracksPerCylinder * sectorsPerTrack;
4453 DebugPrint((1,
"ScsiDisk UpdateParameters: sectorPerTrack zero\n"));
4464 DeviceExtension->DiskGeometry->Geometry.SectorsPerTrack = sectorsPerTrack;
4465 DeviceExtension->DiskGeometry->Geometry.TracksPerCylinder = tracksPerCylinder;
4466 DeviceExtension->DiskGeometry->Geometry.Cylinders.QuadPart = (
LONGLONG)cylinders;
4467 DeviceExtension->DiskGeometry->DiskSize.QuadPart = (
LONGLONG)cylinders * tracksPerCylinder * sectorsPerTrack *
4468 DeviceExtension->DiskGeometry->Geometry.BytesPerSector;
4471 "SCSIDISK: UpdateGeometry: BIOS spt %x, #heads %x, #cylinders %x\n",
4478 foundEZHooker =
FALSE;
4480 if (!DeviceExtension->DMActive) {
4483 DeviceExtension->DiskGeometry->Geometry.BytesPerSector,
4491 foundEZHooker =
TRUE;
4497 if (DeviceExtension->DMActive || foundEZHooker) {
4499 while (cylinders > 1024) {
4501 tracksPerCylinder = tracksPerCylinder*2;
4502 cylinders = cylinders/2;
4510 tracksPerCylinder -= 1;
4519 DeviceExtension->DiskGeometry->Geometry.Cylinders.QuadPart = cylinders + 1;
4520 DeviceExtension->DiskGeometry->Geometry.TracksPerCylinder = tracksPerCylinder + 1;
4522 DeviceExtension->PartitionLength.QuadPart =
4523 DeviceExtension->DiskGeometry->DiskSize.QuadPart =
4524 DeviceExtension->DiskGeometry->Geometry.Cylinders.QuadPart *
4525 DeviceExtension->DiskGeometry->Geometry.SectorsPerTrack *
4526 DeviceExtension->DiskGeometry->Geometry.BytesPerSector *
4527 DeviceExtension->DiskGeometry->Geometry.TracksPerCylinder;
4529 if (DeviceExtension->DMActive) {
4531 DeviceExtension->DMByteSkew = DeviceExtension->DMSkew * DeviceExtension->DiskGeometry->Geometry.BytesPerSector;
4537 DeviceExtension->DMByteSkew = 0;
4580 ULONG partitionNumber;
4598 diskData = (
PDISK_DATA) (deviceExtension + 1);
4618 if (diskData->UpdateRemovableGeometryCount++ >= 1)
4620 diskData->UpdateRemovableGeometryCount = 0;
4630 deviceExtension->DiskGeometry->Geometry.BytesPerSector,
4641 diskData->UpdateRemovableGeometryCount = 0;
4668 deviceExtension->StartingOffset =
4671 deviceExtension->PartitionLength =
4678 deviceExtension->PhysicalDevice->DeviceExtension)->SectorShift;
4689 deviceExtension->StartingOffset.QuadPart = (
LONGLONG)0;
4690 deviceExtension->PartitionLength.QuadPart = (
LONGLONG)0;
4747 deviceExtension->ErrorCount++;
4764 deviceExtension->ErrorCount++;
4807 if (
strncmp(controller->InquiryString, (PCCHAR)InquiryData->
VendorId,
strlen(controller->InquiryString))) {
4811 DebugPrint((1,
"ScsiDisk ScanForSpecial, Found bad controller! %s\n", controller->InquiryString));
4817 if (controller->DisableTaggedQueuing) {
4826 if (controller->DisableSynchronousTransfers) {
4836 if (controller->DisableDisconnects) {
4899 DebugPrint((1,
"ScsiDisk ResetScsiBus: Sending reset bus request to port driver.\n"));
4932 srb->
PathId = deviceExtension->PathId;
4933 srb->
TargetId = deviceExtension->TargetId;
4934 srb->
Lun = deviceExtension->Lun;
5007 ULONG partitionNumber;
5008 ULONG partitionCount;
5009 ULONG lastPartition;
5010 ULONG partitionOrdinal;
5019 ULONG numberListElements;
5038 deviceExtension = physicalExtension;
5039 diskData = (
PDISK_DATA)(deviceExtension + 1);
5050 if (!deviceExtension) {
5058 diskData = (
PDISK_DATA)(deviceExtension + 1);
5072 if (!deviceExtension->PartitionLength.QuadPart) {
5081 partitionOrdinal = 0;
5111 deviceExtension->StartingOffset.QuadPart) {
5120 deviceExtension->PartitionLength.QuadPart) {
5123 "UpdateDeviceObjects: Found match for \\Harddisk%d\\Partition%d\n",
5124 physicalExtension->DeviceNumber,
5144 diskData = (
PDISK_DATA)(deviceExtension + 1);
5162 "UpdateDeviceObjects: Disk %d ordinal %d is partition %d\n",
5163 physicalExtension->DeviceNumber,
5174 "UpdateDeviceObjects: Deleting \\Device\\Harddisk%x\\Partition%x\n",
5175 physicalExtension->DeviceNumber,
5178 deviceExtension->PartitionLength.QuadPart = (
LONGLONG) 0;
5189 partitionOrdinal = 0;
5239 partitionNumber = 0;
5240 deviceExtension = physicalExtension;
5241 diskData = (
PDISK_DATA)(deviceExtension + 1);
5251 if (!deviceExtension) {
5255 diskData = (
PDISK_DATA)(deviceExtension + 1);
5261 if (!deviceExtension->PartitionLength.QuadPart) {
5273 if (partitionNumber == 0) {
5276 partitionNumber = lastPartition;
5283 "\\Device\\Harddisk%lu\\Partition%lu",
5284 physicalExtension->DeviceNumber,
5299 "UpdateDeviceObjects: Create device object %s\n",
5316 "UpdateDeviceObjects: Can't create device %s\n",
5348 numberListElements = 30;
5350 numberListElements = 8;
5359 numberListElements);
5397 diskData = (
PDISK_DATA)(deviceExtension + 1);
5406 diskData = (
PDISK_DATA)(deviceExtension + 1);
5409 "UpdateDeviceObjects: Used existing device object \\Device\\Harddisk%x\\Partition%x\n",
5410 physicalExtension->DeviceNumber,
5421 deviceExtension->StartingOffset = partitionEntry->
StartingOffset;
5427 "UpdateDeviceObjects: Ordinal %d is partition %d\n",
#define DO_DEVICE_INITIALIZING
#define IOCTL_DISK_GET_DRIVE_GEOMETRY_EX
NTSTATUS NTAPI CreatePartitionDeviceObjects(IN PDEVICE_OBJECT PhysicalDeviceObject, IN PUNICODE_STRING RegistryPath)
#define IO_WRITE_CACHE_ENABLED
#define SCSIOP_REASSIGN_BLOCKS
#define CmResourceTypeDeviceSpecific
struct _CM_INT13_DRIVE_PARAMETER CM_INT13_DRIVE_PARAMETER
struct _DISK_DATA * PDISK_DATA
VOID NTAPI ReportToMountMgr(IN PDEVICE_OBJECT DiskDeviceObject)
NTSTATUS NTAPI CreateDiskDeviceObject(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath, IN PDEVICE_OBJECT PortDeviceObject, IN ULONG PortNumber, IN PULONG DeviceCount, IN PIO_SCSI_CAPABILITIES PortCapabilities, IN PSCSI_INQUIRY_DATA LunInfo, IN PCLASS_INIT_DATA InitData)
#define SCSIOP_SYNCHRONIZE_CACHE
#define STATUS_INSUFFICIENT_RESOURCES
#define IOCTL_SCSI_MINIPORT_READ_SMART_ATTRIBS
_In_ ULONG _In_ ULONG _In_ ULONG Length
struct _MODE_PARAMETER_HEADER MODE_PARAMETER_HEADER
#define STATUS_INFO_LENGTH_MISMATCH
NTSYSAPI LONG NTAPI RtlCompareString(PSTRING String1, PSTRING String2, BOOLEAN CaseInSensitive)
#define IO_WRITE_CACHE_DISABLED
#define OBJ_CASE_INSENSITIVE
struct _CDB::_MEDIA_REMOVAL MEDIA_REMOVAL
#define STATUS_DATA_OVERRUN
#define MODE_PAGE_CACHING
#define IOCTL_DISK_INTERNAL_SET_VERIFY
PIRP NTAPI IoBuildSynchronousFsdRequest(IN ULONG MajorFunction, IN PDEVICE_OBJECT DeviceObject, IN PVOID Buffer, IN ULONG Length, IN PLARGE_INTEGER StartingOffset, IN PKEVENT Event, IN PIO_STATUS_BLOCK IoStatusBlock)
struct _BAD_CONTROLLER_INFORMATION BAD_CONTROLLER_INFORMATION
ACPI_SIZE strlen(const char *String)
PDRIVER_STARTIO ClassStartIo
PCONFIGURATION_INFORMATION NTAPI IoGetConfigurationInformation(VOID)
#define IOCTL_SCSI_MINIPORT
#define SRB_FLAGS_NO_QUEUE_FREEZE
#define STATUS_INVALID_PARAMETER
#define MODE_DSP_WRITE_PROTECT
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
#define SMART_GET_VERSION
PCLASS_FIND_DEVICES ClassFindDevices
VOID NTAPI ScsiClassInitializeSrbLookasideList(IN PDEVICE_EXTENSION DeviceExtension, IN ULONG NumberElements)
NTSTATUS FASTCALL IoReadPartitionTable(IN PDEVICE_OBJECT DeviceObject, IN ULONG SectorSize, IN BOOLEAN ReturnRecognizedPartitions, OUT PDRIVE_LAYOUT_INFORMATION *PartitionBuffer)
#define ENABLE_DISABLE_AUTOSAVE
struct _MODE_PARAMETER_BLOCK MODE_PARAMETER_BLOCK
#define IoIsErrorUserInduced(Status)
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
NTSTATUS NTAPI ScsiDiskCreateClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define REVERSE_BYTES(Destination, Source)
BOOLEAN NTAPI IsFloppyDevice(IN PDEVICE_OBJECT DeviceObject)
ULONG NTAPI ScsiClassInitialize(IN PVOID Argument1, IN PVOID Argument2, IN PCLASS_INIT_DATA InitializationData)
#define MODE_SENSE_RETURN_ALL
#define STATUS_INVALID_DEVICE_REQUEST
struct _SENDCMDOUTPARAMS SENDCMDOUTPARAMS
#define IOCTL_DISK_IS_WRITABLE
#define IDENTIFY_BUFFER_SIZE
NTSTATUS NTAPI IoGetDeviceObjectPointer(IN PUNICODE_STRING ObjectName, IN ACCESS_MASK DesiredAccess, OUT PFILE_OBJECT *FileObject, OUT PDEVICE_OBJECT *DeviceObject)
VOID NTAPI ScsiDiskProcessError(PDEVICE_OBJECT DeviceObject, PSCSI_REQUEST_BLOCK Srb, NTSTATUS *Status, BOOLEAN *Retry)
#define IsContainerPartition(PartitionType)
struct _INQUIRYDATA * PINQUIRYDATA
VOID NTAPI UpdateGeometry(IN PDEVICE_EXTENSION DeviceExtension)
ULONG NextInquiryDataOffset
PDEVICE_OBJECT PhysicalDeviceObject
struct _CDB::_CDB10 CDB10
NTSTATUS ScsiClassGetInquiryData(IN PDEVICE_OBJECT PortDeviceObject, IN PSCSI_ADAPTER_BUS_INFO *ConfigInfo)
#define STATUS_VERIFY_REQUIRED
struct _PARTITION_INFORMATION PARTITION_INFORMATION
BOOLEAN NTAPI ScsiDiskModeSelect(IN PDEVICE_OBJECT DeviceObject, IN PCHAR ModeSelectBuffer, IN ULONG Length, IN BOOLEAN SavePage)
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
#define SRB_STATUS(Status)
VOID NTAPI IoWriteErrorLogEntry(IN PVOID ElEntry)
NTSTATUS NTAPI ScsiDiskReadWriteVerification(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
PCLASS_READ_WRITE ClassReadWriteVerification
#define SENSE_BUFFER_SIZE
#define MOUNTMGR_DEVICE_NAME
#define MAXIMUM_FILENAME_LENGTH
#define RtlMoveMemory(Destination, Source, Length)
#define IOCTL_MOUNTMGR_VOLUME_ARRIVAL_NOTIFICATION
#define DEVICE_EXTENSION_SIZE
#define STATUS_BUFFER_TOO_SMALL
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
#define IOCTL_DISK_FIND_NEW_DEVICES
PDEVICE_EXTENSION NextPartition
#define STATUS_IO_DEVICE_ERROR
#define PARTITION_ENTRY_UNUSED
#define sprintf(buf, format,...)
struct _BAD_CONTROLLER_INFORMATION * PBAD_CONTROLLER_INFORMATION
VOID NTAPI ResetScsiBus(IN PDEVICE_OBJECT DeviceObject)
#define VALUE_BUFFER_SIZE
struct _SENDCMDINPARAMS SENDCMDINPARAMS
CM_PARTIAL_RESOURCE_LIST PartialResourceList
_In_ PDEVICE_OBJECT DeviceObject
struct _PARTITION_INFORMATION_EX PARTITION_INFORMATION_EX
NTSTATUS NTAPI ScsiDiskDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
namespace GUID const ADDRINFOEXW ADDRINFOEXW struct timeval OVERLAPPED LPLOOKUPSERVICE_COMPLETION_ROUTINE HANDLE * handle
#define IO_DISK_INCREMENT
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
#define IOCTL_SCSI_MINIPORT_ENABLE_DISABLE_AUTOSAVE
VOID NTAPI ScanForSpecial(PDEVICE_OBJECT DeviceObject, PSCSI_INQUIRY_DATA LunInfo, PIO_SCSI_CAPABILITIES PortCapabilities)
union _CM_PARTIAL_RESOURCE_DESCRIPTOR::@375 u
#define IOCTL_DISK_VERIFY
PVOID NTAPI ScsiClassFindModePage(IN PCHAR ModeSenseBuffer, IN ULONG Length, IN UCHAR PageMode, IN BOOLEAN Use6Byte)
NTSTATUS NTAPI ScsiDiskFileSystemControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
#define FILE_REMOVABLE_MEDIA
struct _DRIVE_LAYOUT_INFORMATION DRIVE_LAYOUT_INFORMATION
GLenum GLuint GLenum GLsizei length
struct _CM_FULL_RESOURCE_DESCRIPTOR * PCM_FULL_RESOURCE_DESCRIPTOR
struct _GET_LENGTH_INFORMATION GET_LENGTH_INFORMATION
FORCEINLINE VOID KeInitializeSpinLock(_Out_ PKSPIN_LOCK SpinLock)
NTSYSAPI NTSTATUS NTAPI ZwCreateDirectoryObject(_Out_ PHANDLE DirectoryHandle, _In_ ACCESS_MASK DesiredAccess, _In_ POBJECT_ATTRIBUTES ObjectAttributes)
NTSTATUS ScsiClassReadDriveCapacity(IN PDEVICE_OBJECT DeviceObject)
VOID NTAPI UpdateDeviceObjects(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define IOCTL_SCSI_MINIPORT_READ_SMART_THRESHOLDS
ULONG DeviceExtensionSize
struct _REASSIGN_BLOCKS REASSIGN_BLOCKS
#define IoCompleteRequest
IN PSCSI_REQUEST_BLOCK IN OUT NTSTATUS IN OUT BOOLEAN * Retry
#define STATUS_MEDIA_WRITE_PROTECTED
struct _MODE_PARAMETER_HEADER * PMODE_PARAMETER_HEADER
UCHAR DeviceTypeQualifier
#define READ_THRESHOLD_BUFFER_SIZE
NTSYSAPI NTSTATUS NTAPI RtlUnicodeStringToAnsiString(PANSI_STRING DestinationString, PUNICODE_STRING SourceString, BOOLEAN AllocateDestinationString)
struct _DISK_GEOMETRY_EX DISK_GEOMETRY_EX
#define RETURN_SMART_STATUS
#define READ_ATTRIBUTE_BUFFER_SIZE
#define IOCTL_DISK_SET_PARTITION_INFO
struct _DISK_DATA DISK_DATA
#define SCSI_DISK_TIMEOUT
#define DEV_SAFE_START_UNIT
#define SMART_RCV_DRIVE_DATA
#define EXECUTE_OFFLINE_DIAGS
#define IOCTL_DISK_GET_LENGTH_INFO
struct _CDB::_MODE_SELECT MODE_SELECT
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
#define SRB_FUNCTION_FLUSH
NTSTATUS NTAPI ScsiClassCreateDeviceObject(IN PDRIVER_OBJECT DriverObject, IN PCCHAR ObjectNameBuffer, IN OPTIONAL PDEVICE_OBJECT PhysicalDeviceObject, IN OUT PDEVICE_OBJECT *DeviceObject, IN PCLASS_INIT_DATA InitializationData)
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
PVOID NTAPI IoAllocateErrorLogEntry(IN PVOID IoObject, IN UCHAR EntrySize)
#define DIRECT_ACCESS_DEVICE
VOID NTAPI DisableWriteCache(IN PDEVICE_OBJECT DeviceObject, IN PSCSI_INQUIRY_DATA LunInfo)
#define SAVE_ATTRIBUTE_VALUES
ULONG NTAPI ScsiClassModeSense(IN PDEVICE_OBJECT DeviceObject, IN PCHAR ModeSenseBuffer, IN ULONG Length, IN UCHAR PageMode)
_Outptr_ PDEVICE_OBJECT * DiskDeviceObject