Как я могу выполнить запись SCSI для непрерывного LBA, например, «0x0000 до 0x1000» - PullRequest
0 голосов
/ 02 апреля 2019

Журнал Бушаунда смутил меня.Журнал выглядит следующим образом.

//block a

{ 
    9 CMD 2a 00 00 00 00 00 00 00 80 00 WRITE 3317238.1.0
    9 CMD 2a 00 00 00 00 80 00 00 80 00 WRITE 3317239.1.0
    9 CMD 2a 00 00 00 01 00 00 00 80 00 WRITE 3317240.1.0
    9 CMD 2a 00 00 00 01 80 00 00 80 00 WRITE 3317241.1.0
    . . ~ . . for 32 times

    9 OUT 03 00 00 00 03 00 00 00 04 00 00 00 03 00 00 00 05 00 00 00 03 00 00 00 06 00 00 00 03 00 00 00 ................................ 3317238.2.0
    07 00 00 00 03 00 00 00 08 00 00 00 03 00 00 00 09 00 00 00 03 00 00 00 0a 00 00 00 03 00 00 00 ................................ 3317238.2.32
    0b 00 00 00 03 00 00 00 0c 00 00 00 03 00 00 00 0d 00 00 00 03 00 00 00 0e 00 00 00 03 00 00 00 ................................ 3317238.2.64
    0f 00 00 00 03 00 00 00 10 00 00 00 03 00 00 00 11 00 00 00 03 00 00 00 12 00 00 00 03 00 00 00 ................................ 3317238.2.96
    . . ~ . . for 1KB data 
}

//end of block a

Насколько мне известно, это запись данных в LBA от 0x0000 до 0x1000 в нескольких командах записи SCSI, или она завершается одной командой записи SCSI?

Я могу сделать SCSI записать 64 КБ на устройство.Журнал бушаунда выглядит следующим образом.

// block b

{
    13 CMD 2a 00 00 00 00 00 00 00 80 00 WRITE 394.1.0
    13 CMD 00 00 00 00 00 00 TEST UNIT READY 395.1.0
    13 OUT 7d 3b ef 84 7d 3b ef 84 7d 3b ef 84 7d 3b ef 84 7d 3b ef 84 7d 3b ef 84 7d 3b ef 84 7d 3b ef 84 .;...;...;...;...;...;...;...;.. 394.2.0
    7d 3b ef 84 7d 3b ef 84 7d 3b ef 84 7d 3b ef 84 7d 3b ef 84 7d 3b ef 84 7d 3b ef 84 7d 3b ef 84 .;...;...;...;...;...;...;...;.. 394.2.32
    7d 3b ef 84 7d 3b ef 84 7d 3b ef 84 7d 3b ef 84 7d 3b ef 84 7d 3b ef 84 7d 3b ef 84 7d 3b ef 84 .;...;...;...;...;...;...;...;.. 394.2.64
    7d 3b ef 84 7d 3b ef 84 7d 3b ef 84 7d 3b ef 84 7d 3b ef 84 7d 3b ef 84 7d 3b ef 84 7d 3b ef 84 .;...;...;...;...;...;...;...;.. 394.2.96
    . . ~ . . for 1KB data
}

//end of block b

Если я отправлю команды записи SCSI 32 раза, мой журнал будет блокироваться б 32 раза.

Я использую этот код в C # для выполненияSCSI напиши.Если len> 128, возвращается 0x57.Так что это ограничение в 64 КБ.

private Boolean SendCMD(byte OPCode, ref byte[] buf, long len, long addr, ref int errorCode)
{
    bool result = false;
    SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER sptwb = null;
    sptwb = new SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER((UInt32)(len * 512));
    sptwb.sptd.Cdb[1] = 0x00;
    sptwb.sptd.Cdb[2] = (byte)((addr >> 24) & 0xFF);    // MSB of lba
    sptwb.sptd.Cdb[3] = (byte)((addr >> 16) & 0xFF);
    sptwb.sptd.Cdb[4] = (byte)((addr >> 8) & 0xFF);
    sptwb.sptd.Cdb[5] = (byte)((addr) & 0xFF);          // LSB of lba
    sptwb.sptd.Cdb[6] = 0x00;
    sptwb.sptd.Cdb[7] = (byte)((len >> 8) & 0xFF);      // MSB of num blocks
    sptwb.sptd.Cdb[8] = (byte)((len) & 0xFF);           // LSB of num blocks
    sptwb.sptd.Cdb[9] = 0x00;

    sptwb.sptd.DataIn = SCSI_IOCTL_DATA_OUT;

    Marshal.Copy(buf, 0, ptrBuf, (int)(len * 512));

    sptwb.sptd.CdbLength = 10;
    sptwb.sptd.Cdb[0] = OPCode;
    sptwb.sptd.DataBuffer = ptrBuf;

    int outByte = 0;
    int inputSize = Marshal.SizeOf(typeof(SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER));

    IntPtr input = Marshal.AllocHGlobal(inputSize);
    Marshal.StructureToPtr(sptwb, input, true);

    result = DeviceIoControl(m_hDrive, IOCTL_SCSI_PASS_THROUGH_DIRECT, input, inputSize, input, inputSize, ref outByte, System.IntPtr.Zero);

    return result;
}

Есть ли способ отправить запись SCSI, как в блоке журнала a?Спасибо и признателен за вашу помощь!

Извините, может быть, я должен изменить свой вопрос.

Есть ли способ, которым я могу записать SD-карту с LBA 0x00000000 до конца LBA и отправить команду SCSI?Я могу отправить одну запись SCSI10 с данными не более MaximumTransferLength.Хотя я могу отправить много записей SCSI для выполнения операции полной записи на SD-карту, с точки зрения SD-карты это все еще не единственная операция множественной записи.Как я могу сделать запись больших данных (больше MaximumTransferLength) (это одна операция множественной записи на уровне SD-карты), посылая команду SCSI, как это делает журнал A?

...