7327 ULONG controlCode = irpStack->
Parameters.DeviceIoControl.IoControlCode;
7333 ULONG modifiedIoControlCode = 0;
7334 GUID activityId = {0};
7357 #if BUILD_WOW64_ENABLED && defined(_WIN64) 7359 if (IoIs32bitProcess(
Irp)) {
7361 if (irpStack->
Parameters.DeviceIoControl.InputBufferLength <
sizeof(SCSI_PASS_THROUGH32)){
7369 goto SetStatusAndReturn;
7377 if (irpStack->
Parameters.DeviceIoControl.InputBufferLength <
7386 goto SetStatusAndReturn;
7400 goto SetStatusAndReturn;
7404 Irp->IoStatus.Information = 0;
7407 switch (controlCode) {
7418 if (irpStack->
Parameters.DeviceIoControl.OutputBufferLength <
7426 uniqueId =
Irp->AssociatedIrp.SystemBuffer;
7431 if (irpStack->
Parameters.DeviceIoControl.OutputBufferLength <
7444 Irp->IoStatus.Information =
sizeof(
USHORT) +
7455 if (irpStack->
Parameters.DeviceIoControl.OutputBufferLength <
7463 name =
Irp->AssociatedIrp.SystemBuffer;
7467 if (irpStack->
Parameters.DeviceIoControl.OutputBufferLength <
7479 Irp->IoStatus.Information =
sizeof(
USHORT) +
name->NameLength;
7486 WCHAR driveLetterNameBuffer[10] = {0};
7491 if (irpStack->
Parameters.DeviceIoControl.OutputBufferLength <
7513 driveLetterName.
Buffer = driveLetterNameBuffer;
7514 driveLetterName.
MaximumLength =
sizeof(driveLetterNameBuffer);
7515 driveLetterName.
Length = 0;
7520 queryTable[0].
Name = valueName;
7525 L"\\Registry\\Machine\\System\\DISK",
7533 if (driveLetterName.
Length == 4 &&
7534 driveLetterName.
Buffer[0] ==
'%' &&
7535 driveLetterName.
Buffer[1] ==
':') {
7537 driveLetterName.
Buffer[0] = 0xFF;
7539 }
else if (driveLetterName.
Length != 4 ||
7542 driveLetterName.
Buffer[1] !=
':') {
7549 suggestedName =
Irp->AssociatedIrp.SystemBuffer;
7554 Irp->IoStatus.Information =
7557 if (irpStack->
Parameters.DeviceIoControl.OutputBufferLength <
7558 Irp->IoStatus.Information) {
7560 Irp->IoStatus.Information =
7568 L"\\Registry\\Machine\\System\\DISK",
7574 suggestedName->
Name[12] = driveLetterName.
Buffer[0];
7575 suggestedName->
Name[13] =
':';
7599 if (commonExtension->
IsFdo){
7628 goto SetStatusAndReturn;
7646 goto SetStatusAndReturn;
7678 modifiedIoControlCode = (controlCode & ~0xffff0000);
7683 modifiedIoControlCode = controlCode;
7690 switch (modifiedIoControlCode) {
7696 if (irpStack->
Parameters.DeviceIoControl.OutputBufferLength <
7710 }
else if (!commonExtension->
IsFdo) {
7728 info =
Irp->AssociatedIrp.SystemBuffer;
7730 *
info = fdoExtension->PrivateFdoData->HotplugInfo;
7744 if (irpStack->
Parameters.DeviceIoControl.InputBufferLength <
7756 goto SetStatusAndReturn;
7760 if (!commonExtension->
IsFdo) {
7779 if (
info->Size != fdoExtension->PrivateFdoData->HotplugInfo.Size)
7784 if (
info->MediaRemovable != fdoExtension->PrivateFdoData->HotplugInfo.MediaRemovable)
7789 if (
info->MediaHotplug != fdoExtension->PrivateFdoData->HotplugInfo.MediaHotplug)
7796 if (
info->WriteCacheEnableOverride != fdoExtension->PrivateFdoData->HotplugInfo.WriteCacheEnableOverride)
7798 fdoExtension->PrivateFdoData->HotplugInfo.WriteCacheEnableOverride =
info->WriteCacheEnableOverride;
7804 ClassSetDeviceParameter(fdoExtension,
7807 info->WriteCacheEnableOverride);
7810 fdoExtension->PrivateFdoData->HotplugInfo.DeviceHotplug =
info->DeviceHotplug;
7816 ClassSetDeviceParameter(fdoExtension,
7846 if (irpStack->
Parameters.DeviceIoControl.OutputBufferLength) {
7853 if (irpStack->
Parameters.DeviceIoControl.OutputBufferLength <
7857 "buffer too small\n"));
7860 Irp->IoStatus.Information =
sizeof(
ULONG);
7868 goto SetStatusAndReturn;
7872 if (!commonExtension->
IsFdo) {
7886 goto SetStatusAndReturn;
7894 if (irpStack->
Parameters.DeviceIoControl.OutputBufferLength) {
7914 Irp->IoStatus.Information = 0;
7919 goto SetStatusAndReturn;
7930 irp2->Tail.Overlay.Thread =
Irp->Tail.Overlay.Thread;
8028 if (irpStack->
Parameters.DeviceIoControl.InputBufferLength <
8040 goto SetStatusAndReturn;
8043 if (!commonExtension->
IsFdo) {
8064 ((modifiedIoControlCode ==
8081 if (irpStack->
Parameters.DeviceIoControl.InputBufferLength <
8089 Irp->IoStatus.Information = 0;
8096 goto SetStatusAndReturn;
8099 if (!commonExtension->
IsFdo) {
8123 goto SetStatusAndReturn;
8135 if (!commonExtension->
IsFdo) {
8142 goto SetStatusAndReturn;
8189 if (!commonExtension->
IsFdo) {
8195 goto SetStatusAndReturn;
8218 if (!commonExtension->
IsFdo) {
8226 goto SetStatusAndReturn;
8233 TracePrint((
TRACE_LEVEL_WARNING, TRACE_FLAG_IOCTL,
"ClassDeviceControl: call to eject paging device - " 8239 Irp->IoStatus.Information = 0;
8245 goto SetStatusAndReturn;
8262 TracePrint((
TRACE_LEVEL_WARNING, TRACE_FLAG_IOCTL,
"ClassDeviceControl: call to eject protected locked " 8263 "device - failure\n"));
8267 Irp->IoStatus.Information = 0;
8279 goto SetStatusAndReturn;
8316 if (commonExtension->
IsFdo) {
8343 if (irpStack->
Parameters.DeviceIoControl.OutputBufferLength >=
8347 Irp->AssociatedIrp.SystemBuffer;
8375 if (irpStack->
Parameters.DeviceIoControl.OutputBufferLength <
8391 if (!commonExtension->
IsFdo) {
8420 readCapacity->NumberOfBlocks.QuadPart++;
8428 diskLength.
QuadPart = readCapacity->NumberOfBlocks.QuadPart *
8429 readCapacity->BlockLength;
8438 TracePrint((
TRACE_LEVEL_WARNING, TRACE_FLAG_IOCTL,
"ClassDeviceControl: ClassReadDriveCapacity failed: 0x%X IsCachedDriveCapDataValid: %d\n",
8441 Irp->IoStatus.Information = 0;
8464 if (!commonExtension->
IsFdo) {
8480 switch (
query->PropertyId ) {
8555 if (!commonExtension->
IsFdo) {
8587 if (irpStack->
Parameters.DeviceIoControl.InputBufferLength <
8598 if (!commonExtension->
IsFdo) {
8609 switch(dsmAttributes->
Action) {
8654 if (commonExtension->
IsFdo) {
8679 #if (NTDDI_VERSION >= NTDDI_WINTRHESHOLD) 8688 if (!commonExtension->
IsFdo) {
8694 goto SetStatusAndReturn;
8702 if (!commonExtension->
IsFdo) {
8708 goto SetStatusAndReturn;
8719 TracePrint((
TRACE_LEVEL_ERROR, TRACE_FLAG_IOCTL,
"IoDeviceControl: Unsupported device IOCTL %x for %p\n",
IO_COMPLETION_ROUTINE ClassCheckVerifyComplete
#define IOCTL_STORAGE_MCN_CONTROL
#define SRB_TYPE_STORAGE_REQUEST_BLOCK
#define SCSIOP_RESERVE_UNIT
NTSTATUS ClassDeviceHwFirmwareActivateProcess(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp, _Inout_ PSCSI_REQUEST_BLOCK Srb)
#define STATUS_INSUFFICIENT_RESOURCES
#define ClassAcquireRemoveLock(devobj, tag)
#define SCSIOP_RESERVE_UNIT10
#define STATUS_INFO_LENGTH_MISMATCH
#define IOCTL_STORAGE_SET_HOTPLUG_INFO
NTSTATUS ClasspEjectionControl(IN PDEVICE_OBJECT Fdo, IN PIRP Irp, IN MEDIA_LOCK_TYPE LockType, IN BOOLEAN Lock)
NTSTATUS ClasspDeviceMediaTypeProperty(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp, _Inout_ PSCSI_REQUEST_BLOCK Srb)
#define IOCTL_SCSI_PASS_THROUGH_DIRECT_EX
#define IOCTL_STORAGE_GET_LB_PROVISIONING_MAP_RESOURCES
NTSYSAPI NTSTATUS WINAPI RtlQueryRegistryValues(ULONG, PCWSTR, PRTL_QUERY_REGISTRY_TABLE, PVOID, PVOID)
#define IOCTL_STORAGE_MEDIA_REMOVAL
#define SCSIOP_RELEASE_UNIT
#define DeviceDsmAction_OffloadWrite
NTSTATUS ClasspPriorityHint(PDEVICE_OBJECT DeviceObject, PIRP Irp)
#define STATUS_INVALID_PARAMETER
NTSTATUS InitializeStorageRequestBlock(_Inout_bytecount_(ByteSize) PSTORAGE_REQUEST_BLOCK Srb, _In_ USHORT AddressType, _In_ ULONG ByteSize, _In_ ULONG NumSrbExData,...)
struct _FUNCTIONAL_DEVICE_EXTENSION * PartitionZeroExtension
COMMON_DEVICE_EXTENSION CommonExtension
#define IOCTL_STORAGE_PERSISTENT_RESERVE_OUT
#define SCSIOP_TEST_UNIT_READY
#define REVERSE_BYTES(Destination, Source)
#define IOCTL_STORAGE_GET_HOTPLUG_INFO
NTSTATUS ClasspDeviceSeekPenaltyProperty(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _Inout_ PSCSI_REQUEST_BLOCK Srb)
NTSTATUS ClasspPersistentReserve(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _Inout_ PSCSI_REQUEST_BLOCK Srb)
#define IOCTL_STORAGE_CHECK_PRIORITY_HINT_SUPPORT
READ_CAPACITY_DATA_EX LastKnownDriveCapacityData
FORCEINLINE PCDB SrbGetCdb(_In_ PVOID Srb)
struct _CDB::_CDB10 CDB10
#define TRACE_LEVEL_INFORMATION
#define IOCTL_STORAGE_FIRMWARE_ACTIVATE
LONG NTAPI KeSetEvent(IN PKEVENT Event, IN KPRIORITY Increment, IN BOOLEAN Wait)
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
NTSTATUS ClasspDeviceTrimProcess(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_ PGUID ActivityId, _Inout_ PSCSI_REQUEST_BLOCK Srb)
#define SRB_CLASS_FLAGS_LOW_PRIORITY
NTSTATUS ClassDeviceGetLBProvisioningResources(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp, _Inout_ PSCSI_REQUEST_BLOCK Srb)
#define SCSIOP_RELEASE_UNIT10
#define STATUS_BUFFER_TOO_SMALL
_Must_inspect_result_ NTSTATUS NTAPI ClassReadDriveCapacity(_In_ PDEVICE_OBJECT Fdo)
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
DEVICE_DATA_MANAGEMENT_SET_ACTION Action
#define IOCTL_SCSI_PASS_THROUGH_EX
#define IOCTL_STORAGE_FIND_NEW_DEVICES
FORCEINLINE VOID IoCopyCurrentIrpStackLocationToNext(_Inout_ PIRP Irp)
#define IOCTL_MOUNTDEV_QUERY_DEVICE_NAME
PDEVICE_OBJECT DeviceObject
_In_ PDEVICE_OBJECT DeviceObject
NTSTATUS ClasspAccessAlignmentProperty(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _Inout_ PSCSI_REQUEST_BLOCK Srb)
#define IOCTL_MOUNTDEV_QUERY_UNIQUE_ID
#define STATUS_INVALID_PARAMETER_3
#define CLASSP_REG_SUBKEY_NAME
#define TRACE_LEVEL_VERBOSE
#define FREE_POOL(_PoolPtr)
struct _FUNCTIONAL_DEVICE_EXTENSION * PFUNCTIONAL_DEVICE_EXTENSION
#define CLASS_SRBEX_SCSI_CDB16_BUFFER_SIZE
static struct _test_info info[]
NTSTATUS ClasspWriteCacheProperty(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _Inout_ PSCSI_REQUEST_BLOCK Srb)
#define IOCTL_STORAGE_EJECTION_CONTROL
#define IOCTL_STORAGE_RELEASE
#define DeviceDsmAction_Trim
#define IOCTL_STORAGE_EJECT_MEDIA
struct _MOUNTDEV_NAME MOUNTDEV_NAME
_IRQL_requires_same_ NTSTATUS ClasspStorageEventNotification(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp)
VOID NTAPI ClassReleaseRemoveLock(_In_ PDEVICE_OBJECT DeviceObject, _In_opt_ PIRP Tag)
NTSTATUS ClasspDeviceGetLBAStatus(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp, _Inout_ PSCSI_REQUEST_BLOCK Srb)
#define STATUS_INVALID_PARAMETER_2
#define IoCompleteRequest
#define IOCTL_STORAGE_GET_DEVICE_NUMBER
#define RTL_QUERY_REGISTRY_TYPECHECK
struct _CDB::_START_STOP START_STOP
ULONG DataSetRangesLength
#define IOCTL_STORAGE_RESERVE
UNICODE_STRING DeviceName
#define TEST_FLAG(Flags, Bit)
FORCEINLINE VOID SrbSetCdbLength(_In_ PVOID Srb, _In_ UCHAR CdbLength)
ULONG ParameterBlockLength
#define IOCTL_STORAGE_CHECK_VERIFY
#define IOCTL_STORAGE_QUERY_PROPERTY
struct _MOUNTDEV_UNIQUE_ID MOUNTDEV_UNIQUE_ID
#define DeviceDsmAction_Allocation
#define NT_SUCCESS(StatCode)
#define IOCTL_STORAGE_PERSISTENT_RESERVE_IN
#define IOCTL_STORAGE_MANAGE_DATA_SET_ATTRIBUTES
#define CLASSP_REG_WRITE_CACHE_VALUE_NAME
FORCEINLINE VOID SrbSetTimeOutValue(_In_ PVOID Srb, _In_ ULONG TimeOutValue)
PSTORAGE_ADAPTER_DESCRIPTOR AdapterDescriptor
UNICODE_STRING MountedDeviceInterfaceName
PDEVICE_OBJECT DeviceObject
#define IOCTL_STORAGE_LOAD_MEDIA2
KEVENT EjectSynchronizationEvent
#define STORAGE_ADDRESS_TYPE_BTL8
struct _SCSI_REQUEST_BLOCK SCSI_REQUEST_BLOCK
#define ExAllocatePoolWithTag(hernya, size, tag)
#define IOCTL_STORAGE_FIRMWARE_GET_INFO
FORCEINLINE VOID SrbSetRequestAttribute(_In_ PVOID Srb, _In_ UCHAR RequestAttribute)
struct _STORAGE_DEVICE_NUMBER STORAGE_DEVICE_NUMBER
NTSYSAPI NTSTATUS WINAPI RtlDeleteRegistryValue(ULONG, PCWSTR, PCWSTR)
#define STATUS_INVALID_PARAMETER_1
#define KeEnterCriticalRegion()
#define IOCTL_STORAGE_CHECK_VERIFY2
#define RTL_REGISTRY_ABSOLUTE
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
#define STATUS_FILES_OPEN
#define IOCTL_STORAGE_EVENT_NOTIFICATION
#define TRACE_LEVEL_ERROR
#define TRACE_LEVEL_WARNING
#define DBGGETIOCTLSTR(_ioctl)
#define IOCTL_SCSI_PASS_THROUGH
#define DeviceDsmAction_OffloadRead
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
VOID NTAPI IoInvalidateDeviceRelations(IN PDEVICE_OBJECT DeviceObject, IN DEVICE_RELATION_TYPE Type)
#define KeLeaveCriticalRegion()
struct _MOUNTDEV_SUGGESTED_LINK_NAME MOUNTDEV_SUGGESTED_LINK_NAME
#define STATUS_BUFFER_OVERFLOW
#define IOCTL_SCSI_PASS_THROUGH_DIRECT
NTSTATUS ClasspDeviceLBProvisioningProperty(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp, _Inout_ PSCSI_REQUEST_BLOCK Srb)
#define IOCTL_MOUNTDEV_QUERY_SUGGESTED_LINK_NAME
NTSTATUS ClasspMcnControl(IN PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, IN PIRP Irp, IN PSCSI_REQUEST_BLOCK Srb)
#define RTL_QUERY_REGISTRY_TYPECHECK_SHIFT
struct _CDB::_CDB6GENERIC CDB6GENERIC
#define STATUS_DEVICE_BUSY
#define FIELD_OFFSET(t, f)
#define SRB_SIMPLE_TAG_REQUEST
#define IOCTL_STORAGE_LOAD_MEDIA
PDEVICE_OBJECT LowerDeviceObject
NTSTATUS NTAPI IoCallDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define IOCTL_STORAGE_FIRMWARE_DOWNLOAD
#define CLASSP_REG_REMOVAL_POLICY_VALUE_NAME
#define SRB_FUNCTION_EXECUTE_SCSI
#define FDO_HACK_NO_RESERVE6
NTSTATUS ClassDeviceHwFirmwareDownloadProcess(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp, _Inout_ PSCSI_REQUEST_BLOCK Srb)
NTSTATUS ClassDeviceHwFirmwareGetInfoProcess(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp)
FORCEINLINE VOID SrbSetSrbFlags(_In_ PVOID Srb, _In_ ULONG Flags)
#define RtlZeroMemory(Destination, Length)
#define RtlCopyMemory(Destination, Source, Length)
PIRP NTAPI IoAllocateIrp(IN CCHAR StackSize, IN BOOLEAN ChargeQuota)
BOOLEAN UseOnlyIfThereAreNoOtherLinks
SCSIPORT_API NTSTATUS NTAPI ClassSendSrbAsynchronous(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PSCSI_REQUEST_BLOCK Srb, _In_ PIRP Irp, _In_reads_bytes_opt_(BufferLength) __drv_aliasesMem PVOID BufferAddress, _In_ ULONG BufferLength, _In_ BOOLEAN WriteToDevice)
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
NTSTATUS ClasspDeviceTrimProperty(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _Inout_ PSCSI_REQUEST_BLOCK Srb)
#define RTL_QUERY_REGISTRY_REQUIRED
VOID NTAPI ClassCompleteRequest(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_ CCHAR PriorityBoost)
static SERVICE_STATUS status
#define IOCTL_STORAGE_BASE
FORCEINLINE VOID IoSetNextIrpStackLocation(_Inout_ PIRP Irp)
BOOLEAN IsCachedDriveCapDataValid
#define SCSIOP_START_STOP_UNIT
struct _STORAGE_HOTPLUG_INFO STORAGE_HOTPLUG_INFO
LARGE_INTEGER LogicalBlockAddress
#define RTL_QUERY_REGISTRY_DIRECT
#define REVERSE_BYTES_QUAD(Destination, Source)
NTSTATUS ClasspDuidQueryProperty(PDEVICE_OBJECT DeviceObject, PIRP Irp)
#define SRB_FLAGS_QUEUE_ACTION_ENABLE
#define IOCTL_STORAGE_READ_CAPACITY