Прив, делаю эмулятор железки - флешка (LUN 0) + CdRom (LUN 1). Обрабатываю IOCTL_INTERNAL_USB_SUBMIT_URB и в нем URB_FUNCTION_CLASS_INTERFACE, который сообщает кол-во LUN для девайса. Код (C): #define MAX_LUN 1 // LUN 0 (flash) and LUN 1 (cdrom) #define GET_MAX_LUN 0xFE #define MASS_STORAGE_RESET 0xFF #define LUN_DATA_LENGTH 1 ..... case URB_FUNCTION_CLASS_INTERFACE: { ULONG ii=MAX_LUN; DbgPrint("URB_FUNCTION_CLASS_INTERFACE %.08x\n", urb->UrbControlVendorClassRequest.Request); if (urb->UrbControlVendorClassRequest.Request == GET_MAX_LUN) { memcpy(urb->UrbControlTransfer.TransferBuffer, &ii, LUN_DATA_LENGTH); } urb->UrbControlTransfer.TransferBufferLength = LUN_DATA_LENGTH; status = STATUS_SUCCESS; URB_STATUS(urb) = USBD_STATUS_SUCCESS; Irp->IoStatus.Information = urb->UrbControlTransfer.TransferBufferLength; } break; Получаю, что система воспринимает только LUN 0 - только ОДНО логическое устройство. Соответственно все вызовы через URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER к MassStorage идут только к LUN 0. порылся в ХПишном usbstor.sys и походу еще что-то ось проверяет. Пока не пойму что. Код (C): NTSTATUS __stdcall USBSTOR_FdoStartDevice(PDEVICE_OBJECT DeviceObject, PIRP Irp) { _DWORD *DeviceExtension; // esi NTSTATUS iErr; // edi PIO_WORKITEM v5; // eax _USB_DEVICE_DESCRIPTOR *DeviceDescriptor; // eax _USB_INTERFACE_DESCRIPTOR *interfaceDesc; // eax bool v9; // zf _IRP *v10; // ecx int v12; // [esp+Ch] [ebp-28h] int v13; // [esp+10h] [ebp-24h] int (__stdcall *v14)(int); // [esp+2Ch] [ebp-8h] _BYTE tmpLun; // [esp+30h] [ebp-4h] DeviceExtension = DeviceObject->DeviceExtension; iErr = USBSTOR_SyncPassDownIrp(DeviceObject, Irp); if ( iErr >= 0 ) { if ( DeviceExtension[38] || (v5 = IoAllocateWorkItem(DevObj), (DeviceExtension[38] = v5) != 0) ) { if ( !DeviceExtension[6] ) { iErr = USBSTOR_GetDescriptors(DeviceObject); if ( iErr < 0 ) goto LABEL_30; USBSTOR_QueryGlobalFdoParams(DeviceObject); } iErr = USBSTOR_SelectConfiguration(DeviceObject); if ( iErr >= 0 ) { interfaceDesc = (_USB_INTERFACE_DESCRIPTOR *)DeviceExtension[8]; if ( interfaceDesc->bInterfaceClass == 8 && interfaceDesc->bInterfaceProtocol == 80 && !DeviceExtension[20] ) DeviceExtension[20] = 1; iErr = USBSTOR_GetPipes(DeviceObject); if ( iErr >= 0 ) { DeviceDescriptor = (_USB_DEVICE_DESCRIPTOR *)DeviceExtension[6]; if ( DeviceDescriptor->idVendor == 1403 && !DeviceDescriptor->idProduct && DeviceDescriptor->bcdDevice < 0x128u ) { DeviceExtension[23] |= 1u; } IoStartTimer(DeviceObject); if ( (_DWORD *)DeviceExtension[4] == DeviceExtension + 4 ) { interfaceDesc = (_USB_INTERFACE_DESCRIPTOR *)DeviceExtension[8]; HIBYTE(DeviceObject) = 0; if ( interfaceDesc->bInterfaceClass == 8 && interfaceDesc->bInterfaceProtocol == 80 && USBSTOR_GetMaxLun(DeviceObject, (unsigned __int8 *)&DeviceObject + 3) >= 0 && !DeviceExtension[9] ) <<<<< ТУТ ??? { HIBYTE(DeviceObject) = 0; } tmpLun = 0; while ( 1 ) { iErr = USBSTOR_CreateChildPDO(DeviceObject, tmpLun); if ( iErr < 0 ) break; if ( (unsigned __int8)++tmpLun > HIBYTE(DeviceObject) ) goto LABEL_27; } } else { LABEL_27: if ( USBSTOR_GetBusInterface(DeviceObject, (int)&v12) < 0 ) *((_BYTE *)DeviceExtension + 841) = 0; else *((_BYTE *)DeviceExtension + 841) = v14(v13); } } } } else { iErr = 0xC000009A; } } LABEL_30: v10 = Irp; Irp->IoStatus.Status = iErr; IofCompleteRequest(v10, 0); return iErr; } Может кто сталкивался с подобным?