📄 mmc.c
字号:
ExFreePool(buffer);
return STATUS_INTERNAL_ERROR;
}
returned = buffer->DataLength[0] << 24 |
buffer->DataLength[1] << 16 |
buffer->DataLength[2] << 8 |
buffer->DataLength[3] << 0 ;
returned += 4*sizeof(UCHAR);
if (returned <= size) {
*Buffer = buffer;
*BytesReturned = size; // amount of 'safe' memory
return STATUS_SUCCESS;
}
//
// else retry using the new size....
//
size = returned;
ExFreePool(buffer);
buffer = NULL;
}
//
// it failed after a number of attempts, so just fail.
//
KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures,
"CdRomGetConfiguration: Failed %d attempts to get all feature "
"information\n", i));
return STATUS_IO_DEVICE_ERROR;
}
VOID
CdRomIsDeviceMmcDevice(
IN PDEVICE_OBJECT Fdo,
OUT PBOOLEAN IsMmc
)
{
PFUNCTIONAL_DEVICE_EXTENSION fdoExtension = Fdo->DeviceExtension;
PCOMMON_DEVICE_EXTENSION commonExtension = Fdo->DeviceExtension;
PCDROM_DATA cdData = commonExtension->DriverData;
GET_CONFIGURATION_HEADER localHeader = {0};
NTSTATUS status;
ULONG usable;
ULONG size;
ULONG previouslyFailed;
PAGED_CODE();
ASSERT( commonExtension->IsFdo );
*IsMmc = FALSE;
//
// read the registry in case the drive failed previously,
// and a timeout is occurring.
//
previouslyFailed = FALSE;
ClassGetDeviceParameter(fdoExtension,
CDROM_SUBKEY_NAME,
CDROM_NON_MMC_DRIVE_NAME,
&previouslyFailed
);
if (previouslyFailed) {
SET_FLAG(cdData->HackFlags, CDROM_HACK_BAD_GET_CONFIG_SUPPORT);
}
//
// check for the following profiles:
//
// ProfileList
//
status = CdRompGetConfiguration(Fdo,
&localHeader,
sizeof(localHeader),
&usable,
FeatureProfileList,
SCSI_GET_CONFIGURATION_REQUEST_TYPE_ALL);
if (status == STATUS_INVALID_DEVICE_REQUEST ||
status == STATUS_NO_MEDIA_IN_DEVICE ||
status == STATUS_IO_DEVICE_ERROR ||
status == STATUS_IO_TIMEOUT) {
KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures,
"GetConfiguration Failed (%x), device %p not mmc-compliant\n",
status, Fdo
));
previouslyFailed = TRUE;
ClassSetDeviceParameter(fdoExtension,
CDROM_SUBKEY_NAME,
CDROM_NON_MMC_DRIVE_NAME,
previouslyFailed
);
return;
} else if (!NT_SUCCESS(status)) {
KdPrintEx((DPFLTR_CDROM_ID, CdromDebugError,
"GetConfiguration Failed, status %x -- defaulting to -ROM\n",
status));
return;
} else if (usable < sizeof(GET_CONFIGURATION_HEADER)) {
KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures,
"GetConfiguration Failed, returned only %x bytes!\n", usable));
previouslyFailed = TRUE;
ClassSetDeviceParameter(fdoExtension,
CDROM_SUBKEY_NAME,
CDROM_NON_MMC_DRIVE_NAME,
previouslyFailed
);
return;
}
size = (localHeader.DataLength[0] << 24) |
(localHeader.DataLength[1] << 16) |
(localHeader.DataLength[2] << 8) |
(localHeader.DataLength[3] << 0);
if (size <= 4) {
KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures,
"GetConfiguration Failed, claims MMC support but doesn't "
"correctly return config length! (%x)\n",
size
));
previouslyFailed = TRUE;
ClassSetDeviceParameter(fdoExtension,
CDROM_SUBKEY_NAME,
CDROM_NON_MMC_DRIVE_NAME,
previouslyFailed
);
return;
} else if ((size % 4) != 0) {
KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures,
"GetConfiguration Failed, returned odd number of bytes %x!\n",
size
));
previouslyFailed = TRUE;
ClassSetDeviceParameter(fdoExtension,
CDROM_SUBKEY_NAME,
CDROM_NON_MMC_DRIVE_NAME,
previouslyFailed
);
return;
}
size += 4; // sizeof the datalength fields
#if DBG
{
PGET_CONFIGURATION_HEADER dbgBuffer;
NTSTATUS dbgStatus;
dbgBuffer = ExAllocatePoolWithTag(NonPagedPoolCacheAligned,
(SIZE_T)size,
CDROM_TAG_FEATURE);
if (dbgBuffer != NULL) {
RtlZeroMemory(dbgBuffer, size);
dbgStatus = CdRompGetConfiguration(Fdo, dbgBuffer, size,
&size, FeatureProfileList,
SCSI_GET_CONFIGURATION_REQUEST_TYPE_ALL);
if (NT_SUCCESS(dbgStatus)) {
CdRompPrintAllFeaturePages(dbgBuffer, usable);
}
ExFreePool(dbgBuffer);
}
}
#endif // DBG
*IsMmc = TRUE;
return;
}
VOID
CdRompPrintAllFeaturePages(
IN PGET_CONFIGURATION_HEADER Buffer,
IN ULONG Usable
)
{
PFEATURE_HEADER header;
////////////////////////////////////////////////////////////////////////////////
// items expected to ALWAYS be current if they exist
////////////////////////////////////////////////////////////////////////////////
header = CdRomFindFeaturePage(Buffer, Usable, FeatureProfileList);
if (header != NULL) {
KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures,
"CdromGetConfiguration: CurrentProfile %x "
"with %x bytes of data at %p\n",
Buffer->CurrentProfile[0] << 8 |
Buffer->CurrentProfile[1],
Usable, Buffer));
}
header = CdRomFindFeaturePage(Buffer, Usable, FeatureCore);
if (header) {
KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures,
"CdromGetConfiguration: %s %s\n",
(header->Current ?
"Currently supports" : "Is able to support"),
"CORE Features"
));
}
header = CdRomFindFeaturePage(Buffer, Usable, FeatureMorphing);
if (header) {
KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures,
"CdromGetConfiguration: %s %s\n",
(header->Current ?
"Currently supports" : "Is able to support"),
"Morphing"
));
}
header = CdRomFindFeaturePage(Buffer, Usable, FeatureRemovableMedium);
if (header) {
KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures,
"CdromGetConfiguration: %s %s\n",
(header->Current ?
"Currently supports" : "Is able to support"),
"Removable Medium"
));
}
header = CdRomFindFeaturePage(Buffer, Usable, FeaturePowerManagement);
if (header) {
KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures,
"CdromGetConfiguration: %s %s\n",
(header->Current ?
"Currently supports" : "Is able to support"),
"Power Management"
));
}
header = CdRomFindFeaturePage(Buffer, Usable, FeatureEmbeddedChanger);
if (header) {
KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures,
"CdromGetConfiguration: %s %s\n",
(header->Current ?
"Currently supports" : "Is able to support"),
"Embedded Changer"
));
}
header = CdRomFindFeaturePage(Buffer, Usable, FeatureMicrocodeUpgrade);
if (header) {
KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures,
"CdromGetConfiguration: %s %s\n",
(header->Current ?
"Currently supports" : "Is able to support"),
"Microcode Update"
));
}
header = CdRomFindFeaturePage(Buffer, Usable, FeatureTimeout);
if (header) {
KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures,
"CdromGetConfiguration: %s %s\n",
(header->Current ?
"Currently supports" : "Is able to support"),
"Timeouts"
));
}
header = CdRomFindFeaturePage(Buffer, Usable, FeatureLogicalUnitSerialNumber);
if (header) {
KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures,
"CdromGetConfiguration: %s %s\n",
(header->Current ?
"Currently supports" : "Is able to support"),
"LUN Serial Number"
));
}
////////////////////////////////////////////////////////////////////////////////
// items expected not to always be current
////////////////////////////////////////////////////////////////////////////////
header = CdRomFindFeaturePage(Buffer, Usable, FeatureWriteProtect);
if (header) {
KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures,
"CdromGetConfiguration: %s %s\n",
(header->Current ?
"Currently supports" : "Is able to support"),
"Software Write Protect"
));
}
header = CdRomFindFeaturePage(Buffer, Usable, FeatureRandomReadable);
if (header) {
KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures,
"CdromGetConfiguration: %s %s\n",
(header->Current ?
"Currently supports" : "Is able to support"),
"Random Reads"
));
}
header = CdRomFindFeaturePage(Buffer, Usable, FeatureMultiRead);
if (header) {
KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures,
"CdromGetConfiguration: %s %s\n",
(header->Current ?
"Currently supports" : "Is able to support"),
"Multi-Read"
));
}
header = CdRomFindFeaturePage(Buffer, Usable, FeatureCdRead);
if (header) {
KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures,
"CdromGetConfiguration: %s %s\n",
(header->Current ?
"Currently supports" : "Is able to support"),
"reading from CD-ROM/R/RW"
));
}
header = CdRomFindFeaturePage(Buffer, Usable, FeatureDvdRead);
if (header) {
KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures,
"CdromGetConfiguration: %s %s\n",
(header->Current ?
"Currently supports" : "Is able to support"),
"DVD Structure Reads"
));
}
header = CdRomFindFeaturePage(Buffer, Usable, FeatureRandomWritable);
if (header) {
KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures,
"CdromGetConfiguration: %s %s\n",
(header->Current ?
"Currently supports" : "Is able to support"),
"Random Writes"
));
}
header = CdRomFindFeaturePage(Buffer, Usable, FeatureIncrementalStreamingWritable);
if (header) {
KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures,
"CdromGetConfiguration: %s %s\n",
(header->Current ?
"Currently supports" : "Is able to support"),
"Incremental Streaming Writing"
));
}
header = CdRomFindFeaturePage(Buffer, Usable, FeatureSectorErasable);
if (header) {
KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures,
"CdromGetConfiguration: %s %s\n",
(header->Current ?
"Currently supports" : "Is able to support"),
"Sector Erasable Media"
));
}
header = CdRomFindFeaturePage(Buffer, Usable, FeatureFormattable);
if (header) {
KdPrintEx((DPFLTR_CDROM_ID, CdromDebugFeatures,
"CdromGetConfiguration: %s %s\n",
(header->Current ?
"Currently supports" : "Is able to support"),
"Formatting"
));
}
header = CdRomFindFeaturePage(Buffer, Usable, FeatureDefectManagement);
if (header) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -