c # USB-разбор пакета _URB_BULK_OR_INTERRUPT_TRANSFER - PullRequest
0 голосов
/ 07 октября 2011

Я анализирую пакет _URB_BULK_OR_INTERRUPT_TRANSFER, как определено в http://msdn.microsoft.com/en-us/library/windows/hardware/ff540352(v=vs.85).aspx, используя следующий код:

            //parse URB Packet
            /*
            _URB_HEADER {
            USHORT      Length;
            USHORT      Function;
            USBD_STATUS Status;
            PVOID       UsbdDeviceHandle;
            ULONG       UsbdFlags;
            }*/

            //start header parse
            UInt16 urb_length = rdr.ReadUInt16();
            UInt16 urb_function = rdr.ReadUInt16();
            UInt32 urb_status = rdr.ReadUInt32();
            rdr.ReadBytes(System.IntPtr.Size);
            UInt32 UsbdFlags = rdr.ReadUInt32();
            //end header parse

            //.. skip code to check if it a _URB_BULK_OR_INTERRUPT_TRANSFER 
            // but assuming it is parse it

            /*struct _URB_BULK_OR_INTERRUPT_TRANSFER {
            struct URB_HEADER  Hdr;//covered above
            USBD_PIPE_HANDLE    PipeHandle;
            ULONG               TransferFlags;
            ULONG               TransferBufferLength;
            PVOID               TransferBuffer;
            PMDL                TransferBufferMDL;
            struct URB  *UrbLink;
            struct URB_HCD_AREA  hca;
            }*/

            rdr.ReadBytes(System.IntPtr.Size);
            UInt32 TransferFlags = rdr.ReadUInt32();
            UInt32 TransferBufferLength = rdr.ReadUInt32();
            byte[] ptr_bytes = rdr.ReadBytes(System.IntPtr.Size);
            System.IntPtr ptr_transfer_buffer = new System.IntPtr(BitConverter.ToUInt32(ptr_bytes, 0));
            ptr_bytes = rdr.ReadBytes(System.IntPtr.Size);
            System.IntPtr mdl_transfer_buffer = new System.IntPtr(BitConverter.ToUInt32(ptr_bytes, 0))

Проверка всех значений во время их чтения, большинство из них кажется разумным до PMDLпустой указательВ результате получается большое отрицательное число вместо 0 (NULL) или действительный адрес.Кто-нибудь может указать мне правильное направление относительно того, почему это может происходить?Благодарю.

Ответы [ 2 ]

1 голос
/ 07 октября 2011

MDL-объекты - это дескрипторы памяти, используемые только в режиме ядра.Из-за разделения режима пользователь / ядро ​​виртуальные адреса более 2 ГБ в системах x86 (без переключателя 3 ГБ) находятся в виртуальном адресном пространстве ядра.

1 голос
/ 07 октября 2011

Я не совсем понимаю ваш вопрос ... TransferBufferMDL используется в случаях DirectIO, тогда как TransferBuffer предназначен для буферизованного ввода-вывода.

Так что один из этих двух всегда будет недействительным.

Надеюсьэто помогает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...