Сейчас на форуме: jinoweb (+6 невидимых)

 eXeL@B —› Программирование —› LUN больше одного - непонятка
Посл.ответ Сообщение

Ранг: 397.0 (мудрец), 179thx
Активность: 0.170.1
Статус: Участник

Создано: 09 января 2019 18:43 · Поправил: BfoX
· Личное сообщение · #1

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

Code:
  1. #define MAX_LUN 1 // LUN 0 (flash) and LUN 1 (cdrom)
  2. #define GET_MAX_LUN 0xFE
  3. #define MASS_STORAGE_RESET 0xFF
  4. #define LUN_DATA_LENGTH 1
  5. .....
  6.  
  7. case URB_FUNCTION_CLASS_INTERFACE:
  8.       {
  9.              ULONG ii=MAX_LUN;
  10.              DbgPrint("URB_FUNCTION_CLASS_INTERFACE %.08x\n", urb->UrbControlVendorClassRequest.Request);
  11.              if (urb->UrbControlVendorClassRequest.Request == GET_MAX_LUN)
  12.              {
  13.                memcpy(urb->UrbControlTransfer.TransferBuffer, &ii, LUN_DATA_LENGTH);
  14.              }
  15.  
  16.              urb->UrbControlTransfer.TransferBufferLength = LUN_DATA_LENGTH;
  17.  
  18.              status = STATUS_SUCCESS;
  19.              URB_STATUS(urb) = USBD_STATUS_SUCCESS;
  20.              Irp->IoStatus.Information = urb->UrbControlTransfer.TransferBufferLength;
  21.            }
  22.            break;



Получаю, что система воспринимает только LUN 0 - только ОДНО логическое устройство.
Соответственно все вызовы через URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER к MassStorage идут только к LUN 0.

порылся в ХПишном usbstor.sys и походу еще что-то ось проверяет. Пока не пойму что.

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


Может кто сталкивался с подобным?

-----
...или ты работаешь хорошо, или ты работаешь много...





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 09 января 2019 21:17
· Личное сообщение · #2

серийник нужно как минимум



Ранг: 590.6 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 09 января 2019 21:24
· Личное сообщение · #3

CARE что ли? Не проще sticklib.dll запатчить?

-----
старый пень




Ранг: 397.0 (мудрец), 179thx
Активность: 0.170.1
Статус: Участник

Создано: 09 января 2019 21:28 · Поправил: BfoX
· Личное сообщение · #4

Добавлено спустя 1 минуту
r_e пишет:
CARE


если эмуль не пропрет - придется.

Добавлено спустя 8 минут
reversecode пишет:
серийник нужно


с серийником все передается. вопрос у меня во втором блоке кода (выше) строка 52.
rip


Code:
  1.            if ( interfaceDesc->bInterfaceClass == 8
  2.               && interfaceDesc->bInterfaceProtocol == 80
  3.               && USBSTOR_GetMaxLun(DeviceObject, (unsigned __int8 *)&DeviceObject + 3) >= 0
  4.               && !DeviceExtension[9] )    <<<<< ТУТ ???
  5.             {
  6.               HIBYTE(DeviceObject) = 0; <<<<< Это значение MAX_LUN
  7.             }


-----
...или ты работаешь хорошо, или ты работаешь много...





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 09 января 2019 21:39
· Личное сообщение · #5

тогда остается подгрузить символы и посмотреть что там в девайс екстенсион
сис зашарь



Ранг: 397.0 (мудрец), 179thx
Активность: 0.170.1
Статус: Участник

Создано: 09 января 2019 22:06
· Личное сообщение · #6

reversecode пишет:
сис зашарь



585c_09.01.2019_EXELAB.rU.tgz - usbstor_xp.zip

-----
...или ты работаешь хорошо, или ты работаешь много...





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 09 января 2019 22:46
· Личное сообщение · #7

Code:
  1.             if ( v9
  2.               && _v8->bInterfaceProtocol == 80
  3.               && USBSTOR_GetMaxLun(v2, (unsigned __int8 *)&DeviceObject + 3) >= 0
  4.               && !extv3->PP_EEEEEEEEEEEEEEEEEEE_field_24 )
  5.             {
  6.               HIBYTE(DeviceObject) = 0;
  7.             }
  8.  

Code:
  1. NTSTATUS __stdcall USBSTOR_Scsi(PDEVICE_OBJECT a1, PIRP Irp)
  2. {
  3.   Extension *v2; // edi
  4.   _IO_STACK_LOCATION *v3; // ebx
  5.   _SCSI_REQUEST_BLOCK *v4; // esi
  6.   NTSTATUS v5; // edi
  7.   _IRP *v7; // eax
  8.   bool v8; // zf
  9.   ULONG *v9; // esi
  10.  
  11.   v2 = a1->DeviceExtension;
  12.   if ( v2->NAME_field_0 != '!ODP' )
  13.     goto LABEL_9;
  14.   v3 = Irp->Tail.Overlay.CurrentStackLocation;
  15.   v4 = v3->Parameters.Scsi.Srb;
  16.   if ( v4->Function )
  17.   {
  18.     switch ( v4->Function )
  19.     {
  20.       case 1u:                                  // SRB_FUNCTION_CLAIM_DEVICE 
  21.         if ( v2->PP_EEEEEEEEEEEEEEEEEEE_field_24 )
  22.         {
  23.           v5 = 0x80000011;
  24.           v4->SrbStatus = 5;
  25.           goto LABEL_10;
  26.         }
  27.         v2->PP_EEEEEEEEEEEEEEEEEEE_field_24 = 1;
  28.         v4->DataBuffer = a1;
  29.         break;
  30.       case 4u:                                  // SRB_FUNCTION_RELEASE_QUEUE 
  31.         v7 = (_IRP *)UsbQueueRelease((PKSPIN_LOCK)&v2->WWWfield_4C);
  32.         if ( v7 )
  33.           IoStartPacket(
  34.             v2->TAR_field_8,
  35.             v7,
  36.             (PULONG)(*(_DWORD *)(v7->Tail.Overlay.PacketType + 4) + 44),
  37.             USBSTOR_CancelIo);
  38.         break;
  39.       case 6u:                                  // SRB_FUNCTION_RELEASE_DEVICE
  40.         v2->PP_EEEEEEEEEEEEEEEEEEE_field_24 = 0;
  41.         break;
  42.       default:
  43. .....



 eXeL@B —› Программирование —› LUN больше одного - непонятка
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати