23#define DEBUG_MAIN_SOURCE 1
42#pragma alloc_text(INIT, DriverEntry)
43#pragma alloc_text(PAGE, DiskUnload)
44#pragma alloc_text(PAGE, DiskCreateFdo)
45#pragma alloc_text(PAGE, DiskDetermineMediaTypes)
46#pragma alloc_text(PAGE, DiskModeSelect)
47#pragma alloc_text(PAGE, DisableWriteCache)
48#pragma alloc_text(PAGE, DiskSetSpecialHacks)
49#pragma alloc_text(PAGE, DiskGetCacheInformation)
50#pragma alloc_text(PAGE, DiskSetCacheInformation)
51#pragma alloc_text(PAGE, DiskLogCacheInformation)
52#pragma alloc_text(PAGE, DiskSetInfoExceptionInformation)
53#pragma alloc_text(PAGE, DiskGetInfoExceptionInformation)
54#pragma alloc_text(PAGE, DiskIoctlGetCacheSetting)
55#pragma alloc_text(PAGE, DiskIoctlSetCacheSetting)
56#pragma alloc_text(PAGE, DiskIoctlGetLengthInfo)
57#pragma alloc_text(PAGE, DiskIoctlGetDriveGeometry)
58#pragma alloc_text(PAGE, DiskIoctlGetDriveGeometryEx)
59#pragma alloc_text(PAGE, DiskIoctlGetCacheInformation)
60#pragma alloc_text(PAGE, DiskIoctlSetCacheInformation)
61#pragma alloc_text(PAGE, DiskIoctlGetMediaTypesEx)
62#pragma alloc_text(PAGE, DiskIoctlPredictFailure)
63#pragma alloc_text(PAGE, DiskIoctlEnableFailurePrediction)
64#pragma alloc_text(PAGE, DiskIoctlReassignBlocks)
65#pragma alloc_text(PAGE, DiskIoctlReassignBlocksEx)
66#pragma alloc_text(PAGE, DiskIoctlIsWritable)
67#pragma alloc_text(PAGE, DiskIoctlUpdateDriveSize)
68#pragma alloc_text(PAGE, DiskIoctlGetVolumeDiskExtents)
69#pragma alloc_text(PAGE, DiskIoctlSmartGetVersion)
70#pragma alloc_text(PAGE, DiskIoctlSmartReceiveDriveData)
71#pragma alloc_text(PAGE, DiskIoctlSmartSendDriveCommand)
72#pragma alloc_text(PAGE, DiskIoctlVerifyThread)
84#define DiskCompareGuid(_First,_Second) \
85 (memcmp ((_First),(_Second), sizeof (GUID)))
99#define TRANSLATE_RETENTION_PRIORITY(_x)\
100 ((_x) == 0xf ? 0x2 : \
101 ((_x) == 0x2 ? 0xf : _x) \
104#define IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS_ADMIN CTL_CODE(IOCTL_VOLUME_BASE, 0, METHOD_BUFFERED, FILE_READ_ACCESS)
131#if defined(_X86_) || defined(_AMD64_)
183#if defined(_X86_) || defined(_AMD64_)
258 &classQueryWmiRegInfoExList);
287#if defined(_X86_) || defined(_AMD64_)
341 PCCHAR deviceName =
NULL;
359 WCHAR dirBuffer[64] = { 0 };
365 TracePrint((
TRACE_LEVEL_FATAL, TRACE_FLAG_PNP,
"DiskCreateFdo: Format symbolic link failed with error: 0x%X\n",
status));
426 goto DiskCreateFdoExit;
437 TracePrint((
TRACE_LEVEL_FATAL, TRACE_FLAG_PNP,
"DiskCreateFdo: Can not create device object %s\n", deviceName));
438 goto DiskCreateFdoExit;
460#pragma prefast(suppress:28175);
507 goto DiskCreateFdoExit;
572 ULONG residualOffset;
582 residualOffset =
irpSp->Parameters.Read.ByteOffset.LowPart & (commonExtension->
PartitionZeroExtension->DiskGeometry.BytesPerSector - 1);
585 (
irpSp->Parameters.Read.ByteOffset.QuadPart < 0) ||
586 (residualBytes != 0) ||
587 (residualOffset != 0))
626 }
else if ((residualBytes == 0) && (residualOffset == 0)) {
742 "DiskDetermineMediaTypes: Vendor %s, Product %s\n",
758 if (
strncmp(mediaListEntry->VendorId,vendorId,
strlen(mediaListEntry->VendorId))) {
762 if ((mediaListEntry->ProductId !=
NULL) &&
763 strncmp(mediaListEntry->ProductId, productId,
strlen(mediaListEntry->ProductId))) {
778 if (
strncmp(mediaListEntry->VendorId,vendorId,
strlen(mediaListEntry->VendorId))) {
782 if ((mediaListEntry->ProductId !=
NULL) &&
783 strncmp(mediaListEntry->ProductId, productId,
strlen(mediaListEntry->ProductId))) {
787 if ((mediaListEntry->Revision !=
NULL) &&
788 strncmp(mediaListEntry->Revision, productRevision,
strlen(mediaListEntry->Revision))) {
792 deviceMatched =
TRUE;
802 (mediaListEntry->NumberOfTypes *
817 for (
j = 0;
j < mediaListEntry->NumberOfTypes;
j++) {
851 if (MediumType == 2) {
853 }
else if (MediumType == 3) {
856 if (DensityCode == 0x87) {
894 if (!deviceMatched) {
897 "DiskDetermineMediaTypes: Unknown device. Vendor: %s Product: %s Revision: %s\n",
928 Irp->IoStatus.Information =
966 Irp->IoStatus.Information = 0;
969 TracePrint((
TRACE_LEVEL_VERBOSE, TRACE_FLAG_IOCTL,
"DiskDeviceControl: Received IOCTL 0x%X for device %p through IRP %p\n",
1055 #if (NTDDI_VERSION >= NTDDI_WINBLUE)
1056 case IOCTL_STORAGE_FAILURE_PREDICTION_CONFIG : {
1095 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskDeviceControl: IOCTL 0x%X to device %p failed with error 0x%X\n",
1098 (
Irp->Tail.Overlay.Thread !=
NULL)) {
1187 TracePrint((
TRACE_LEVEL_VERBOSE, TRACE_FLAG_SCSI,
"DiskShutdownFlush: IRP %p flags = 0x%x\n",
Irp, irpStack->Flags));
1238 TracePrint((
TRACE_LEVEL_VERBOSE, TRACE_FLAG_SCSI,
"DiskShutdownFlush: waiting for event\n"));
1331 srbEx->SrbLength = srbSize;
1335 srbEx->NumSrbExData = 1;
1341 srbEx->SrbFlags = fdoExtension->
SrbFlags;
1362 cdb = (
PCDB)srbExDataCdb16->Cdb;
1392 srb->SrbFlags = fdoExtension->
SrbFlags;
1395 cdb = (
PCDB)srb->Cdb;
1405 srbExDataCdb16->CdbLength = 10;
1407 srb->CdbLength = 10;
1434 srbEx->SrbStatus = 0;
1435 srbExDataCdb16->ScsiStatus = 0;
1437 srbExDataCdb16->CdbLength = 6;
1452 srb->ScsiStatus = 0;
1464 cdb->MEDIA_REMOVAL.Prevent =
FALSE;
1480 srbEx->NumSrbExData = 0;
1481 srbEx->SrbExDataOffset[0] = 0;
1483 srbEx->OriginalRequest =
Irp;
1485 srbEx->SrbStatus = 0;
1490 srb->OriginalRequest =
Irp;
1497 irpStack->Parameters.Others.Argument4 = (
PVOID) 0;
1519 irpStack->Parameters.Scsi.Srb = srb;
1571 RtlZeroMemory(srbEx,
sizeof(FlushContext->Srb.SrbExBuffer));
1577 srbEx->SrbLength =
sizeof(FlushContext->Srb.SrbExBuffer);
1583 srbEx->SrbFlags = fdoExt->
SrbFlags;
1611 srbEx->NumSrbExData = 1;
1623 srbExDataCdb16->CdbLength = 10;
1637 TracePrint((
TRACE_LEVEL_VERBOSE, TRACE_FLAG_SCSI,
"DiskFlushDispatch: sending sync cache\n"));
1647 srbEx->NumSrbExData = 0;
1648 srbEx->SrbExDataOffset[0] = 0;
1649 srbEx->OriginalRequest = FlushContext->CurrIrp;
1650 srbEx->SrbStatus = 0;
1675 irpSp->Parameters.Others.Argument4 = (
PVOID) 0;
1683 irpSp->Parameters.Scsi.Srb = srb;
1687 TracePrint((
TRACE_LEVEL_VERBOSE, TRACE_FLAG_SCSI,
"DiskFlushDispatch: sending srb flush on irp %p\n", FlushContext->CurrIrp));
1733 #pragma warning(suppress:4311)
1768 Irp->IoStatus.Status =
status = SyncCacheStatus;
1854 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskModeSelect: Block length is not available. Unable to send mode select\n"));
1913 srbEx->SrbLength =
sizeof(srbExBuffer);
1917 srbEx->NumSrbExData = 1;
1940 srbExDataCdb16->CdbLength = 6;
1942 cdb = (
PCDB)srbExDataCdb16->Cdb;
1948 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskModeSelect: Insufficient extended SRB size\n"));
2032 cacheInfo.WriteCacheEnabled =
FALSE;
2133 srbEx->NumSrbExData = 1;
2154 Cdb = (
PCDB)srbExDataCdb16->Cdb;
2156 srbExDataCdb16->CdbLength = 16;
2159 srbExDataCdb16->CdbLength = 10;
2198 srbEx->SrbStatus = 0;
2199 srbExDataCdb16->ScsiStatus = 0;
2206 srbEx->TimeOutValue = ((numSectors + 0x7F) >> 7) *
FdoExtension->TimeOutValue;
2258 sectorOffset.
QuadPart += numSectors;
2264 Irp->IoStatus.Information = 0;
2310 UCHAR scsiStatus = 0;
2311 UCHAR senseBufferLength = 0;
2326 (srbEx->NumSrbExData > 0)) {
2390 (senseBuffer !=
NULL) && (cdb !=
NULL)) {
2397 validSense = ScsiGetSenseKeyAndCodes(senseBuffer,
2419 (cdb->
CDB10.ForceUnitAccess))
2436 if (logEntry !=
NULL)
2510 invalidatePartitionTable =
TRUE;
2518 invalidatePartitionTable =
TRUE;
2526 invalidatePartitionTable =
TRUE;
2531 invalidatePartitionTable =
TRUE;
2537 invalidatePartitionTable =
TRUE;
2542 invalidatePartitionTable =
TRUE;
2569 invalidatePartitionTable =
TRUE;
2577 invalidatePartitionTable =
TRUE;
2695 " START_UNITS\n", fdo));
2735 TracePrint((
TRACE_LEVEL_INFORMATION, TRACE_FLAG_GENERAL,
"Disk ResetBus: Sending reset bus request to port driver.\n"));
2774 srbEx->SrbLength =
sizeof(
context->Srb.SrbExBuffer);
2832 srbEx->OriginalRequest =
irp;
2868 if (logEntry !=
NULL)
2885 logEntry->
DumpData[3] = CacheInfo->WriteCacheEnabled;
2917 if (modeData ==
NULL) {
2919 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_WMI,
"DiskGetInfoExceptionInformation: Unable to allocate mode "
2943 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_WMI,
"DiskGetInfoExceptionInformation: Mode Sense failed\n"));
2967 if (pageData !=
NULL) {
2974 TracePrint((
TRACE_LEVEL_INFORMATION, TRACE_FLAG_WMI,
"DiskGetInfoExceptionInformation: %s support SMART for device %p\n",
3002 for (
i = 0;
i < 2;
i++)
3058 if (modeData ==
NULL) {
3060 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskGetSetCacheInformation: Unable to allocate mode "
3085 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskGetCacheInformation: Mode Sense failed\n"));
3114 if (pageData ==
NULL) {
3115 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskGetCacheInformation: Unable to find caching mode page.\n"));
3126 CacheInfo->ParametersSavable = pageData->
PageSavable;
3137 CacheInfo->ReadRetentionPriority =
3139 CacheInfo->WriteRetentionPriority =
3142 CacheInfo->DisablePrefetchTransferLength =
3146 CacheInfo->ScalarPrefetch.Minimum =
3149 CacheInfo->ScalarPrefetch.Maximum =
3153 CacheInfo->PrefetchScalar =
TRUE;
3154 CacheInfo->ScalarPrefetch.MaximumBlocks =
3203 if (modeData ==
NULL) {
3205 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskSetCacheInformation: Unable to allocate mode "
3230 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskSetCacheInformation: Mode Sense failed\n"));
3259 if (pageData ==
NULL) {
3282 (
UCHAR) (CacheInfo->DisablePrefetchTransferLength >> 8);
3284 (
UCHAR) (CacheInfo->DisablePrefetchTransferLength & 0x00ff);
3287 (
UCHAR) (CacheInfo->ScalarPrefetch.Minimum >> 8);
3289 (
UCHAR) (CacheInfo->ScalarPrefetch.Minimum & 0x00ff);
3292 (
UCHAR) (CacheInfo->ScalarPrefetch.Maximum >> 8);
3294 (
UCHAR) (CacheInfo->ScalarPrefetch.Maximum & 0x00ff);
3299 (
UCHAR) (CacheInfo->ScalarPrefetch.MaximumBlocks >> 8);
3301 (
UCHAR) (CacheInfo->ScalarPrefetch.MaximumBlocks & 0x00ff);
3308 for (
i = 0;
i < 2;
i++) {
3312 (pageData->PageLength + 2),
3313 CacheInfo->ParametersSavable);
3317 if (CacheInfo->WriteCacheEnabled)
3463 ULONG isPowerProtected;
3471 isPowerProtected = 1;
3476 isPowerProtected = 0;
3564 if(partitionZeroData->
ReadyStatus != oldReadyStatus) {
3625 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlGetDriveGeometry: Output buffer too small.\n"));
3739 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlGetDriveGeometryEx: Output buffer too small.\n"));
3789 geometryEx->
Partition.Gpt.DiskId = diskData->
Efi.DiskId;
3798 geometryEx->
Partition.Mbr.Signature = diskData->
Mbr.Signature;
3799 geometryEx->
Partition.Mbr.CheckSum = diskData->
Mbr.MbrCheckSum;
3829 geometryEx->
Detection.DetectionType = DetectNone;
3889 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlGetCacheInformation: Output buffer too small.\n"));
3970 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlSetCacheInformation: Input buffer length mismatch.\n"));
4032 UCHAR densityCode = 0;
4055 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlGetMediaTypesEx: Output buffer too small.\n"));
4070 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlGetMediaTypesEx: Unable to allocate memory.\n"));
4091 srbEx->SrbLength = srbSize;
4095 srbEx->NumSrbExData = 1;
4118 srbExDataCdb16->CdbLength = 6;
4120 cdb = (
PCDB)srbExDataCdb16->Cdb;
4126 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlGetMediaTypesEx: Insufficient extended SRB size.\n"));
4153 mediaPresent =
TRUE;
4161 if (modeData ==
NULL) {
4162 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlGetMediaTypesEx: Unable to allocate memory.\n"));
4174 srbEx->SrbStatus = 0;
4175 srbExDataCdb16->ScsiStatus = 0;
4176 srbExDataCdb16->CdbLength = 6;
4258 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlGetMediaTypesEx: Mode sense for header/bd failed. %lx\n",
status));
4321 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlPredictFailure: Output buffer too small.\n"));
4332 ULONG readBufferSize;
4357 if (readBuffer !=
NULL) {
4369 if (readIrp !=
NULL) {
4400 Irp->AssociatedIrp.SystemBuffer);
4417#if (NTDDI_VERSION >= NTDDI_WINBLUE)
4451 PSTORAGE_FAILURE_PREDICTION_CONFIG enablePrediction;
4469 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlEnableFailurePrediction: Buffer too small.\n"));
4473 enablePrediction = (PSTORAGE_FAILURE_PREDICTION_CONFIG)
Irp->AssociatedIrp.SystemBuffer;
4475 if (enablePrediction->Version != STORAGE_FAILURE_PREDICTION_CONFIG_V1 ||
4476 enablePrediction->Size <
sizeof(STORAGE_FAILURE_PREDICTION_CONFIG)) {
4477 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlEnableFailurePrediction: Buffer version or size is incorrect.\n"));
4481 if (enablePrediction->Reserved != 0) {
4482 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlEnableFailurePrediction: Reserved bytes are not zero!\n"));
4518 Irp->IoStatus.Information =
sizeof(STORAGE_FAILURE_PREDICTION_CONFIG);
4568 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlVerify: Input buffer length mismatch.\n"));
4582 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlVerify: Unable to allocate memory.\n"));
4602 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlVerify: Verify request to invalid sector.\n"));
4611 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlVerify: Verify request to invalid sector.\n"));
4704 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlReassignBlocks: Input buffer length mismatch.\n"));
4712 if (badBlocks->
Count == 0) {
4713 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlReassignBlocks: Invalid block count\n"));
4720 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlReassignBlocks: Input buffer length mismatch for bad blocks.\n"));
4734 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlReassignBlocks: Unable to allocate memory.\n"));
4752 blockCount = badBlocks->
Count;
4759 badBlocks->
Count = (
USHORT) ((blockCount >> 8) & 0XFF);
4760 badBlocks->
Count |= (
USHORT) ((blockCount << 8) & 0XFF00);
4768 for (; blockCount > 0; blockCount--) {
4770 blockNumber = badBlocks->
BlockNumber[blockCount-1];
4789 srbEx->SrbLength = srbSize;
4793 srbEx->NumSrbExData = 1;
4816 srbExDataCdb16->CdbLength = 6;
4818 cdb = (
PCDB)srbExDataCdb16->Cdb;
4824 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlReassignBlocks: Insufficient extended SRB size.\n"));
4911 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlReassignBlocksEx: Input buffer length mismatch.\n"));
4919 if (badBlocks->
Count == 0) {
4920 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlReassignBlocksEx: Invalid block count\n"));
4927 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlReassignBlocksEx: Input buffer length mismatch for bad blocks.\n"));
4941 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlReassignBlocks: Unable to allocate memory.\n"));
4959 blockCount = badBlocks->
Count;
4966 badBlocks->
Count = (
USHORT) ((blockCount >> 8) & 0XFF);
4967 badBlocks->
Count |= (
USHORT) ((blockCount << 8) & 0XFF00);
4975 for (; blockCount > 0; blockCount--) {
4977 blockNumber = badBlocks->
BlockNumber[blockCount-1];
4996 srbEx->SrbLength = srbSize;
5000 srbEx->NumSrbExData = 1;
5023 srbExDataCdb16->CdbLength = 6;
5025 cdb = (
PCDB)srbExDataCdb16->Cdb;
5031 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlReassignBlocks: Insufficient extended SRB size.\n"));
5127 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlIsWritable: Unable to allocate memory.\n"));
5145 if (modeData ==
NULL) {
5146 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlIsWritable: Unable to allocate memory.\n"));
5168 srbEx->SrbLength = srbSize;
5172 srbEx->NumSrbExData = 1;
5195 srbExDataCdb16->CdbLength = 6;
5197 cdb = (
PCDB)srbExDataCdb16->Cdb;
5234 while (retries != 0) {
5414 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlUpdateDriveSize: Output buffer too small.\n"));
5511 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlGetVolumeDiskExtents: Output buffer too small.\n"));
5593 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlSmartGetVersion: Output buffer too small.\n"));
5602 if (srbControl ==
NULL) {
5603 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlSmartGetVersion: Unable to allocate memory.\n"));
5699 ULONG controlCode = 0;
5719 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlSmartReceiveDriveData: Input buffer length invalid.\n"));
5724 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlSmartReceiveDriveData: Output buffer too small.\n"));
5762 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlSmartReceiveDriveData: SMART failure prediction not supported.\n"));
5783 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlSmartReceiveDriveData: Output buffer too small for SMART_READ_LOG.\n"));
5793 if (controlCode == 0) {
5794 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlSmartReceiveDriveData: Invalid request.\n"));
5802 if (srbControl ==
NULL) {
5803 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlSmartReceiveDriveData: Unable to allocate memory.\n"));
5834 Irp->AssociatedIrp.SystemBuffer,
5848 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlSmartReceiveDriveData: Unable to allocate IRP.\n"));
5926 ULONG controlCode = 0;
5946 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlSmartSendDriveCommand: Input buffer size invalid.\n"));
5951 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlSmartSendDriveCommand: Output buffer too small.\n"));
5970 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlSmartSendDriveCommand: SMART failure prediction not supported.\n"));
5992 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlSmartSendDriveCommand: Input buffer too small for SMART_WRITE_LOG.\n"));
6050 if (controlCode == 0) {
6051 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlSmartSendDriveCommand: Invalid request.\n"));
6060 if (srbControl ==
NULL) {
6061 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlSmartSendDriveCommand: Unable to allocate memory.\n"));
6093 Irp->AssociatedIrp.SystemBuffer,
6111 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"DiskIoctlSmartSendDriveCommand: Unable to allocate IRP.\n"));
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
ACPI_SIZE strlen(const char *String)
int strncmp(const char *String1, const char *String2, ACPI_SIZE Count)
#define InterlockedExchange
struct _SENDCMDOUTPARAMS SENDCMDOUTPARAMS
struct _SENDCMDINPARAMS * PSENDCMDINPARAMS
PDEVICE_OBJECT PhysicalDeviceObject
_In_ PSCSI_REQUEST_BLOCK Srb
#define DEV_SAFE_START_UNIT
#define FREE_POOL(_PoolPtr)
#define IS_SCSIOP_READWRITE(opCode)
#define DEV_POWER_PROTECTED
#define TEST_FLAG(Flags, Bit)
#define CLEAR_FLAG(Flags, Bit)
#define SET_FLAG(Flags, Bit)
#define SCSI_ADSENSE_LUN_NOT_READY
#define SCSI_SENSEQ_MANUAL_INTERVENTION_REQUIRED
#define SCSISTAT_RESERVATION_CONFLICT
#define IOCTL_SCSI_MINIPORT_SAVE_ATTRIBUTE_VALUES
#define SCSIOP_REASSIGN_BLOCKS
#define IOCTL_SCSI_MINIPORT_READ_SMART_ATTRIBS
#define SCSIOP_TEST_UNIT_READY
#define IOCTL_SCSI_MINIPORT_DISABLE_SMART
#define SCSI_ADSENSE_INVALID_CDB
#define SCSIOP_MEDIUM_REMOVAL
#define SCSI_SENSE_MEDIUM_ERROR
struct _MODE_PARAMETER_HEADER MODE_PARAMETER_HEADER
#define IOCTL_SCSI_MINIPORT_ENABLE_DISABLE_AUTOSAVE
#define MODE_PAGE_CACHING
#define IOCTL_SCSI_MINIPORT_IDENTIFY
#define SCSI_SENSEQ_CAUSE_NOT_REPORTABLE
#define IOCTL_SCSI_MINIPORT_EXECUTE_OFFLINE_DIAGS
#define MODE_SENSE_RETURN_ALL
#define SCSI_SENSEQ_BECOMING_READY
#define SCSI_SENSE_ILLEGAL_REQUEST
#define IOCTL_SCSI_MINIPORT_READ_SMART_THRESHOLDS
#define IOCTL_SCSI_MINIPORT_ENABLE_SMART
#define SCSIOP_MODE_SENSE
#define SCSI_SENSE_UNIT_ATTENTION
#define SCSI_ADSENSE_NO_MEDIA_IN_DEVICE
#define IOCTL_SCSI_MINIPORT_RETURN_STATUS
#define IOCTL_SCSI_MINIPORT_SMART_VERSION
struct _MODE_PARAMETER_BLOCK * PMODE_PARAMETER_BLOCK
#define MODE_DSP_WRITE_PROTECT
#define SCSI_SENSE_HARDWARE_ERROR
struct _MODE_PARAMETER_BLOCK MODE_PARAMETER_BLOCK
struct _MODE_PARAMETER_HEADER * PMODE_PARAMETER_HEADER
#define SCSI_SENSE_RECOVERED_ERROR
#define SCSIOP_MODE_SELECT
#define SCSI_SENSE_NOT_READY
#define SCSIOP_SYNCHRONIZE_CACHE
#define FILE_DEVICE_SECURE_OPEN
#define IOCTL_DISK_GET_DRIVE_GEOMETRY
enum _STORAGE_MEDIA_TYPE STORAGE_MEDIA_TYPE
#define IOCTL_DISK_VERIFY
#define IOCTL_DISK_IS_WRITABLE
#define IOCTL_STORAGE_GET_MEDIA_TYPES_EX
_In_ PSCSI_REQUEST_BLOCK _Out_ NTSTATUS _Inout_ BOOLEAN * Retry
_In_ PVOID _In_ PCLASS_INIT_DATA InitializationData
#define CLASS_SPECIAL_FUA_NOT_SUPPORTED
_In_z_ PCCHAR _In_ PDEVICE_OBJECT LowerDeviceObject
#define CLASS_SRBEX_NO_SRBEX_DATA_BUFFER_SIZE
struct _CLASS_INIT_DATA CLASS_INIT_DATA
#define CLASS_SPECIAL_DISABLE_WRITE_CACHE
#define ClassAcquireRemoveLock(devobj, tag)
SCSIPORT_API NTSTATUS NTAPI ClassSpinDownPowerHandler(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp)
#define CLASS_SPECIAL_DISABLE_SPIN_DOWN
struct _FUNCTIONAL_DEVICE_EXTENSION * PFUNCTIONAL_DEVICE_EXTENSION
#define CLASS_SRB_SCSI_REQUEST_BLOCK
#define CLASS_SRBEX_SCSI_CDB16_BUFFER_SIZE
#define GUID_CLASSPNP_SRB_SUPPORT
#define GUID_CLASSPNP_QUERY_REGINFOEX
#define ADJUST_FUA_FLAG(fdoExt)
#define DEV_USE_16BYTE_CDB
#define CLASS_SRB_STORAGE_REQUEST_BLOCK
struct _CLASS_QUERY_WMI_REGINFO_EX_LIST CLASS_QUERY_WMI_REGINFO_EX_LIST
#define CLASS_SPECIAL_MODIFY_CACHE_UNSUCCESSFUL
#define SRB_CLASS_FLAGS_PERSISTANT
#define STATUS_NOT_SUPPORTED
#define NT_SUCCESS(StatCode)
static const WCHAR Signature[]
DRIVER_INITIALIZE DriverEntry
#define WPP_INIT_TRACING(a, b)
PVOID NTAPI ClassFindModePage(_In_reads_bytes_(Length) PCHAR ModeSenseBuffer, _In_ ULONG Length, _In_ UCHAR PageMode, _In_ BOOLEAN Use6Byte)
NTSTATUS NTAPI ClassIoComplete(IN PDEVICE_OBJECT Fdo, IN PIRP Irp, IN PVOID Context)
ULONG NTAPI ClassModeSense(_In_ PDEVICE_OBJECT Fdo, _In_reads_bytes_(Length) PCHAR ModeSenseBuffer, _In_ ULONG Length, _In_ UCHAR PageMode)
NTSTATUS NTAPI ClassSendSrbSynchronous(_In_ PDEVICE_OBJECT Fdo, _Inout_ PSCSI_REQUEST_BLOCK _Srb, _In_reads_bytes_opt_(BufferLength) PVOID BufferAddress, _In_ ULONG BufferLength, _In_ BOOLEAN WriteToDevice)
NTSTATUS NTAPI ClassAsynchronousCompletion(PDEVICE_OBJECT DeviceObject, PIRP Irp, PVOID Context)
VOID NTAPI ClassSendDeviceIoControlSynchronous(_In_ ULONG IoControlCode, _In_ PDEVICE_OBJECT TargetDeviceObject, _Inout_updates_opt_(_Inexpressible_(max(InputBufferLength, OutputBufferLength))) PVOID Buffer, _In_ ULONG InputBufferLength, _In_ ULONG OutputBufferLength, _In_ BOOLEAN InternalDeviceIoControl, _Out_ PIO_STATUS_BLOCK IoStatus)
VOID NTAPI ClassCompleteRequest(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_ CCHAR PriorityBoost)
VOID NTAPI ClassReleaseRemoveLock(_In_ PDEVICE_OBJECT DeviceObject, _In_opt_ PIRP Tag)
DISK_MEDIA_TYPES_LIST const DiskMediaTypes[]
DISK_MEDIA_TYPES_LIST const DiskMediaTypesExclude[]
NTSTATUS DiskIoctlVerify(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp)
NTSTATUS DiskIoctlUpdateDriveSize(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp)
NTSTATUS DiskIoctlEnableFailurePrediction(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp)
NTSTATUS DiskIoctlSmartSendDriveCommand(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp)
NTSTATUS DiskIoctlIsWritable(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp)
NTSTATUS DiskGetInfoExceptionInformation(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PMODE_INFO_EXCEPTIONS ReturnPageData)
VOID DiskFlushDispatch(IN PDEVICE_OBJECT Fdo, IN PDISK_GROUP_CONTEXT FlushContext)
NTSTATUS DiskIoctlReassignBlocks(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp)
struct _DISK_GEOMETRY_EX_INTERNAL * PDISK_GEOMETRY_EX_INTERNAL
VOID NTAPI DiskBootDriverReinit(IN PDRIVER_OBJECT DriverObject, IN PVOID Nothing, IN ULONG Count)
NTSTATUS DiskIoctlSetCacheInformation(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp)
NTSTATUS DiskDetermineMediaTypes(IN PDEVICE_OBJECT Fdo, IN PIRP Irp, IN UCHAR MediumType, IN UCHAR DensityCode, IN BOOLEAN MediaPresent, IN BOOLEAN IsWritable)
struct _DISK_GEOMETRY_EX_INTERNAL DISK_GEOMETRY_EX_INTERNAL
NTSTATUS DiskIoctlGetVolumeDiskExtents(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp)
NTSTATUS DiskIoctlReassignBlocksEx(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp)
NTSTATUS NTAPI DiskGetCacheInformation(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PDISK_CACHE_INFORMATION CacheInfo)
NTSTATUS NTAPI DiskSetCacheInformation(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PDISK_CACHE_INFORMATION CacheInfo)
NTSTATUS DiskIoctlSmartReceiveDriveData(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp)
NTSTATUS NTAPI DiskShutdownFlush(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
NTSTATUS DiskIoctlClearVerify(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp)
VOID NTAPI DiskSetSpecialHacks(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN ULONG_PTR Data)
NTSTATUS DiskIoctlGetCacheSetting(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
NTSTATUS DiskIoctlGetDriveGeometryEx(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp)
NTSTATUS NTAPI DiskDeviceControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
VOID NTAPI DiskDriverReinit(IN PDRIVER_OBJECT DriverObject, IN PVOID Nothing, IN ULONG Count)
NTSTATUS DiskIoctlGetMediaTypesEx(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp)
NTSTATUS DiskIoctlGetDriveGeometry(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp)
NTSTATUS DiskIoctlGetCacheInformation(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp)
NTSTATUS DiskIoctlSetCacheSetting(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
VOID NTAPI DiskFdoProcessError(PDEVICE_OBJECT Fdo, PSCSI_REQUEST_BLOCK Srb, NTSTATUS *Status, BOOLEAN *Retry)
NTSTATUS DiskIoctlGetLengthInfo(IN OUT PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp)
#define IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS_ADMIN
NTSTATUS DiskSetInfoExceptionInformation(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PMODE_INFO_EXCEPTIONS PageData)
NTSTATUS DiskModeSelect(IN PDEVICE_OBJECT Fdo, _In_reads_bytes_(Length) PCHAR ModeSelectBuffer, IN ULONG Length, IN BOOLEAN SavePage)
VOID DiskEtwEnableCallback(_In_ LPCGUID SourceId, _In_ ULONG IsEnabled, _In_ UCHAR Level, _In_ ULONGLONG MatchAnyKeyword, _In_ ULONGLONG MatchAllKeyword, _In_opt_ PEVENT_FILTER_DESCRIPTOR FilterData, _In_opt_ PVOID CallbackContext)
NTSTATUS NTAPI DiskReadWriteVerification(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
NTSTATUS DiskIoctlSetVerify(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp)
NTSTATUS DiskCreateFdo(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject, IN PULONG DeviceCount, IN BOOLEAN DasdAccessOnly)
NTSTATUS DiskIoctlPredictFailure(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp)
VOID ResetBus(IN PDEVICE_OBJECT Fdo)
VOID DiskLogCacheInformation(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PDISK_CACHE_INFORMATION CacheInfo, IN NTSTATUS Status)
NTSTATUS DiskIoctlSmartGetVersion(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp)
VOID NTAPI DiskUnload(IN PDRIVER_OBJECT DriverObject)
#define TRANSLATE_RETENTION_PRIORITY(_x)
NTSTATUS DiskEnableDisableFailurePrediction(PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, BOOLEAN Enable)
NTSTATUS NTAPI DiskRemoveDevice(IN PDEVICE_OBJECT DeviceObject, IN UCHAR Type)
NTSTATUS NTAPI DiskFdoSetWmiDataItem(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN ULONG GuidIndex, IN ULONG DataItemId, IN ULONG BufferSize, IN PUCHAR Buffer)
NTSTATUS NTAPI DiskWmiFunctionControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN ULONG GuidIndex, IN CLASSENABLEDISABLEFUNCTION Function, IN BOOLEAN Enable)
GUIDREGINFO DiskWmiFdoGuidList[]
NTSTATUS DiskGenerateDeviceName(IN ULONG DeviceNumber, OUT PCCHAR *RawName)
#define HackDisableTaggedQueuing
NTSTATUS NTAPI DiskFdoQueryWmiRegInfoEx(IN PDEVICE_OBJECT DeviceObject, OUT ULONG *RegFlags, OUT PUNICODE_STRING InstanceName, OUT PUNICODE_STRING MofName)
#define DiskIsValidSmartSelfTest(Subcommand)
#define DISK_TAG_WI_CONTEXT
#define HackDisableSynchronousTransfers
NTSTATUS NTAPI DiskFdoExecuteWmiMethod(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN ULONG GuidIndex, IN ULONG MethodId, IN ULONG InBufferSize, IN ULONG OutBufferSize, IN PUCHAR Buffer)
#define DISK_TAG_CCONTEXT
NTSTATUS DiskInitializeReregistration(VOID)
#define FUNCTIONAL_EXTENSION_SIZE
#define DISK_TAG_DISABLE_CACHE
#define HackDisableSpinDown
NTSTATUS DiskEnableInfoExceptions(_In_ PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, _In_ BOOLEAN Enable)
#define HackRequiresStartUnitCommand
NTSTATUS NTAPI DiskStartFdo(IN PDEVICE_OBJECT Fdo)
NTSTATUS NTAPI DiskInitFdo(IN PDEVICE_OBJECT Fdo)
#define DiskGetDetectInfo(FdoExtension, DetectInfo)
#define DiskDeviceParameterSubkey
#define DiskReadDriveCapacity(Fdo)
#define MAX_SECTORS_PER_VERIFY
IO_WORKITEM_ROUTINE DisableWriteCache
struct _DISK_VERIFY_WORKITEM_CONTEXT * PDISK_VERIFY_WORKITEM_CONTEXT
#define HackCauseNotReportableHack
#define HackDisableWriteCache
#define DiskDeviceCacheIsPowerProtected
NTSTATUS DiskReadFailurePredictStatus(PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, PSTORAGE_FAILURE_PREDICT_STATUS DiskSmartStatus)
NTSTATUS NTAPI DiskStopDevice(IN PDEVICE_OBJECT DeviceObject, IN UCHAR Type)
IO_COMPLETION_ROUTINE DiskFlushComplete
struct _DISK_DATA * PDISK_DATA
#define DISK_TAG_INFO_EXCEPTION
#define DiskDeviceUserWriteCacheSetting
NTSTATUS NTAPI DiskFdoQueryWmiDataBlock(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN ULONG GuidIndex, IN ULONG BufferAvail, OUT PUCHAR Buffer)
NTSTATUS NTAPI DiskAddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT Pdo)
FORCEINLINE PCDB GetSrbScsiData(_In_ PSTORAGE_REQUEST_BLOCK SrbEx, _In_opt_ PUCHAR CdbLength8, _In_opt_ PULONG CdbLength32, _In_opt_ PUCHAR ScsiStatus, _In_opt_ PVOID *SenseInfoBuffer, _In_opt_ PUCHAR SenseInfoBufferLength)
NTSTATUS NTAPI DiskFdoQueryWmiRegInfo(IN PDEVICE_OBJECT DeviceObject, OUT ULONG *RegFlags, OUT PUNICODE_STRING InstanceName)
#define DISK_TAG_MODE_DATA
NTSTATUS DiskReadFailurePredictData(PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, PSTORAGE_FAILURE_PREDICT_DATA DiskSmartData)
NTSTATUS NTAPI DiskFdoSetWmiDataBlock(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN ULONG GuidIndex, IN ULONG BufferSize, IN PUCHAR Buffer)
IO_WORKITEM_ROUTINE DiskIoctlVerifyThread
#define IOCTL_SCSI_MINIPORT_WRITE_SMART_LOG
#define IOCTL_SCSI_MINIPORT_READ_SMART_LOG
#define IOCTL_SCSI_MINIPORT_ENABLE_DISABLE_AUTO_OFFLINE
#define SRB_STATUS_INVALID_LUN
#define SRB_STATUS_REQUEST_FLUSHED
struct _SCSI_REQUEST_BLOCK SCSI_REQUEST_BLOCK
#define SRB_STATUS_NO_HBA
#define SCSI_REQUEST_BLOCK_SIZE
#define SRB_STATUS_INVALID_TARGET_ID
#define SRB_STATUS_UNEXPECTED_BUS_FREE
#define SRB_FUNCTION_EXECUTE_SCSI
#define SRB_STATUS_DATA_OVERRUN
#define SRB_SIMPLE_TAG_REQUEST
#define SRB_STATUS_INVALID_PATH_ID
#define SRB_FLAGS_QUEUE_ACTION_ENABLE
#define SRB_FUNCTION_RESET_BUS
#define SRB_FUNCTION_FLUSH
#define SRB_STATUS_TIMEOUT
#define SRB_FUNCTION_SHUTDOWN
#define SRB_STATUS_AUTOSENSE_VALID
struct _SCSI_REQUEST_BLOCK * PSCSI_REQUEST_BLOCK
#define SRB_STATUS_SELECTION_TIMEOUT
#define SRB_FLAGS_DISABLE_SYNCH_TRANSFER
#define SRB_STATUS(Status)
#define SRB_STATUS_COMMAND_TIMEOUT
#define SRB_STATUS_PARITY_ERROR
#define SRB_STATUS_NO_DEVICE
#define InsertTailList(ListHead, Entry)
#define ExAllocatePoolWithTag(hernya, size, tag)
#define IsListEmpty(ListHead)
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
#define KeInitializeEvent(pEvt, foo, foo2)
#define KeReleaseSpinLock(sl, irql)
#define KeSetEvent(pEvt, foo, foo2)
#define KeAcquireSpinLock(sl, irql)
#define DO_DEVICE_INITIALIZING
#define RemoveHeadList(ListHead)
#define InitializeListHead(ListHead)
#define IOCTL_DISK_GET_DRIVE_GEOMETRY_EX
_Must_inspect_result_ _Out_ PBOOLEAN IsWritable
MxDeviceObject deviceObject
return pProvider IsEnabled(ProviderControl)
GLuint GLsizei GLsizei * length
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 i
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
#define OBJ_KERNEL_HANDLE
#define OBJ_CASE_INSENSITIVE
VOID NTAPI IoQueueWorkItem(IN PIO_WORKITEM IoWorkItem, IN PIO_WORKITEM_ROUTINE WorkerRoutine, IN WORK_QUEUE_TYPE QueueType, IN PVOID Context)
VOID NTAPI IoFreeWorkItem(IN PIO_WORKITEM IoWorkItem)
PIO_WORKITEM NTAPI IoAllocateWorkItem(IN PDEVICE_OBJECT DeviceObject)
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
static DRIVER_DISPATCH ClassDeviceControl
#define MEDIA_CURRENTLY_MOUNTED
#define MEDIA_WRITE_PROTECTED
struct _GET_LENGTH_INFORMATION * PGET_LENGTH_INFORMATION
#define IOCTL_DISK_GET_LENGTH_INFO
#define InitializeObjectAttributes(p, n, a, r, s)
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
NTSYSAPI NTSTATUS NTAPI ZwMakeTemporaryObject(_In_ HANDLE Handle)
NTSYSAPI NTSTATUS NTAPI ZwCreateDirectoryObject(_Out_ PHANDLE DirectoryHandle, _In_ ACCESS_MASK DesiredAccess, _In_ POBJECT_ATTRIBUTES ObjectAttributes)
#define _In_reads_bytes_(s)
#define _Analysis_assume_
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define DIRECTORY_ALL_ACCESS
#define FILE_REMOVABLE_MEDIA
#define UNREFERENCED_PARAMETER(P)
#define IOCTL_DISK_INTERNAL_CLEAR_VERIFY
#define IOCTL_DISK_GET_CACHE_INFORMATION
struct _DISK_CACHE_SETTING * PDISK_CACHE_SETTING
@ DiskCacheModifyUnsuccessful
@ DiskCacheWriteThroughNotSupported
#define EXECUTE_OFFLINE_DIAGS
#define SMART_GET_VERSION
#define READ_ATTRIBUTE_BUFFER_SIZE
#define IOCTL_DISK_UPDATE_DRIVE_SIZE
#define IOCTL_DISK_GET_CACHE_SETTING
#define SMART_RCV_DRIVE_DATA
struct _DISK_GEOMETRY DISK_GEOMETRY
#define SAVE_ATTRIBUTE_VALUES
#define RETURN_SMART_STATUS
#define SMART_SEND_DRIVE_COMMAND
#define IOCTL_DISK_SET_CACHE_INFORMATION
#define IDENTIFY_BUFFER_SIZE
#define IOCTL_DISK_REASSIGN_BLOCKS
struct _GETVERSIONINPARAMS GETVERSIONINPARAMS
#define SMART_LOG_SECTOR_SIZE
#define IOCTL_DISK_INTERNAL_SET_VERIFY
struct _VERIFY_INFORMATION * PVERIFY_INFORMATION
#define ENABLE_DISABLE_AUTO_OFFLINE
struct _REASSIGN_BLOCKS REASSIGN_BLOCKS
struct _DISK_CACHE_SETTING DISK_CACHE_SETTING
#define IOCTL_DISK_SET_CACHE_SETTING
struct _REASSIGN_BLOCKS_EX REASSIGN_BLOCKS_EX
#define READ_THRESHOLD_BUFFER_SIZE
#define ENABLE_DISABLE_AUTOSAVE
#define IOCTL_DISK_REASSIGN_BLOCKS_EX
struct _DISK_GEOMETRY * PDISK_GEOMETRY
_In_ ULONG _In_ ULONG _In_ ULONG Length
#define IOCTL_STORAGE_PREDICT_FAILURE
struct _STORAGE_PREDICT_FAILURE STORAGE_PREDICT_FAILURE
struct _STORAGE_PREDICT_FAILURE * PSTORAGE_PREDICT_FAILURE
struct _DEVICE_MEDIA_INFO DEVICE_MEDIA_INFO
struct _VOLUME_DISK_EXTENTS * PVOLUME_DISK_EXTENTS
#define IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS
#define IO_WRITE_CACHE_DISABLED
#define IO_WARNING_WRITE_FUA_PROBLEM
#define IO_WRITE_CACHE_ENABLED
PDEVICE_OBJECT NTAPI IoAttachDeviceToDeviceStack(IN PDEVICE_OBJECT SourceDevice, IN PDEVICE_OBJECT TargetDevice)
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
PDEVICE_OBJECT NTAPI IoGetAttachedDeviceReference(PDEVICE_OBJECT DeviceObject)
VOID NTAPI IoRegisterDriverReinitialization(IN PDRIVER_OBJECT DriverObject, IN PDRIVER_REINITIALIZE ReinitRoutine, IN PVOID Context)
VOID NTAPI IoRegisterBootDriverReinitialization(IN PDRIVER_OBJECT DriverObject, IN PDRIVER_REINITIALIZE ReinitRoutine, IN PVOID Context)
VOID NTAPI IoWriteErrorLogEntry(IN PVOID ElEntry)
PVOID NTAPI IoAllocateErrorLogEntry(IN PVOID IoObject, IN UCHAR EntrySize)
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)
PIRP NTAPI IoAllocateIrp(IN CCHAR StackSize, IN BOOLEAN ChargeQuota)
PIRP NTAPI IoBuildDeviceIoControlRequest(IN ULONG IoControlCode, IN PDEVICE_OBJECT DeviceObject, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, IN BOOLEAN InternalDeviceIoControl, IN PKEVENT Event, IN PIO_STATUS_BLOCK IoStatusBlock)
VOID NTAPI IoSetHardErrorOrVerifyDevice(IN PIRP Irp, IN PDEVICE_OBJECT DeviceObject)
LONG NTAPI KeReleaseMutex(IN PKMUTEX Mutex, IN BOOLEAN Wait)
#define STATUS_INTERNAL_ERROR
#define STATUS_OBJECT_NAME_EXISTS
NTSTRSAFEVAPI RtlStringCchPrintfW(_Out_writes_(cchDest) _Always_(_Post_z_) NTSTRSAFE_PWSTR pszDest, _In_ size_t cchDest, _In_ _Printf_format_string_ NTSTRSAFE_PCWSTR pszFormat,...)
VOID NTAPI IoInvalidateDeviceRelations(IN PDEVICE_OBJECT DeviceObject, IN DEVICE_RELATION_TYPE Type)
NTSTATUS NTAPI IoReportTargetDeviceChangeAsynchronous(IN PDEVICE_OBJECT PhysicalDeviceObject, IN PVOID NotificationStructure, IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL, IN PVOID Context OPTIONAL)
struct _DISK_CACHE_INFORMATION DISK_CACHE_INFORMATION
_In_opt_ WDFREQUEST _In_ ULONG _In_ BOOLEAN _In_ PCDB Cdb
#define CLASS_SPECIAL_CAUSE_NOT_REPORTABLE_HACK
#define IOCTL_SCSI_MINIPORT
struct _SRB_IO_CONTROL SRB_IO_CONTROL
struct STOR_ADDRESS_ALIGN _STOR_ADDR_BTL8 * PSTOR_ADDR_BTL8
#define MODE_PAGE_FAULT_REPORTING
#define SCSI_SENSE_OPTIONS_FIXED_FORMAT_IF_UNKNOWN_FORMAT_INDICATED
#define REVERSE_BYTES_QUAD(Destination, Source)
#define REVERSE_BYTES_SHORT(Destination, Source)
#define STOR_ADDRESS_TYPE_BTL8
struct STOR_ADDRESS_ALIGN _STOR_ADDR_BTL8 STOR_ADDR_BTL8
#define REVERSE_BYTES(Destination, Source)
#define STOR_ADDR_BTL8_ADDRESS_LENGTH
#define STORAGE_REQUEST_BLOCK_VERSION_1
struct SRB_ALIGN _SRBEX_DATA_SCSI_CDB16 SRBEX_DATA_SCSI_CDB16
#define SRB_TYPE_STORAGE_REQUEST_BLOCK
#define SRB_FUNCTION_STORAGE_REQUEST_BLOCK
struct SRB_ALIGN _SRBEX_DATA_SCSI_CDB16 * PSRBEX_DATA_SCSI_CDB16
#define SRBEX_DATA_SCSI_CDB16_LENGTH
#define STATUS_MORE_PROCESSING_REQUIRED
#define STATUS_BUFFER_TOO_SMALL
#define TRACE_LEVEL_WARNING
#define TRACE_LEVEL_VERBOSE
#define TRACE_LEVEL_FATAL
#define TRACE_LEVEL_ERROR
#define TRACE_LEVEL_INFORMATION
__callback PCLASS_QUERY_WMI_REGINFO_EX ClassFdoQueryWmiRegInfoEx
LARGE_INTEGER StartingOffset
PDEVICE_OBJECT LowerDeviceObject
struct _FUNCTIONAL_DEVICE_EXTENSION * PartitionZeroExtension
LARGE_INTEGER PartitionLength
ULONG AlignmentRequirement
DISK_GROUP_CONTEXT FlushContext
DISK_USER_WRITE_CACHE_SETTING WriteCacheOverride
PARTITION_STYLE PartitionStyle
BOOLEAN ScsiInfoExceptionsSupported
FAILURE_PREDICTION_METHOD FailurePredictionCapability
BOOLEAN FailurePredictionEnabled
struct _DISK_DATA::@1097::@1100 Mbr
struct _DISK_DATA::@1097::@1101 Efi
LARGE_INTEGER StartingOffset
LARGE_INTEGER ExtentLength
DISK_PARTITION_INFO Partition
DISK_DETECTION_INFO Detection
PDEVICE_OBJECT DeviceObject
ULONG ScanForSpecialFlags
DISK_GEOMETRY DiskGeometry
COMMON_DEVICE_EXTENSION CommonExtension
PSTORAGE_ADAPTER_DESCRIPTOR AdapterDescriptor
PSTORAGE_DEVICE_DESCRIPTOR DeviceDescriptor
struct _IO_STACK_LOCATION::@4104::@4126 Scsi
union _IO_STACK_LOCATION::@1611 Parameters
struct _IO_STACK_LOCATION::@1611::@1612 DeviceIoControl
UCHAR MultiplicationFactor
UCHAR WriteRetensionPriority
UCHAR ReadRetensionPriority
UCHAR MaximumPrefetchCeiling[2]
UCHAR DisablePrefetchTransfer[2]
LARGE_INTEGER BlockNumber[1]
UCHAR SenseInfoBufferLength
ULONG NumberOfDiskExtents
#define FIELD_OFFSET(t, f)
union _LARGE_INTEGER LARGE_INTEGER
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define RtlMoveMemory(Destination, Source, Length)
#define CONTAINING_RECORD(address, type, field)
#define STATUS_IO_DEVICE_ERROR
#define STATUS_INVALID_DEVICE_REQUEST
#define STATUS_MEDIA_WRITE_PROTECTED
#define STATUS_DATA_OVERRUN
#define STATUS_INVALID_PARAMETER
#define STATUS_NONEXISTENT_SECTOR
#define STATUS_UNSUCCESSFUL
#define STATUS_NO_MEDIA_IN_DEVICE
#define STATUS_OBJECT_NAME_COLLISION
#define STATUS_INFO_LENGTH_MISMATCH
#define STATUS_VERIFY_REQUIRED
#define STATUS_INSUFFICIENT_RESOURCES
struct _CDB::_CDB10 CDB10
struct _CDB::_MODE_SELECT MODE_SELECT
struct _CDB::_CDB6GENERIC CDB6GENERIC
struct _CDB::_CDB6FORMAT CDB6FORMAT
struct _CDB::_MODE_SENSE MODE_SENSE
struct _CDB::_CDB16 CDB16
_In_ PWDFDEVICE_INIT _In_ PFN_WDF_DEVICE_SHUTDOWN_NOTIFICATION Notification
_In_ PDEVICE_OBJECT DeviceObject
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
_Must_inspect_result_ _In_ WDFDEVICE Fdo
_In_ WDFREQUEST _In_ size_t OutputBufferLength
_Must_inspect_result_ _In_ PWDF_WORKITEM_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWORKITEM * WorkItem
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR _In_ ULONGLONG _In_ ULONGLONG _In_opt_ PEVENT_FILTER_DESCRIPTOR _Inout_opt_ PVOID CallbackContext
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR _In_ ULONGLONG MatchAnyKeyword
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR _In_ ULONGLONG _In_ ULONGLONG _In_opt_ PEVENT_FILTER_DESCRIPTOR FilterData
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR _In_ ULONGLONG _In_ ULONGLONG MatchAllKeyword
_IRQL_requires_same_ typedef _In_ ULONG _In_ UCHAR Level
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
#define IoIsErrorUserInduced(Status)
NTKRNLVISTAAPI IO_PRIORITY_HINT NTAPI IoGetIoPriorityHint(_In_ PIRP Irp)
ActualNumberDriverObjects * sizeof(PDRIVER_OBJECT)) PDRIVER_OBJECT *DriverObjectList
IO_COMPLETION_ROUTINE * PIO_COMPLETION_ROUTINE
struct _IO_WORKITEM * PIO_WORKITEM
#define IRP_MJ_FLUSH_BUFFERS
#define KeWaitForMutexObject
#define ObDereferenceObject