LUN больше одного - непонятка

Тема в разделе "WASM.NT.KERNEL", создана пользователем FoxB, 25 дек 2018.

  1. FoxB

    FoxB Member

    Публикаций:
    0
    Регистрация:
    10 июл 2003
    Сообщения:
    105
    Прив, делаю эмулятор железки - флешка (LUN 0) + CdRom (LUN 1). Обрабатываю IOCTL_INTERNAL_USB_SUBMIT_URB и в нем URB_FUNCTION_CLASS_INTERFACE, который сообщает кол-во LUN для девайса.

    Код (C):
    1.  
    2.  #define MAX_LUN 1 // LUN 0 (flash) and LUN 1 (cdrom)
    3.  #define GET_MAX_LUN 0xFE
    4.  #define MASS_STORAGE_RESET 0xFF
    5. #define LUN_DATA_LENGTH 1
    6. .....
    7.  
    8. case URB_FUNCTION_CLASS_INTERFACE:
    9.            {
    10.              ULONG ii=MAX_LUN;
    11.              DbgPrint("URB_FUNCTION_CLASS_INTERFACE %.08x\n", urb->UrbControlVendorClassRequest.Request);
    12.              if (urb->UrbControlVendorClassRequest.Request == GET_MAX_LUN)
    13.              {
    14.                memcpy(urb->UrbControlTransfer.TransferBuffer, &ii, LUN_DATA_LENGTH);
    15.              }
    16.  
    17.              urb->UrbControlTransfer.TransferBufferLength = LUN_DATA_LENGTH;
    18.  
    19.              status = STATUS_SUCCESS;
    20.              URB_STATUS(urb) = USBD_STATUS_SUCCESS;
    21.              Irp->IoStatus.Information = urb->UrbControlTransfer.TransferBufferLength;
    22.            }
    23.            break;
    24.  
    Получаю, что система воспринимает только LUN 0 - только ОДНО логическое устройство.
    Соответственно все вызовы через URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER к MassStorage идут только к LUN 0.

    порылся в ХПишном usbstor.sys и походу еще что-то ось проверяет. Пока не пойму что.
    Код (C):
    1.  
    2. NTSTATUS __stdcall USBSTOR_FdoStartDevice(PDEVICE_OBJECT DeviceObject, PIRP Irp)
    3. {
    4.   _DWORD *DeviceExtension; // esi
    5.   NTSTATUS iErr; // edi
    6.   PIO_WORKITEM v5; // eax
    7.   _USB_DEVICE_DESCRIPTOR *DeviceDescriptor; // eax
    8.   _USB_INTERFACE_DESCRIPTOR *interfaceDesc; // eax
    9.   bool v9; // zf
    10.   _IRP *v10; // ecx
    11.   int v12; // [esp+Ch] [ebp-28h]
    12.   int v13; // [esp+10h] [ebp-24h]
    13.   int (__stdcall *v14)(int); // [esp+2Ch] [ebp-8h]
    14.   _BYTE tmpLun; // [esp+30h] [ebp-4h]
    15.  
    16.   DeviceExtension = DeviceObject->DeviceExtension;
    17.   iErr = USBSTOR_SyncPassDownIrp(DeviceObject, Irp);
    18.   if ( iErr >= 0 )
    19.   {
    20.   if ( DeviceExtension[38] || (v5 = IoAllocateWorkItem(DevObj), (DeviceExtension[38] = v5) != 0) )
    21.   {
    22.   if ( !DeviceExtension[6] )
    23.   {
    24.   iErr = USBSTOR_GetDescriptors(DeviceObject);
    25.   if ( iErr < 0 )
    26.   goto LABEL_30;
    27.   USBSTOR_QueryGlobalFdoParams(DeviceObject);
    28.   }
    29.   iErr = USBSTOR_SelectConfiguration(DeviceObject);
    30.   if ( iErr >= 0 )
    31.   {
    32.   interfaceDesc = (_USB_INTERFACE_DESCRIPTOR *)DeviceExtension[8];
    33.   if ( interfaceDesc->bInterfaceClass == 8 && interfaceDesc->bInterfaceProtocol == 80 && !DeviceExtension[20] )
    34.   DeviceExtension[20] = 1;
    35.   iErr = USBSTOR_GetPipes(DeviceObject);
    36.   if ( iErr >= 0 )
    37.   {
    38.   DeviceDescriptor = (_USB_DEVICE_DESCRIPTOR *)DeviceExtension[6];
    39.   if ( DeviceDescriptor->idVendor == 1403
    40.   && !DeviceDescriptor->idProduct
    41.   && DeviceDescriptor->bcdDevice < 0x128u )
    42.   {
    43.   DeviceExtension[23] |= 1u;
    44.   }
    45.   IoStartTimer(DeviceObject);
    46.   if ( (_DWORD *)DeviceExtension[4] == DeviceExtension + 4 )
    47.   {
    48.   interfaceDesc = (_USB_INTERFACE_DESCRIPTOR *)DeviceExtension[8];
    49.   HIBYTE(DeviceObject) = 0;
    50.   if ( interfaceDesc->bInterfaceClass == 8
    51.   && interfaceDesc->bInterfaceProtocol == 80
    52.   && USBSTOR_GetMaxLun(DeviceObject, (unsigned __int8 *)&DeviceObject + 3) >= 0
    53.   && !DeviceExtension[9] )  <<<<< ТУТ ???
    54.   {
    55.   HIBYTE(DeviceObject) = 0;
    56.   }
    57.   tmpLun = 0;
    58.   while ( 1 )
    59.   {
    60.   iErr = USBSTOR_CreateChildPDO(DeviceObject, tmpLun);
    61.   if ( iErr < 0 )
    62.   break;
    63.   if ( (unsigned __int8)++tmpLun > HIBYTE(DeviceObject) )
    64.   goto LABEL_27;
    65.   }
    66.   }
    67.   else
    68.   {
    69. LABEL_27:
    70.   if ( USBSTOR_GetBusInterface(DeviceObject, (int)&v12) < 0 )
    71.   *((_BYTE *)DeviceExtension + 841) = 0;
    72.   else
    73.   *((_BYTE *)DeviceExtension + 841) = v14(v13);
    74.   }
    75.   }
    76.   }
    77.   }
    78.   else
    79.   {
    80.   iErr = 0xC000009A;
    81.   }
    82.   }
    83. LABEL_30:
    84.   v10 = Irp;
    85.   Irp->IoStatus.Status = iErr;
    86.   IofCompleteRequest(v10, 0);
    87.   return iErr;
    88. }
    89.  
    Может кто сталкивался с подобным?
     
    Последнее редактирование: 9 янв 2019