23 if (InquiryData->DeviceType == 0)
35 switch (InquiryData->DeviceType)
75 if (InquiryData->DeviceType == 0)
87 switch (InquiryData->DeviceType)
92 return "GenSequential";
117 return "UsbstorOther";
185 CHAR LocalBuffer[26];
194 ASSERT(DeviceExtension->InquiryData);
195 InquiryData = DeviceExtension->InquiryData;
197 switch (IoStack->
Parameters.QueryDeviceText.DeviceTextType)
202 DPRINT(
"USBSTOR_PdoHandleQueryDeviceText\n");
205 LocalBuffer[
Offset++] =
' ';
207 LocalBuffer[
Offset++] =
'\0';
216 Irp->IoStatus.Information = 0;
227 Irp->IoStatus.Information = 0;
228 return Irp->IoStatus.Status;
248 ASSERT(DeviceExtension->InquiryData);
249 InquiryData = DeviceExtension->InquiryData;
271 Irp->IoStatus.Information = 0;
299 ASSERT(ResultBufferLength);
300 ASSERT(ResultBufferLength > ResultBufferOffset);
302 DPRINT(
"ResultBufferOffset %lu ResultBufferLength %lu Buffer %s Length %lu\n", ResultBufferOffset, ResultBufferLength,
Buffer,
strlen(
Buffer));
307 DeviceString.
MaximumLength = (ResultBufferLength - ResultBufferOffset) *
sizeof(
WCHAR);
316 ResultBufferLength -= (DeviceString.
Length +
sizeof(
WCHAR)) /
sizeof(
WCHAR);
317 ResultBufferOffset += (DeviceString.
Length +
sizeof(
WCHAR)) /
sizeof(
WCHAR);
319 *NewResultBufferOffset = ResultBufferOffset;
331 CHAR Id1[50], Id2[50], Id3[50], Id4[50], Id5[50], Id6[50];
332 ULONG Id1Length, Id2Length, Id3Length, Id4Length, Id5Length,Id6Length;
338 ASSERT(FDODeviceExtension->DeviceDescriptor);
339 InquiryData = PDODeviceExtension->InquiryData;
355 Id1Length =
strlen(Id1) + 1;
356 DPRINT(
"USBSTOR_PdoHandleQueryHardwareId HardwareId1 %s\n", Id1);
366 Id2Length =
strlen(Id2) + 1;
367 DPRINT(
"USBSTOR_PdoHandleQueryHardwareId HardwareId2 %s\n", Id2);
376 Id3Length =
strlen(Id3) + 1;
377 DPRINT(
"USBSTOR_PdoHandleQueryHardwareId HardwareId3 %s\n", Id3);
388 Id4Length =
strlen(Id4) + 1;
389 DPRINT(
"USBSTOR_PdoHandleQueryHardwareId HardwareId4 %s\n", Id4);
397 Id5Length =
strlen(Id5) + 1;
398 DPRINT(
"USBSTOR_PdoHandleQueryHardwareId HardwareId5 %s\n", Id5);
405 Id6Length =
strlen(Id6) + 1;
406 DPRINT(
"USBSTOR_PdoHandleQueryHardwareId HardwareId6 %s\n", Id6);
408 TotalLength = Id1Length + Id2Length + Id3Length + Id4Length + Id5Length + Id6Length + 1;
413 Irp->IoStatus.Information = 0;
448 ASSERT(FDODeviceExtension->DeviceDescriptor);
458 Irp->IoStatus.Information = 0;
486 if (FDODeviceExtension->SerialNumber)
489 swprintf(
Buffer,
L"%s&%c", FDODeviceExtension->SerialNumber->bString, PDODeviceExtension->LUN);
494 swprintf(
Buffer,
L"%04lu&%c", FDODeviceExtension->InstanceCount, PDODeviceExtension->LUN);
502 Irp->IoStatus.Information = 0;
522 DPRINT(
"USBSTOR_PdoHandleDeviceRelations\n");
530 return Irp->IoStatus.Status;
534 if (!DeviceRelations)
540 DeviceRelations->
Count = 1;
598 DPRINT1(
"USBSTOR_PdoHandlePnp: IRP_MN_QUERY_ID IdType %x unimplemented\n", IoStack->
Parameters.QueryId.IdType);
600 Irp->IoStatus.Information = 0;
605 DPRINT(
"IRP_MN_REMOVE_DEVICE\n");
607 if(*DeviceExtension->PDODeviceObject !=
NULL)
609 *DeviceExtension->PDODeviceObject =
NULL;
619 ASSERT(DeviceExtension->InquiryData);
641 Caps->UniqueID =
FALSE;
642 Caps->Removable =
TRUE;
653 if (DeviceExtension->Claimed)
659 DPRINT1(
"[USBSTOR] Request %x fails because device is still claimed\n", IoStack->
MinorFunction);
729 DPRINT(
"USBSTOR_SendInternalCdb SCSIOP %x\n", Cdb->CDB6GENERIC.OperationCode);
744 *OutDataTransferLength,
776 Srb->CdbLength = CdbLength;
779 Srb->DataTransferLength = *OutDataTransferLength;
780 Srb->TimeOutValue = TimeOutValue;
781 Srb->DataBuffer = OutDataBuffer;
782 Srb->SenseInfoBuffer = SenseBuffer;
786 Irp->MdlAddress = Mdl;
815 *OutDataTransferLength =
Srb->DataTransferLength;
891 PDODeviceExtension->InquiryData = InquiryData;
924 PDODeviceExtension->PDODeviceObject = &FDODeviceExtension->ChildPDO[LUN];
925 PDODeviceExtension->Self = PDO;
926 PDODeviceExtension->LUN = LUN;
934 FDODeviceExtension->ChildPDO[LUN] = PDO;
946 PDODeviceExtension->IsFloppy =
FALSE;
#define DO_DEVICE_INITIALIZING
NTSYSAPI VOID NTAPI RtlCopyMemory(VOID UNALIGNED *Destination, CONST VOID UNALIGNED *Source, ULONG Length)
#define IRP_MN_REMOVE_DEVICE
#define STATUS_INSUFFICIENT_RESOURCES
VOID USBSTOR_ConvertToUnicodeString(IN CHAR *Buffer, IN ULONG ResultBufferLength, IN ULONG ResultBufferOffset, OUT LPWSTR ResultBuffer, OUT PULONG NewResultBufferOffset)
UCHAR ProductRevisionLevel[4]
NTSTATUS USBSTOR_PdoHandleDeviceRelations(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp)
#define STATUS_MORE_PROCESSING_REQUIRED
ACPI_SIZE strlen(const char *String)
#define SRB_FLAGS_NO_QUEUE_FREEZE
PDEVICE_OBJECT Objects[1]
static ULONG CopyField(IN PUCHAR Name, IN PCHAR Buffer, IN ULONG MaxLength)
VOID NTAPI MmBuildMdlForNonPagedPool(IN PMDL Mdl)
PVOID AllocateItem(IN POOL_TYPE PoolType, IN SIZE_T NumberOfBytes)
NTSTATUS USBSTOR_PdoHandleQueryDeviceText(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
struct _PDO_DEVICE_EXTENSION * PPDO_DEVICE_EXTENSION
#define FILE_DEVICE_MASS_STORAGE
#define SRB_FLAGS_DATA_IN
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)
#define SRB_STATUS(Status)
#define SENSE_BUFFER_SIZE
struct _FDO_DEVICE_EXTENSION * PFDO_DEVICE_EXTENSION
LPCSTR USBSTOR_GetDeviceType(IN PINQUIRYDATA InquiryData, IN UCHAR IsFloppy)
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
NTSYSAPI VOID NTAPI RtlInitAnsiString(PANSI_STRING DestinationString, PCSZ SourceString)
#define sprintf(buf, format,...)
NTSTATUS USBSTOR_PdoHandleQueryDeviceId(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
_In_ ULONG _In_ ULONG Offset
#define IRP_MN_QUERY_REMOVE_DEVICE
LPCSTR USBSTOR_GetGenericType(IN PINQUIRYDATA InquiryData, IN UCHAR IsFloppy)
_In_ PVOID _In_ ULONG Event
_Must_inspect_result_ _In_opt_ PVOID _In_opt_ PVOID InstanceId
struct _DEVICE_RELATIONS * PDEVICE_RELATIONS
static NTSTATUS USBSTOR_SendInternalCdb(IN PDEVICE_OBJECT PdoDevice, IN PCDB Cdb, IN UCHAR CdbLength, IN ULONG TimeOutValue, OUT PVOID OutDataBuffer, OUT PULONG OutDataTransferLength)
#define INQUIRYDATABUFFERSIZE
#define IoCompleteRequest
NTSTATUS NTAPI USBSTOR_SyncForwardIrp(PDEVICE_OBJECT DeviceObject, PIRP Irp)
NTSTATUS USBSTOR_PdoHandleQueryInstanceId(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp)
COMMON_DEVICE_EXTENSION Common
#define FILE_AUTOGENERATED_DEVICE_NAME
#define IRP_MN_QUERY_STOP_DEVICE
#define DIRECT_ACCESS_DEVICE
_Must_inspect_result_ _In_ PDEVICE_DESCRIPTION DeviceDescription
static ULONG CopyFieldTruncate(IN PUCHAR Name, IN PCHAR Buffer, IN ULONG MaxLength)
#define IRP_MN_SURPRISE_REMOVAL
#define CDB6GENERIC_LENGTH
NTSTATUS USBSTOR_PdoHandlePnp(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp)
#define NT_SUCCESS(StatCode)
#define swprintf(buf, format,...)
#define IRP_MN_START_DEVICE
static const UCHAR Index[8]
#define IRP_MN_QUERY_DEVICE_TEXT
#define IRP_MJ_INTERNAL_DEVICE_CONTROL
_In_ ULONG _In_ ULONG _In_ ULONG Length
#define SRB_STATUS_DATA_OVERRUN
struct _SCSI_REQUEST_BLOCK SCSI_REQUEST_BLOCK
VOID NTAPI IoFreeMdl(PMDL Mdl)
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define STATUS_UNSUCCESSFUL
#define ExAllocatePoolWithTag(hernya, size, tag)
NTSTATUS USBSTOR_PdoHandleQueryCompatibleId(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp)
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
NTSTATUS USBSTOR_PdoHandleQueryHardwareId(IN PDEVICE_OBJECT DeviceObject, IN OUT PIRP Irp)
PMDL NTAPI IoAllocateMdl(IN PVOID VirtualAddress, IN ULONG Length, IN BOOLEAN SecondaryBuffer, IN BOOLEAN ChargeQuota, IN PIRP Irp)
IN PDEVICE_OBJECT DeviceObject
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
#define KeInitializeEvent(pEvt, foo, foo2)
NTSYSAPI NTSTATUS NTAPI RtlAnsiStringToUnicodeString(PUNICODE_STRING DestinationString, PANSI_STRING SourceString, BOOLEAN AllocateDestinationString)
NTSTATUS NTAPI IoCallDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define IRP_MN_QUERY_DEVICE_RELATIONS
#define READ_ONLY_DIRECT_ACCESS_DEVICE
NTSTATUS USBSTOR_CreatePDO(IN PDEVICE_OBJECT DeviceObject, IN UCHAR LUN)
#define ObReferenceObject
VOID NTAPI IoFreeIrp(IN PIRP Irp)
#define SRB_FUNCTION_EXECUTE_SCSI
NTSTATUS NTAPI USBSTOR_SyncCompletionRoutine(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Ctx)
#define STATUS_NOT_SUPPORTED
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
#define RtlZeroMemory(Destination, Length)
#define SRB_STATUS_SUCCESS
PIRP NTAPI IoAllocateIrp(IN CCHAR StackSize, IN BOOLEAN ChargeQuota)
#define FILE_DEVICE_SECURE_OPEN
#define ExFreePoolWithTag(_P, _T)
struct _CDB::_CDB6INQUIRY CDB6INQUIRY
static NTSTATUS USBSTOR_FillInquiryData(IN PDEVICE_OBJECT PDODeviceObject)
IN PSCSI_REQUEST_BLOCK Srb
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
IN BOOLEAN OUT PSTR Buffer
PKMT_RESULTBUFFER ResultBuffer
size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
#define IRP_MN_QUERY_CAPABILITIES